sto sviluppando un'estensione per Firefox e hanno il seguente codice:.onload chiamato più volte da estensione per 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');
};
}
- Quando apro l'estensione (una barra laterale) e procedere ad aprire una nuova scheda all'interno la finestra di Firefox, ci sono tre caselle di avviso.
- Quando si aggiorna una pagina, ci sono due caselle di avviso.
- Al termine del caricamento di una pagina, è presente una sola casella di avviso.
- Quando cambio scheda, viene generato un avviso.
Io uso .carico piuttosto che DOMContentLoaded o readystatechange poiché devo attendere che tutti gli altri javascript abbiano completato il caricamento su una pagina prima di eseguire il mio.
Qualche idea sul motivo per cui vengono attivati più eventi (e per cose per cui l'evento non deve essere attivato)?
SOLUZIONE
seguito dal suggerimento di MatrixFrog, ecco la soluzione sono venuto a:
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' verifica che la pagina viene caricata e non favicon.
- (aEvent.originalTarget.defaultView.location.href == gBrowser.currentURI.spec)) Verifica che l'elemento che ha generato l'evento è la pagina nella scheda, e non uno dei suoi IFRAME
- gBrowser.onload sarebbe solo fire per xul-image e non per #document quindi è stato sostituito con gBrowser.addEventListener ("load", pageLoaded, true); !
- Se si vuole evitare di generare l'evento per le nuove schede vuote, assicurarsi gBrowser.currentURI.spec = "about: blank"
La soluzione proposta non può essere gestita quando le pagine vengono caricate su diverse schede firefox solo per una scheda (la scheda focalizzata) la condizione aEvent.originalTarget.defaultView.location.href == gBrowser.currentURI.spec verrà valutata come vera –