2012-03-05 104 views
1

我試圖讓我的Firefox擴展從瀏覽器中的所有選項卡創建一個URL列表。爲了保持列表更新,我需要知道選項卡何時關閉。檢測選項卡關閉(關閉後)從Firefox擴展

我使用

window.addEventListener("TabClose", tabRemoved, false); 

然而,這之前調用標籤實際上被關閉,這將導致我的更新標籤列表仍然包含關閉的標籤網址嘗試。

我是通過遍歷所有的瀏覽器更新選項卡列表,像這樣:

function() 
{ 
    gBrowser = window.getBrowser(); 
    tabs = gBrowser.browsers; 
    urls = []; 

    for (var i = 0; i < tabs.length; i++) 
    { 
     if (typeof(tabs[i]) != "undefined") { 
      urls.push(tabs[i].webNavigation.currentURI.spec); 
     } 
    } 

    return urls; 
} 

所以,我正在尋找的是一個後選項卡已被關閉時調用的事件,還是有辦法來獲得已關閉的選項卡的索引,以便在迭代瀏覽器時跳過它。

任何人都知道任何此類事件或其他解決方案對我的問題?

在此先感謝!

回答

0

沒有特別的事件 - 你只需要捕捉常規事件並更新延遲的選項卡列表。沿着這些方向的東西:

var tabRemoveTimeout = null; 
window.addEventListener("TabClose", tabRemoved, false); 

function tabRemoved(event) 
{ 
    // If we already scheduled an async action - cancel it 
    if (tabRemoveTimeout) 
    window.clearTimeout(tabRemoveTimeout); 

    tabRemoveTimeout = window.setTimeout(function() 
    { 
    tabRemoveTimeout = null; 
    updateTabList(); 
    }, 0); 
} 

一個不太常見的方法是立即更新列表,但不包括正在關閉的選項卡。

+0

我不是,因爲它需要關閉一個標籤時的延遲解決方案真的很開心不是恆定的,因此非常不可靠。 立即更新選項卡列表,排除封閉選項卡是我繼續這樣做的方式。 – Martin 2012-03-06 18:00:23

0

這裏是我做過什麼來解決這個問題:

tabRemoved = function (ev) 
{ 
    logTabs([ev.target._tPos]); /* ev.target._tPos = index of tab that was closed */ 
} 

logTabs = function (excludelist) 
{ 
    ... 
    urls = getTabURLs(); 
    for(var i = 0; i < urls.length; i++) 
    { 
     if(typeof(excludelist) != "undefined" && excludelist.indexOf(i) != -1) 
      continue; 

     doStuff(urls[i]); 
    ...