2012-03-05 101 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]); 
    ...