gpt4 book ai didi

javascript - .onload 从 Firefox 扩展中多次调用

转载 作者:数据小太阳 更新时间:2023-10-29 03:53:16 25 4
gpt4 key购买 nike

我正在开发一个 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');
};
}
  1. 当我打开扩展程序(边栏)并继续在 Firefox 窗口中打开一个新选项卡时,会出现三个 警告框。
  2. 当我刷新页面时,有两个警告框。
  3. 页面加载完成后,只有一个警告框。
  4. 当我更改选项卡时,会触发警报。

我使用 .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');
}
}
  1. aEvent.originalTarget.nodeName == '#document' 检查页面是否已加载,而不是网站图标。
  2. (aEvent.originalTarget.defaultView.location.href == gBrowser.currentURI.spec)) 检查触发事件的元素是选项卡中的页面,而不是其 IFRAME 之一
  3. gBrowser.onload 只会针对 xul-image 而不会针对 #document 触发,因此它被替换为 gBrowser.addEventListener("load",pageLoaded,true);
  4. 如果您想避免为新的空白标签触发事件,请确保 gBrowser.currentURI.spec != "about:blank"

最佳答案

来自 https://developer.mozilla.org/en/Code_snippets/On_page_load

Current Firefox trunk nightlies will fire the onPageLoad function for not only documents, but xul:images (favicons in tabbrowser). If you only want to handle documents, ensure aEvent.originalTarget.nodeName == "#document"

如果您仍然看到无关的“加载”事件触发,您可能需要检查事件目标以确定正在加载的内容,并使用类似的逻辑来避免在某些特定情况下调用您的扩展程序的逻辑。

关于javascript - .onload 从 Firefox 扩展中多次调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3470961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com