我正在开发Firefox扩展程序并具有以下代码:
function initialize() {
// For accessing browser window from sidebar code.
var mainWindow = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
.getInterface(Components.interfaces.nsIWebNavigation)
.QueryInterface(Components.interfaces.nsIDocShellTreeItem)
.rootTreeItem
.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
.getInterface(Components.interfaces.nsIDOMWindow);
var gBrowser = mainWindow.gBrowser;
gBrowser.onload = function() {
alert('loaded');
};
}
我使用.onload而不是DOMContentLoaded或readystatechange,因为我需要等到所有其他javascript在我运行之前已经完成加载页面。
关于为什么要触发多个事件的任何想法(以及不应该触发事件的事情)?
解
根据MatrixFrog的建议,以下是我的解决方案:
function initialize() {
// For accessing browser window from sidebar code.
var mainWindow = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
.getInterface(Components.interfaces.nsIWebNavigation)
.QueryInterface(Components.interfaces.nsIDocShellTreeItem)
.rootTreeItem
.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
.getInterface(Components.interfaces.nsIDOMWindow);
var gBrowser = mainWindow.gBrowser;
if (gBrowser.addEventListener) {
gBrowser.addEventListener("load",pageLoaded,true);
}
}
function pageLoaded(aEvent) {
if ((aEvent.originalTarget.nodeName == '#document') &&
(aEvent.originalTarget.defaultView.location.href == gBrowser.currentURI.spec))
{
alert('loaded');
}
}
答案 0 :(得分:6)
来自https://developer.mozilla.org/en/Code_snippets/On_page_load
当前的Firefox trunk night会不仅触发onPageLoad函数,还会触发
xul:image
s(tabbrowser中的favicons)。如果您只想处理文档,请确保aEvent.originalTarget.nodeName == "#document"
如果您仍然看到无关的“加载”事件被触发,您可能需要检查事件目标以找出正在加载的内容,并使用类似的逻辑来避免在某些特定情况下调用扩展程序的逻辑。