2009-11-05 4 views
1

J'écris une extension Firefox. L'extension remplace certains mots de la page par d'autres mots. Voici le code de base que j'utilise:Mise à jour de la page HTML provoque une boucle sans fin

function startup() { 
    gBrowser.addEventListener("load", pageLoad, true); 
} 

function pageLoad(event) { 
    if (event.originalTarget instanceof HTMLDocument) { 
     var ht = content.document.body.innerHTML; 
     ht = ht.replace(/\bthe\b/g,"el"); 
     content.document.body.innerHTML = ht; 
    } 
} 

Le problème est que ce code provoque une boucle sans fin. Lorsque je définis la propriété innerHTML du corps, il envoie un autre événement de chargement, ce qui provoque la boucle sans fin. Comment puis-je modifier la page lorsqu'elle se charge sans que l'événement de chargement de page ne se déclenche à nouveau?

Répondre

0

Est-ce que le fait d'avoir un tag div ou span immédiatement à l'intérieur de votre tag body est une option? Ensuite, vous pouvez simplement mettre à jour innerHTML de cet élément, et non le corps entier ...

2

Vous pouvez utiliser le code suivant pour vérifier s'il a déjà été exécuté auparavant.

var loaded = false; 

function pageLoad(event) { 
    if (!loaded) { 
     if (event.originalTarget instanceof HTMLDocument) { 
      var ht = content.document.body.innerHTML; 
      ht = ht.replace(/\bthe\b/g,"el"); 
      content.document.body.innerHTML = ht; 
     } 
     loaded = true; 
    } 
} 

Sinon, si vous voulez garder la variable loaded hors de portée mondiale, vous pouvez utiliser une fermeture:

var pageLoad = (function() { 
    var loaded = false; 
    return function(event) { 
    if (!loaded) { 
     if (event.originalTarget instanceof HTMLDocument) { 
      var ht = content.document.body.innerHTML; 
      ht = ht.replace(/\bthe\b/g,"el"); 
      content.document.body.innerHTML = ht; 
     } 
     loaded = true; 
    } 
    } 
}(); 

La fonction externe est exécuté immédiatement et retourne la fonction intérieure qui aura la visibilité de la variable loaded en raison de la fermeture.

Questions connexes