素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

はてなキーワードを無効にするGreasemonkey

AutoPagerize対応およびコードのブラッシュアップ。(追記が長くなったから先頭のほうに最新版を置いてる)
removeKeywords.user.js:

// ==UserScript==
// @name removeKeywords
// @author http://d.hatena.ne.jp/javascripter/
// @namespace http://d.hatena.ne.jp/javascripter/
// @description はてなキーワードへの自動リンクを無効にします
// @include http://*.hatena.ne.jp/*
// @exclude http://h.hatena.ne.jp/*
// ==/UserScript==
(function(){
 function removeKeywords(docs){
  for(var i=0;i<docs.length;i++){
   var keywords=docs[i].getElementsByClassName('keyword');
   while(keywords.length > 0){
    keywords[0].parentNode.replaceChild(keywords[0].firstChild,keywords[0]);
   }
  }
 }
 removeKeywords([document]);
 if(window.AutoPagerize) window.AutoPagerize.addFilter(removeKeywords);
})();

ここから一番初めに書いたコード

do{
var keywords=document.getElementsByClassName('keyword');
for(var i=0;i<keywords.length;i++){
keywords[i].parentNode.replaceChild(keywords[i].firstChild,keywords[i]);
}
}while(keywords.length!=0);

こまったこと:

  1. さっきのエントリーと同じような問題が発生した。removeChildじゃなくてreplaceChildでもうまくいかない。よくわからないからwhileで回しまくることにした。os0xさんに教えてもらったとおり、getElementsByClassNameは生きたノードリストだからwhileで毎回取ってこなくても自動で更新される。

だからこうすればいいようだ。

var keywords=document.getElementsByClassName('keyword');
while(keywords.length!=0){
for(var i=0;i<keywords.length;i++){
keywords[i].parentNode.replaceChild(keywords[i].firstChild,keywords[i]);
}
}

さらに追記:またまたos0xさんが華麗なソースを下さった。コメント欄参照。