.onload wurde mehrmals von der Firefox-Erweiterung aufgerufen

8

Ich entwickle eine Firefox-Erweiterung und habe den folgenden Code:

%Vor%
  1. Wenn ich die Erweiterung (eine Seitenleiste) öffne und eine neue Registerkarte im Firefox-Fenster öffne, gibt es drei Benachrichtigungsfelder.
  2. Wenn ich eine Seite aktualisiere, gibt es zwei Benachrichtigungsfelder.
  3. Wenn eine Seite geladen wurde, gibt es nur eine Warnmeldung.
  4. Wenn ich Tabs ändere, wird eine Warnung ausgelöst.

Ich verwende .onload anstelle von DOMContentLoaded oder readystatechange, da ich warten muss, bis alle anderen Javascripts auf einer Seite geladen sind, bevor ich meins starte.

Irgendwelche Ideen, warum mehrere Ereignisse ausgelöst werden (und für Dinge, für die das Ereignis nicht ausgelöst werden sollte)?

LÖSUNG

Nach dem Vorschlag von MatrixFrog, hier ist die Lösung, zu der ich kam:

%Vor%
  1. aEvent.originalTarget.nodeName == '#document' prüft, ob die Seite geladen ist und nicht favicons.
  2. (aEvent.originalTarget.defaultView.location.href == gBrowser.currentURI.spec)) prüft, ob das Element, das das Ereignis ausgelöst hat, die Seite auf der Registerkarte und nicht eines seiner IFRAMEs
  3. ist
  4. gBrowser.onload würde nur für xul-image und nicht für #document ausgelöst, daher wurde es durch gBrowser.addEventListener ("load", pageLoaded, true);
  5. ersetzt
  6. 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"
  7. ist
Ivan 12.08.2010, 18:51
quelle

1 Antwort

6

Von Ссылка

  
    
      

Aktuelle Firefox-Trunk-Nightlies feuern die onPageLoad-Funktion nicht nur für Dokumente, sondern für xul:image s (Favicons im Tabbrowser). Wenn Sie nur mit Dokumenten arbeiten möchten, stellen Sie aEvent.originalTarget.nodeName == "#document"

sicher     
  

Wenn Sie immer noch feststellen, dass irrelevante "load" -Ereignisse ausgelöst werden, sollten Sie das Ereignisziel untersuchen, um herauszufinden, was geladen wird, und ähnliche Logik verwenden, um den Aufruf der Logik Ihrer Erweiterung in bestimmten Fällen zu vermeiden.

    
MatrixFrog 13.08.2010, 04:23
quelle