2010-12-04 16 views
8

Inventé un complemento de Firefox hace varios meses que falló recientemente. El complemento básicamente busca una URL particular y luego modifica el DOM para la página. Seguí el error hasta la instalación (accidental) del complemento "Búsqueda segura de AVG". Descubrí que, con el complemento AVG deshabilitado, el evento DOMContentLoaded se dispara una vez para el documento (comportamiento que originalmente esperaba), pero con esto habilitado, el evento DOMContentLoaded se dispara dos veces para el documento. Mi complemento inserta una columna en una tabla HTML, por lo que debido a que el evento se dispara dos veces, se insertan dos columnas en vez de una.Evento DOMContentLoaded que se activa dos veces para una sola carga de página

Aquí está el código de inicialización destilada de mi complemento:

var hLoadListener = function(event) { myAddon.initialize(event); } 
var hContentLoadedListener = function(event) { myAddon.onContentLoaded(event); } 

myAddon.initialize = function(aEvent) 
{ 
    gBrowser.addEventListener("DOMContentLoaded", hContentLoadedListener, false); 
}; 

myAddon.onContentLoaded = function(aEvent) 
{ 
    if (!(aEvent.originalTarget.nodeName === "#document")) { return; } 

    var doc = aEvent.target; // document that triggered "onload" event 

    if (!(doc instanceof HTMLDocument)) { return; } 
    if (!doc.location) { return; } 

    var href = doc.location.href; // URL of current page 

    if (URLRegExp.test(href)) 
    { 
     // Modify the page's DOM 
    } 
}; 

window.addEventListener("load", hLoadListener, false); 

Este problema parece fácil de solucionar mediante la inserción de un elemento DOM único y luego las pruebas de su existencia en la salida. Mi pregunta es si los desarrolladores complementarios deberían esperar este comportamiento de evento como normal o si este problema es principalmente un error/efecto secundario en el complemento de AVG.

Respuesta

3

No sé si consideraría esto "normal", sin embargo, las posibilidades de que las aplicaciones externas afecten el funcionamiento de su complemento son infinitas.

Dicho esto, creo que independientemente de que AVG haya provocado esta anomalía, lo inteligente, como usted dijo, es verificar si la columna existe antes de la inserción, ya que AVG puede no ser la única aplicación externa que influya en el evento de firefox desencadenadores

Estoy muy cansado de los eventos DOM conducidos porque en mi propio complemento, y la prueba de ello durante el desarrollo ha mostrado MUCHAS anomolías basadas en tantas variables (SO diferente, diferentes versiones de FF, diferentes aplicaciones en la computadora host plugins diferentes, dentro de las FF otorga a los usuarios, etc ..)

Para resumir:

  • Bug en AVG? Quizás.
  • ¿El potencial de su plugin se ve afectado por MUCHAS otras fuentes? ¡Absolutamente!
  • Solución: En mi humilde opinión: compruebe siempre si su cambio se ha realizado antes de realizar el cambio real para todos los artículos DOM solo para estar seguro.
+0

Entonces quiere decir que tenemos que hacer un trabajo extra, como el autor dijo que inserta una identificación única para detener múltiples llamadas? –

1

tratar de leer método bindReady de jQuery:

https://github.com/jquery/jquery/blob/master/src/core.js

se encuentran:

if (readyBound) { 
return; 
} 
readyBound = true; 

// Use the handy event callback 
document.addEventListener("DOMContentLoaded", DOMContentLoaded, false); 
// A fallback to window.onload, that will always work 
window.addEventListener("load", jQuery.ready, false); 
Cuestiones relacionadas