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?
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? –