javascript - español - .onload llamado varias veces desde la extensión de Firefox
addeventlistener onload (1)
Desde https://developer.mozilla.org/en/Code_snippets/On_page_load
Los nightlies de tronco actuales de Firefox activarán la función onPageLoad no solo para documentos, sino también para
xul:image
s (favicons en tabbrowser). Si solo desea manejar documentos, asegúrese de queaEvent.originalTarget.nodeName == "#document"
Si todavía está viendo disparos de eventos de "carga" extraños, es posible que desee inspeccionar el objetivo del evento para descubrir qué se está cargando y utilizar una lógica similar para evitar llamar a la lógica de su extensión en ciertos casos específicos.
Estoy desarrollando una extensión de Firefox y tengo el siguiente código:
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'');
};
}
- Cuando abro la extensión (una barra lateral) y procedo a abrir una nueva pestaña dentro de 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 de cosas por las que no se debe desencadenar el evento)?
SOLUCIÓN
Siguiendo la sugerencia de MatrixFrog, aquí está la solución que encontré:
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 está cargada y no los favicons.
- (aEvent.originalTarget.defaultView.location.href == gBrowser.currentURI.spec)) comprueba que el elemento que activó el evento sea la página en la pestaña y no una de sus IFRAMEs
- gBrowser.onload solo se activará para xul-image y no para #document, por lo que se reemplazó por gBrowser.addEventListener ("load", pageLoaded, true);
- Si quiere evitar disparar el evento en busca de nuevas pestañas en blanco, asegúrese de que gBrowser.currentURI.spec! = "About: blank"