Googleインスタントプレビュー殺しのユーザースクリプトをアップデートした

Google検索のインスタントプレビューを無効にするユーザースクリプトの続編

いつぞやから始まった,Google検索におけるiTunes Instant的な検索結果の逐次的な表示に対応してみました.問答無用でインスタントプレビューを殺せればそれでいい,という程度の動作です.

DL&インストール => Disable GOGL Instant Previews for Greasemonkey

前作はこっち => Google検索のインスタントプレビューを無効にするユーザースクリプト

今回は,Firefox4 + GreaseMonkey のみで確認している状態です.ざっくりざっくり.

まあ,公式に無効化設定あるんですけどね!

Q: Google インスタント検索は無効にできますか。
A: 入力中に検索結果を表示したくない場合は、[表示設定] ページにアクセスして、Google インスタント検索を無効にすることができます。

Google インスタント検索より

言い訳すると,最初にこのユーザースクリプトを作った当時は情報みつからなかったんですよ?ほんとほんと.

いやー,これはこれでウザかったけど何となく対処してなかった人には嬉しい情報ですよ,ね・・・?

今回のハードル

一応メモっておくと,今回は表示した瞬間に無効化されればOKではなく,検索エリアがAjaxで更新されるたびに再度,無効化相当の処理を走らせる必要がありました.あ,さすがにsetIntervalはナシの方向で.

最初はsubmitとかxhrとか,Ajaxのトリガーになってそうなイベントを拾おうと思ったんですが,そのタイミングで走らせても検索結果のDOMができあがる前だろうし,そもそもうまく拾えませんでした.;-)

ということで,DOMに更新があったらときのイベントを拾う方針に変更しました.

DOMNodeInsertedイベント

(function(doc){
    doc.body.addEventListener('DOMNodeInserted', function(e) {
        var vsc = doc.querySelectorAll('div.vsc'),
            iz  = vsc.length,
            i   = 0,
            nid = e.target.id;

        if ( nid !== '' && nid !== 'xjsi' ) {
            return false;
        }

        for ( ; i < iz; i++ ) {
            vsc[i].className = '';
        }
    }, true);
})(document);

DOMNodeInsertedで勝つる!ってことで,大雑把に拾ってみました.実装してから思ったけど,jQuery(selector).live()とかの正体はバブリングかしら.それはともかく.

DOMNodeInsertedで渡されたオブジェクトの中身を見て,そのnodeのidを見ています.idを見ることで暗黙的にテキストノードとかも除外されていると考えて大丈夫そう.

んで,いろいろ試行錯誤した感じでは,Ajaxが発生したあとの処理の最後の方で#xjsiな要素が追加されているようなので,これをひとつの目印として判定基準にしました.

今回のスクリプトの実用性はともかく

DOMの更新を検知する方法が分かったので,ユーザースクリプト類でイメージが沸かなかった処理もこれで書けるようになるかも!

最後にもっかいUserScripts.orgのURLをば.DL&Installはこちら => Disable Google Instant Previews for Greasemonkey