我正在开发Firefox扩展,并具有以下代码:.onload多次调用从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窗口,有三个警报框。
- 当我刷新页面时,有两个警报框。
- 当页面加载完成时,只有一个警告框。
- 当我更改选项卡时,会触发警报。
我使用.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))检查引发该事件的元素是在标签的页面,而不是它的I帧的一个
- gBrowser.onload会只为xul-image启动,而不是为了#document,所以它被替换为gBrowser.addEventListener(“load”,pageLoaded,true); !
- 如果你想避免火烧新的空白标签的情况下,确保gBrowser.currentURI.spec = “有关:空白”
建议的解决方案无法处理页面加载在不同的Firefox选项卡,因为只有一个选项卡(焦点选项卡)条件aEvent.originalTarget.defaultView.location.href == gBrowser.currentURI.spec将评估为true – 2011-10-01 16:28:11