2012-03-12 126 views
0

我正在構建一個使用瀏覽器overlay.xul的附加組件,該組件包含js文件。我發現在網頁上修改HTML的最簡單方法就是我在相信的mdn上找到的這段代碼。即時插入html和標籤

const STATE_START = Components.interfaces.nsIWebProgressListener.STATE_START; 
const STATE_STOP = Components.interfaces.nsIWebProgressListener.STATE_STOP; 

var myListener = { 
    QueryInterface: function(aIID) { 
     if (aIID.equals(Components.interfaces.nsIWebProgressListener) || 
     aIID.equals(Components.interfaces.nsISupportsWeakReference) || 
     aIID.equals(Components.interfaces.nsISupports)) 
     return this; 
     throw Components.results.NS_NOINTERFACE; 
    }, 
    onStateChange: function(aWebProgress, aRequest, aFlag, aStatus) { }, 
    onLocationChange: function(aProgress, aRequest, aURI) { 
     PageLoad.initialzed = false; 
     PageLoad.init(); 
    }, 
    onProgressChange: function(aWebProgress, aRequest, curSelf, maxSelf, curTot, maxTot) { }, 
    onStatusChange: function(aWebProgress, aRequest, aStatus, aMessage) { }, 
    onSecurityChange: function(aWebProgress, aRequest, aState) { } 
}; 

gBrowser.addProgressListener(myListener); 


var PageLoad = { 
    initialzed : false, 
    browser : null, 
    domain : null, 
    appcontent : null, 

    init : function() { 
     PageLoad.appcontent = document.getElementById("appcontent"); 
     if (PageLoad.appcontent) { 
      PageLoad.appcontent.addEventListener("DOMContentLoaded", PageLoad.load, true); 
     } 
    }, 
    load : function() { 
       //I do this so it only calls the function once 
     if (PageLoad.initialzed == false) { 
      PageLoad.initialzed = true; 
      PageLoad.browser = gBrowser.contentDocument; 
      PageLoad.domain = (PageLoad.browser.location.host.match(/([^.]+)\.\w{2,3}(?:\.\w{2})?$/) || [])[1]; 
      myFunctiontoInsertHTML(); 
     } 

    } 
}; 

然後我可以在我的功能..這工作不錯迄今使用PageLoad.browser.createElement('div')等等,但我所遇到的一個問題,即有多個標籤打開,我PageLoad.domain變量包含最後加載的標籤的域或網頁(這反過來導致在2個或更多不同頁面/標籤上插入html的錯誤)。所以我想改變的是每次用戶點擊不同的標籤或重新加載我想調用該功能的頁面,但我已經陷入了死衚衕。

+1

檢出[在頁面加載](https://developer.mozilla.org/en/Code_snippets/On_page_load)和[url欄列表](https://developer.mozilla.org/en/Code_snippets/Progress_Listeners#例如:_Notification_when_the_value_in_Address_Bar_changes) – 2012-03-13 06:29:14

+0

我正在使用自己的'在頁面加載'鏈接上的變體,但是這個網址欄監聽器正是我所需要的,我想。 – thefoyer 2012-03-19 18:54:28

回答

0

gBrowser.contentDocument是加載在當前瀏覽器選項卡中的頁面文檔 - 只要用戶切換標籤頁或導航到不同的頁面,其值就會更改,並且您不應保留舊值(這是內存泄漏) 。您正在觀察所有瀏覽器選項卡的進度,您應該看看所要求的那個。意思是你的情況:aProgress.DOMWindow(見nsIWebProgress.DOMWindow)。如果您對單個選項卡的加載進度感興趣,那麼也應該在此處附加DOMContentLoaded事件偵聽器。

+0

感謝弗拉基米爾迄今爲止所有的幫助。 'gBrowser.addProgressListener'似乎遇到了一個更大的問題。 奇怪的是,我安裝插件後,它的工作原理。如果我關閉瀏覽器並重新啓動它,那麼插件會再次運行,但是如果我再次關閉瀏覽器並將其重新打開,它將不起作用。 尋找錯誤控制檯它說「'gBrowser.addProgressListener'不是一個函數」。直到我重新安裝它,插件纔會再次運行。沖洗並重復,如果你重新啓動瀏覽器3次,它不再工作。 – thefoyer 2012-03-19 17:12:34