使用chrome.tabs.onSelectionChanged.addListener时出现问题。一切都很好,直到整个窗口关闭。然后,无论出于什么原因,都会触发这个听众。对我来说这有点儿马车,但无论如何:
在这个监听器上,我正在使用chrome.tabs.get函数。这个函数在关闭窗口时抛出一个错误:
Error during tabs.get: No tab with id: 70.
这是有道理的。该标签在此刻不再存在。任何人都有办法解决这个问题?一个可能的原因是在窗口关闭时删除监听器。但遗憾的是,removeListener不起作用(如果有人知道如何删除,我很感激)。
最佳
编辑1.1:来自serg方法的修改函数(以这种方式表示):
首先,我尝试仅使用以下命令捕获实际窗口的选项卡:chrome.windows.getCurrent。但是这个函数不会返回windows.tabs数组。所以我先读出当前的windows.id,然后只循环浏览这个窗口的标签。
function ensureTabExists(tabId, callback) {
chrome.windows.getCurrent(function(windows) {
var exists = false;
windowsId=windows.id;
chrome.windows.getAll({populate: true}, function(windows){
loop:
for(var w=0;w<windows.length;++w) {
if (windows[w].id == windowsId) {
for(var t=0;t<windows[w].tabs.length;++t){
if(windows[w].tabs[t].id == tabId) {
exists = true;
break loop;
}
}
}
}
if(exists && callback) {
callback();
}
});
});
}
答案 0 :(得分:2)
您可以遍历所有窗口中的所有标签,并检查它是否仍然存在:
function ensureTabExists(tabId, callback) {
chrome.windows.getAll({populate: true}, function(windows){
var exists = false;
loop:
for(w=0;w<windows.length;w++) {
for(t=0;t<windows[w].tabs.length;t++){
if(windows[w].tabs[t].id == tabId) {
exists = true;
break loop;
}
}
}
if(exists && callback) {
callback();
}
});
}
//usage
chrome.tabs.onSelectionChanged.addListener(function(tabId, selectInfo) {
ensureTabExists(tabId, function(){
//this code will run only if tab exists
});
});
答案 1 :(得分:0)
使用chrome.window.onRemoved
API跟踪窗口关闭的时间。这样你就可以更优雅地处理窗口关闭案例。