有时候,标签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的标签。”
答案 0 :(得分:16)
function callback() {
if (chrome.runtime.lastError) {
console.log(chrome.runtime.lastError.message);
} else {
// Tab exists
}
}
chrome.tabs.get(1234,callback);
修改强>
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,
//...