.onload从Firefox扩展中多次调用 [英] .onload called multiple times from Firefox extension

查看:106
本文介绍了.onload从Firefox扩展中多次调用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

 函数初始化(){
/ /用于从侧边栏代码访问浏览器窗口。
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');
};

$ / code $ / pre
$ b $ ol
当我打开扩展名(侧边栏)时,并继续在Firefox窗口中打开一个新选项卡,则有三个警报框。
  • 当我刷新一个页面时,有两个提醒框。

  • 当页面加载完成时,一个警报框。

  • 当我更改选项卡时,将触发警报。

  • 我使用.onload而不是DOMContentLoaded或readystatechange,因为我需要等到所有其他的javascript在页面上完成加载之前我的。

    任何想法为什么多个事件被触发(以及事件不应该触发的事情)?

    解决方案

    从MatrixFrog的建议开始,下面是我的解决方案:

     函数initialize(){
    //用于从侧边栏代码访问浏览器窗口。
    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);



    函数pageLoaded(aEvent){
    if((aEvent.originalTarget.nodeName =='#document')&&
    (aEvent.originalTarget.defaultView.location.href == gBrowser.currentURI.spec))
    {
    alert('loaded');


    code
    $ b $ ol
    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
  • / Code_snippets / On_page_loadrel =noreferrer> https://developer.mozilla.org/zh/Code_snippets/On_page_load



    < blockquote>


    当前的Firefox主干每晚都会触发onPageLoad函数不仅仅是文档,而是 xul:image s(tabbrowser中的favicons)。如果您只想处理文档,请确保 aEvent.originalTarget.nodeName ==#document




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


    I'm developing a Firefox extension and have the following code:

    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. When I open the extension (a sidebar) and proceed to open a new tab within the Firefox window, there are three alert boxes.
    2. When I refresh a page, there are two alert boxes.
    3. When a page finishes loading, there is only one alert box.
    4. When I change tabs, an alert is fired.

    I use .onload rather than DOMContentLoaded or readystatechange as I need to wait until all other javascript has finished loading on a page before I run mine.

    Any ideas as to why multiple events are being triggered (and for things that the event shouldn't be triggered for)?

    SOLUTION

    Following from MatrixFrog's suggestion, here is the solution I came to:

    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' checks that the page is loaded and not favicons.
    2. (aEvent.originalTarget.defaultView.location.href == gBrowser.currentURI.spec)) checks that the element that fired the event is the page in the tab, and not one of its IFRAMEs
    3. gBrowser.onload would only fire for xul-image and not for #document so it was replaced with gBrowser.addEventListener("load",pageLoaded,true);
    4. If you want to avoid firing the event for new blank tabs, make sure gBrowser.currentURI.spec != "about:blank"

    解决方案

    From 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"

    If you're still seeing extraneous 'load' events firing, you may want to inspect the event target to figure out what's being loaded, and use similar logic to avoid calling your extension's logic in certain specific cases.

    这篇关于.onload从Firefox扩展中多次调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆