2012-09-15 56 views
0

我正在製作一個Firefox插件,用於記錄用戶在瀏覽器中打開網頁的時間。如何在更改多標籤瀏覽器中的標籤之前捕獲舊URL?

我能夠通過添加進度監聽趕在瀏覽器中每一個新的網頁打開的鏈接(無論是在新的標籤或已經打開了一個):

addProgressListener(myAddon_urlBarListener, 
        Components.interfaces.nsIWebProgress.NOTIFY_ALL); 

然後我用onLocationChange得到標籤的新網址。

問題是我不知道標籤的舊URL能夠停止計時器並計算該網頁的持續時間。現在我只能夠計算時間,如果我關閉網頁的標籤,因爲我能夠捕捉關閉標籤頁事件以及關閉頁面之前的鏈接。

我需要一種方法來趕上老網頁的URL,如果我在同一個選項卡中打開一個新的URL,這需要即使不止一個標籤頁都在瀏覽器中打開工作。順便說一句,我不使用jQuery,但如果它是必需的,我會的。

+0

如果你可以看到所有當前打開的選項卡,爲什麼不能比當前打開的選項卡的標籤,你現在已經得救了嗎?不在列表中的那個是被改變的那個。 –

+0

@sudowned:我用了弗拉基米爾的建議,對我來說工作得很好,thanx分享你的想法 – BlackSigma

回答

0

如果在兩個選項卡中打開了相同的URL,該怎麼辦?你應該關注標籤,而不是網址。您的onLocationChange函數應該找到與選項卡關聯的<browser>元素,並且只記住其URL(只要時間)。下次您看到相同的<browser>元素時,您將獲得所需的全部信息。存儲關於瀏覽器的數據的最佳方式是當前WeakMap,並且使用tabbrowser.getBrowserForDocument() method找到<browser>元素是可能的。所以,這樣的事情應該工作:

browsers: new WeakMap(), 

onLocationChanged: function(webProgress, request, location, flags) 
{ 
    if (typeof flags == "number" && 
     (flags & Components.interfaces.nsWebProgressListener.LOCATION_CHANGE_SAME_DOCUMENT)) 
    { 
    // Ignore anchor changes 
    return; 
    } 

    var doc = webProgress.DOMWindow.document; 
    var browser = gBrowser.getBrowserForDocument(doc); 
    if (this.browsers.has(browser)) 
    { 
    // We know this tab already, record data for previous URL 
    var data = this.browsers.get(browser); 
    recordPageClosed(data.url, data.startTime); 
    } 

    // Start timer for this tab 
    this.browsers.set(browser, {url: location.spec, startTime: Date.now()}); 
} 

當然,你仍然必須處理​​事件。在那裏你需要tabbrowser.getBrowserForTab() method來找到<browser>元素相應的<tab>元素。

相關問題