2009-11-05 19 views
1

我在寫一個Firefox擴展。擴展名用其他詞替換頁面上的某些詞。以下是我正在使用的基本代碼:更新頁面HTML導致無限循環

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

問題是此代碼導致無限循環。當我設置body的innerHTML屬性時,它會發送另一個負載事件,這會導致無限循環。

如何在頁面加載時修改頁面而不會導致頁面加載事件再次觸發?

回答

0

立即在您的身體標籤內有一個div或span標籤是一個選項嗎?然後,您可以更新該元素的innerHTML,而不是整個主體...

2

您可以使用以下代碼來檢查它是否已經在之前運行過。

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

另外,如果你想保持loaded變了全球範圍內的,你可以使用一個封閉:

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

外部函數被立即執行,並返回這將有知名度的內部函數由於關閉導致的loaded變量。