检查Chrome中是否存在具有确切ID的Tab的最佳方法

时间:2013-05-15 17:27:38

标签: javascript google-chrome-extension

有时候,标签ID存储在变量中,您需要先检查标签是否仍然存在,然后再对其进行操作(因为用户可以随时关闭标签页)。我找到了这个解决方案:

chrome.tabs.get(1234567, function(tab) {
  if (typeof tab == 'undefined') {
    console.log('Tab does not exist!');
  }
});

它有效,但它有很严重的缺点。它将错误消息写入控制台,如下所示:

tabs.get期间出错:没有ID为1234567的标签。

这不是例外。所以try / catch无济于事。这只是控制台中的一条消息。

有什么想法吗?

更新:此错误现在看起来像“运行tabs.get时未经检查的runtime.lastError:没有ID为1234567的标签。”

5 个答案:

答案 0 :(得分:16)

function callback() {
    if (chrome.runtime.lastError) {
        console.log(chrome.runtime.lastError.message);
    } else {
        // Tab exists
    }
}
chrome.tabs.get(1234,callback);

来源Chrome Extension error: "Unchecked runtime.lastError while running browserAction.setIcon: No tab with id"

修改

  

Chrome会检查是否已检入chrome.runtime.lastError的值   回调,并为此“未处理的异步”输出控制台消息   异常“。如果你检查它,它不会污染控制台。

来自@Xan的评论

答案 1 :(得分:3)

根据Ian对此问题的评论(谢谢@Ian)还有另一种解决方案。

function tabExists (tabId, onExists, onNotExists) {
  chrome.windows.getAll({ populate: true }, function (windows) {
    for (var i = 0, window; window = windows[i]; i++) {
      for (var j = 0, tab; tab = window.tabs[j]; j++) {
        if (tab.id == tabId) {
          onExists && onExists(tab);
          return;
        }
      }
    }
    onNotExists && onNotExists();
  });
}

它经过测试并且运行良好,所以每个人都可以使用它。如果有人能找到更短的解决方案,那么请使用chrome.windows.getAll写一下!

更新:自@ anglinb回答此问题后,我的答案已不再实际

答案 2 :(得分:3)

我很惊讶没有API可以完成这项简单的任务。除了上面提到的@KonstantinSmolyanin之外,我想出了这个更简单的方法:

function checkTabIDValid(nTabID, callbackDone)
{
    chrome.browserAction.getBadgeText({tabId: nTabID}, function(dummy)
    {
        if(callbackDone)
            callbackDone(!chrome.runtime.lastError);
    });
}

不幸的是,它还必须异步报告结果:

checkTabIDValid(tabId, function(res){
    console.log("tab " + (res ? "exists" : "doesn't exist"));
});

答案 3 :(得分:2)

确实,没有"存在" chrome API中的函数... 我写了这段代码:

  var tabID = 551;
  chrome.tabs.query(  {}, function(tabs) {
    for(let i = 0; i<tabs.length; i++){
      if (tabs[i].id === tabID) {
        alert(`Tab ${tabID} exists!`);
        return;
      }
    }
    alert(`No Tab ${tabID} here.`);
  });

答案 4 :(得分:-2)

之前设置变量
lastRemoved=tab.id;
chrome.tabs.remove(tab.id);

之后检查
chrome.tabs.onUpdated.addListener(function(tabId){
    if(lastRemoved==tabId) return;
    chrome.tabs.get(tabId,
    //...