2010-12-04 20 views
8

J'ai créé un module complémentaire Firefox il y a quelques mois qui a récemment échoué. Le module recherche essentiellement une URL particulière, puis modifie le DOM de la page. J'ai retracé l'échec de l'installation (accidentelle) de l'add-on "AVG Safe Search". J'ai trouvé que, avec le module complémentaire AVG désactivé, l'événement DOMContentLoaded se déclenche une fois pour le document (comportement auquel je m'attendais initialement), mais avec l'activation, l'événement DOMContentLoaded se déclenche deux fois pour le document. Mon module complémentaire insère une colonne dans un tableau HTML. Ainsi, comme l'événement se déclenche deux fois, deux colonnes en double sont insérées au lieu d'une seule.Émission d'événement DOMContentLoaded deux fois pour un chargement de page unique

est ici le code d'initialisation distillée de mon add-on:

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); 

Cette question semble facile à fixer par l'insertion d'un élément DOM unique et tester ensuite pour son existence au début. Ma question est de savoir si les développeurs de modules complémentaires devraient s'attendre à ce comportement d'événement comme normal ou si ce problème est principalement un bug/effet secondaire dans le module complémentaire AVG?

Répondre

3

Je ne sais pas si je considérerais cela comme «normal», mais les possibilités pour les applications extérieures d'affecter le fonctionnement de votre plugin sont infinies. Cela dit, je pense qu'AVG causant cette anomalie, la chose intelligente à faire, comme vous l'avez dit, est de vérifier si la colonne existe avant l'insertion, car AVG peut ne pas être la seule application externe qui influence l'événement firefox déclencheurs. Je suis très fatigué des événements pilotés par DOM parce que dans mon propre plugin, et le test tout au long du développement a montré BEAUCOUP d'anomolies basées sur tant de variables (OS différents, version différente de FF, différentes applications sur l'ordinateur hôte , différents plugins dans tous les utilisateurs donnés FF, etc ..)

Pour résumer:

  • Bug dans AVG? Peut-être.
  • Est-ce que le potentiel pour que les performances de votre plugin soient affectées par BEAUCOUP d'autres sources? Absolument!
  • Solution: À mon humble avis - Vérifiez toujours si votre modification a été faite avant de faire le changement réel pour tous les articles DOM juste pour être sûr.
+0

ne Donc cela veut dire que nous devons faire un travail supplémentaire comme l'auteur dit qu'il insère un identifiant unique pour arrêter plusieurs appels? –

1

Essayez de lire la méthode bindReady de jquery:

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

Vous trouverez:

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);