我正在构建一个在每个页面加载时加载 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 使用第二个参数调用,这是不受支持的。请参阅错误 608628。