2010-08-12 77 views
8

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

我使用.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'); 
    } 
} 
  1. aEvent.originalTarget.nodeName == '#document' 检查该页面加载而不是小图标。
  2. (aEvent.originalTarget.defaultView.location.href == gBrowser.currentURI.spec))检查引发该事件的元素是在标签的页面,而不是它的I帧的一个
  3. gBrowser.onload会只为xul-image启动,而不是为了#document,所以它被替换为gBrowser.addEventListener(“load”,pageLoaded,true); !
  4. 如果你想避免火烧新的空白标签的情况下,确保gBrowser.currentURI.spec = “有关:空白”
+1

建议的解决方案无法处理页面加载在不同的Firefox选项卡,因为只有一个选项卡(焦点选项卡)条件aEvent.originalTarget.defaultView.location.href == gBrowser.currentURI.spec将评估为true – 2011-10-01 16:28:11

回答

6

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

当前的Firefox树干睡房不仅会为文档启动onPageLoad函数,还会启动xul:image(tabbrowser中的图标)。如果你只是想处理的文件,确保aEvent.originalTarget.nodeName == "#document"

如果你看到的仍然是多余的“负荷”事件射击,你可能要检查事件目标弄清楚真实加载的东西,和使用类似的逻辑,以避免在某些特定情况下调用您的扩展的逻辑。

+0

它火力减少很多,但仍然在一些页面上进行多次。我猜这是由于iframe发起onload事件? 只是研究如何分辨文档负载中的iframe负载,以及是否在页面及其所有iframe加载时捕获iframe。 – Ivan 2010-08-13 17:23:23

+2

@伊万,可能是iframe。如果它不是一个iframe,那么'event.originalTarget.defaultView.frameElement'将为空/未定义。 – MatrixFrog 2011-02-09 15:51:01

+1

@MatrixFrog是否有另一种方法来检查它? – 2013-07-12 07:23:33