userChrome.jsでDOMContentLoaded
2010/05/06(木) 19:03 Javascript親記事へこのエントリーをはてなブックマークに追加

GreasemonkeyではDOMContentLoaded時にスクリプトを実行できないので、userChrome.jsを使ってやる。勘違い。
サイト既存の何かが阻害して、画像を読み終わるまでGreasemonkeyスクリプトが動かない場合があったみたい。(GreasemonkeyがDOMContentLoadedにlistenされているのは知っていたけど、この現象を何回も見かけたので誤解したらしい)何だろこれ。

シンプルにまとめるとこんな感じで、DOMContentLoadedのイベントリスナーをつけてDOM構築時に実行できる。
var startDomContentLoaded = function(event) {
    var doc = event.target; // document
    var safeWindow = doc.defaultView; //window
    if(safeWindow.location.href.indexOf('判定URL') != -1) {
	// やりたい処理
    }
}
gBrowser.addEventListener('DOMContentLoaded', startDomContentLoaded, false);
今回やりたかったことは、任意のサイトにjQueryとjQueryプラグインを読み込ませて実行させるという事をやりたかった。
Greasemonkeyだと画像を読み込み完了しないと動作しないので、Greasemonkeyからは使えないプラグインなどがあるため、userChrome.js経由でGreasemonkey的な事をやってる。
var startDomContentLoaded = function(event) {
    var doc = event.target; // document
    var safeWindow = doc.defaultView; //window
    if(safeWindow.location.href.indexOf('http://mediamarker.net/') != -1) {
        var scriptjQuery = doc.createElement("script");
        scriptjQuery.type = 'text/javascript';
        scriptjQuery.src = "http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js";
        doc.body.appendChild(scriptjQuery);
        var scriptLazy = doc.createElement("script");
        scriptLazy.type = 'text/javascript';
        scriptLazy.src = "http://gist.github.com/raw/391939/9bccd0b20ed2866750c2749013893dea0e5f0e95/jquery.lazyload.js";
        doc.body.appendChild(scriptLazy);
    }
    evalInPage(function(){
        $("img").lazyload({ threshold : 200 });
    })
    function evalInPage(fun) {
        safeWindow.location.href = "javascript:void (" + fun + ")()";
    }
}
gBrowser.addEventListener('DOMContentLoaded', startDomContentLoaded, false);
script.onloadにしようとしたけど、動かなかった。(多分セキュリティ関係だと思う)

userChrome.jsでGreasemonkey的な事をやるときにwindowやdocumentに相当するものが何かと分かると作りやすくなると思う。

追記:GreasemonkeyがDOMContentLoadedで実行されることが確認できたので、Greasemonkeyで同じ事をやる場合、次のようになりました。

簡単ですね。

名前:  非公開コメント   

  • TB-URL  http://efcl.info/adiary/037/tb/