はてなダイアリーのキーワード自動リンクは、単なる広告である。見るに値しない。これは前々から思っていたことである。考えてみれば、多くの日本人のプログラマが、はてなダイアリーを使っている。これは憂慮すべき問題だ。今さっき、ふと、自動リンクがうざいというつぶやきを見たので、自動リンクを消すChrome Extensionを作ることにした。一瞬で完成した。
思うに、このエクステンションは、小粒だが、価値がある。欲しがっている人は、かならずいるはずだ。そこで、今回は初めて、公開することにした。
また、ブックマークレットの形でも、提供することにした。これは、Selectors API Level 1と、Document Object Model (DOM) Level 3 Core Specificationと、Document Object Model Rangeをサポートしているブラウザならば、動くはずだ。ブックマークバーまで、ドラッグして登録すればいい。
content scriptはこうなっている。
(function(){ var list = document.querySelectorAll("a.keyword") ; var range = document.createRange() ; for ( var i = 0 ; i != list.length ; ++i ) { var node = list.item(i) ; var parent = node.parentNode ; range.selectNodeContents( node ) ; parent.replaceChild( range.extractContents(), node ) ; } })() ;
追記、content scriptをDOM level 2 rangeを使うように変更しました。2010/03/05 20:36以前にextensionやbookmarkletをインストールした人は、古いバージョンを使っています。
大丈夫だと思うのですが, 念のためにこんな感じでどうでしょうかー?
ReplyDelete(function(){
var range = document.createRange();
var list = document.querySelectorAll("a.keyword") ;
for ( var i = 0, len = list.length ; i < len ; ++i )
{
var node = list.item(i);
range.selectNodeContents(node);
node.parentNode.replaceChild( range.extractContents(), node ) ;
}
range.detach();
})() ;
最初はそのような形で実装したのですが、そもそも、複数のノードを子に持っている、はてなダイアリーの例が見つけられなかったので、単にreplaceChildを使いました。
ReplyDeleteもし、問題のあるはてなダイアリーがあれば、変更する予定です。
お、しかし、よくみたら、面白いコードだ。
ReplyDeleteDocument Object Model (DOM) Level 2 Traversal and Range Specificationの存在は知らなかった。
ありがとうございます。
いや、考えてみたら、Traversalは、前に読んだことがあるな。
ReplyDelete