我正在开发一个 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');
};
}
- 当我打开扩展程序(侧边栏)并继续在 Firefox 窗口中打开新选项卡时,有three警报框。
- 当我刷新页面时,有two警报框。
- 当页面加载完成时,只有一个警告框。
- 当我更改选项卡时,会触发警报。
我使用 .onload 而不是 DOMContentLoaded 或readystatechange,因为我需要等到所有其他 javascript 完成在页面上的加载后再运行我的。
关于为什么会触发多个事件(以及不应该触发事件的事情)有什么想法吗?
SOLUTION
根据 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');
}
}
- aEvent.originalTarget.nodeName == '#document' 检查页面是否已加载,而不是网站图标。
- (aEvent.originalTarget.defaultView.location.href == gBrowser.currentURI.spec)) 检查触发事件的元素是否是选项卡中的页面,而不是其 IFRAME 之一
- gBrowser.onload 只会针对 xul-image 而不会针对 #document 触发,因此它被替换为 gBrowser.addEventListener("load",pageLoaded,true);
- 如果您想避免触发新空白选项卡的事件,请确保 gBrowser.currentURI.spec != "about:blank"
From https://developer.mozilla.org/en/Code_snippets/On_page_load https://developer.mozilla.org/en/Code_snippets/On_page_load
当前的 Firefox trunk nightly 不仅会为文档触发 onPageLoad 函数,而且还会为文档触发 onPageLoad 函数。xul:image
s(选项卡浏览器中的图标)。如果您只想处理文档,请确保aEvent.originalTarget.nodeName == "#document"
如果您仍然看到无关的“加载”事件触发,您可能需要检查事件目标以找出正在加载的内容,并使用类似的逻辑来避免在某些特定情况下调用扩展的逻辑。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)