Estoy desarrollando una extensión de Firefox y tienen el siguiente código:.onload llama varias veces a partir de extensión para 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');
};
}
- Al abrir la extensión (una barra lateral) y proceder a abrir una nueva pestaña dentro la ventana de Firefox, hay tres cuadros de alerta.
- Cuando actualizo una página, hay dos cuadros de alerta.
- Cuando una página termina de cargarse, solo hay un cuadro de alerta.
- Cuando cambio las pestañas, se activa una alerta.
Uso .onload en lugar de DOMContentLoaded o readystatechange, ya que tengo que esperar hasta que todos los demás javascript hayan terminado de cargarse en una página antes de ejecutar el mío.
¿Alguna idea de por qué se desencadenan múltiples eventos (y para las cosas que no deberían desencadenarse)?
SOLUCIÓN
Después de la sugerencia de MatrixFrog, aquí está la solución que vine 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' comprueba que la página se ha cargado y no favicons.
- (aEvent.originalTarget.defaultView.location.href == gBrowser.currentURI.spec)) comprueba que el elemento que generó el evento es la página de la ficha, y no uno de sus IFRAMEs
- gBrowser.onload haría only fire para xul-image y no para #document así que fue reemplazado por gBrowser.addEventListener ("load", pageLoaded, true); !
- Si se quiere evitar disparar el caso de nuevas pestañas en blanco, asegúrese de gBrowser.currentURI.spec = "about: blank"
La solución propuesta no se puede administrar cuando las páginas se cargan en diferentes pestañas de Firefox porque solo una pestaña (la pestaña enfocada) la condición aEvent.originalTarget.defaultView.location.href == gBrowser.currentURI.spec se evaluará como verdadera –