.onload wurde mehrmals von der Firefox-Erweiterung aufgerufen

Ich entwickle eine Firefox-Erweiterung und habe den folgenden 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');
    };
}
Wenn ich die Erweiterung (eine Seitenleiste) öffne und eine neue Registerkarte im Firefox-Fenster öffne, gibt esdre Benachrichtigungsfelder.Wenn ich eine Seite aktualisiere, gibt eszwe Benachrichtigungsfelder.Wenn eine Seite vollständig geladen ist, gibt es nur ein Warnfeld.Wenn ich die Tabs ändere, wird ein Alarm ausgelöst.

Ich verwende .onload anstelle von DOMContentLoaded oder readystatechange, da ich warten muss, bis alle anderen Javascript-Dateien auf einer Seite geladen sind, bevor ich meine ausführen kann.

Haben Sie eine Idee, warum mehrere Ereignisse ausgelöst werden (und für Dinge, für die das Ereignis nicht ausgelöst werden sollte)?

LÖSUN

Folgend aus MatrixFrogs Vorschlag, hier ist die Lösung, zu der ich gekommen bin:

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' prüft, ob die Seite geladen ist und keine Favoriten. (aEvent.originalTarget.defaultView.location.href == gBrowser.currentURI.spec)) prüft, ob das Element, das das Ereignis ausgelöst hat, die Seite auf der Registerkarte ist und nicht eines seiner IFRAMEs gBrowser.onload wurde nur für xul-image und nicht für #document ausgelöst, daher wurde es durch gBrowser.addEventListener ("load", pageLoaded, true) ersetzt.Wenn Sie vermeiden möchten, dass das Ereignis für neue leere Tabs ausgelöst wird, stellen Sie sicher, dass gBrowser.currentURI.spec! = "About: blank"

Antworten auf die Frage(2)

Ihre Antwort auf die Frage