21

有时标签 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 的选项卡。”

4

5 回答 5

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

Chrome 扩展错误:“运行 browserAction.setIcon 时未检查 runtime.lastError:没有带有 id 的选项卡”

编辑:

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

来自@Xan 的评论

于 2014-12-17T18:41:21.530 回答
4

There is another solution based on Ian's comment (thank you @Ian) to the question.

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();
  });
}

It is tested and works good so everybody can use it. If somebody can find shorter solution then using chrome.windows.getAll please write!

UPDATE: Since @anglinb's answer this my answer is not actual any more

于 2013-05-15T18:20:54.940 回答
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"));
});
于 2014-09-14T07:37:41.630 回答
2

实际上,chrome API 中没有“exists”函数……我写了这段代码:

  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.`);
  });
于 2017-04-08T23:23:14.673 回答
-2

先设置一个变量

lastRemoved=tab.id;
chrome.tabs.remove(tab.id);

并在之后检查

chrome.tabs.onUpdated.addListener(function(tabId){
    if(lastRemoved==tabId) return;
    chrome.tabs.get(tabId,
    //...
于 2013-07-24T12:54:25.990 回答