ページが読み込まれるたびにJavaScriptを読み込むFirefoxアドオンを構築しています。このページで見つけたプログレスリスナー関数を使用しています: https ://developer.mozilla.org/en/Code_snippets/Progress_Listeners
私の問題は、ページが完全に読み込まれる前にコードが実行されるように見えるため、スクリプトが実行されないことです。これが私のコードです。
var PageLoad = {
browser: null,
domain: null,
oldURL: null,
init: function() {
gBrowser.addProgressListener(urlBarListener,Components.interfaces.nsIWebProgress.NOTIFY_LOCATION);
},
uninit: function() {
gBrowser.removeProgressListener(urlBarListener);
},
processNewURL: function(aURI) {
//if (aURI.spec == this.oldURL)
//return;
MyObject.function();
this.oldURL = aURI.spec;
}
};
var urlBarListener = {
locChange: false,
QueryInterface: function(aIID) {
if (aIID.equals(Components.interfaces.nsIWebProgressListener) ||
aIID.equals(Components.interfaces.nsISupportsWeakReference) ||
aIID.equals(Components.interfaces.nsISupports))
return this;
throw Components.results.NS_NOINTERFACE;
},
onLocationChange: function(aProgress, aRequest, aURI) {
PageLoad.processNewURL(aURI);
},
onStateChange: function(aWebProgress, aRequest, aFlag, aStatus) {},
onProgressChange: function(a, b, c, d, e, f) {},
onStatusChange: function(a, b, c, d) {},
onSecurityChange: function(a, b, c) {}
};
window.addEventListener("load",
function() {
PageLoad.init()
}, false);
var MyObject = {
function : function() {
var script = PageLoad.browser.createElement('script');
script.src = 'url_to_script.js';
PageLoad.browser.getElementsByTagName('head')[0].appendChild(script);
}
};
このコードを使用すると、コンソールに次のエラーメッセージが表示されます。
PageLoad.browser.getElementByTagName( "head")[0]は未定義です
タイムアウトを追加すると、スクリプトは断続的に機能しますが、ページの読み込みが遅い場合は同じエラーが発生します。これが時々機能するものですsetTimeout(MyObject.function, 1000);
ページがロードされた後にスクリプトが実行されていることを確認するためのより信頼性の高い方法が必要です。
無関係で、問題は発生していないようですが、次のエラーメッセージも表示されます。
gBrowser.addProgressListenerは、サポートされていない2番目の引数で呼び出されました。バグ608628を参照してください。