ページ内検索のbookmarklet

作ろうと思うと意外と難しい。作る前に、誰かが作っていそうと思って探したらやはり見つかった。たとえば以下。

これを元にハイライトするところだけを自分でちょっと書き直してみた。

javascript:
(function(){
  var s = '(' + prompt('このページを検索:','') + ')';
  var x = new RegExp(s,'gi');
  var b = document.body.innerHTML;
  b = b.replace(x,'<em style="color:#000;background:#FF0;font-weight:bold;">$1</em>');
  document.body.innerHTML = b;
})();

だがしかし、置換する対象範囲が document.body.innerHTML ってのがまずい。たとえばダブルクオート記号を入力すると大抵の場合は bookmarklet を実行した HTML文書がひどく壊れる。そうならないように、document.body.childNodes を一つ一つ見ていき、その nodeType が TEXT_NODE だったら……みたいにしないといけないと思った。それで面倒になって諦めた。
探して色々見た中で一番すごいと思ったのは以下。