Google chrome extension Chrome扩展:选项卡侦听器OnSelection已更改

Google chrome extension Chrome扩展:选项卡侦听器OnSelection已更改,google-chrome-extension,listener,Google Chrome Extension,Listener,chrome.tabs.onSelectionChanged.addListener出现一些问题。一切正常,直到整个窗户都关上。然后这个监听器被触发…不管是什么原因。对我来说有点像马车,但不管怎样: 在这个侦听器上,我正在使用chrome.tabs.get函数。此函数在windows关闭时抛出一个错误: Error during tabs.get: No tab with id: 70. 这是有道理的。此时该选项卡已不存在。有人已经有办法解决这个问题了吗?一个可能的原因是在窗口关闭时删除侦听器

chrome.tabs.onSelectionChanged.addListener出现一些问题。一切正常,直到整个窗户都关上。然后这个监听器被触发…不管是什么原因。对我来说有点像马车,但不管怎样:

在这个侦听器上,我正在使用chrome.tabs.get函数。此函数在windows关闭时抛出一个错误:

Error during tabs.get: No tab with id: 70.
这是有道理的。此时该选项卡已不存在。有人已经有办法解决这个问题了吗?一个可能的原因是在窗口关闭时删除侦听器。但遗憾的是,removeListener不起作用(如果有人知道如何删除,我很感激)

最好的

编辑1.1:修改serg方法中的函数(thx用于这种方式):

首先,我尝试只捕获实际窗口的选项卡: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();
            } 
        });
    });
}
函数ensureTabExists(tabId,回调){
chrome.windows.getCurrent(函数(windows){
var=false;
windowsId=windows.id;
chrome.windows.getAll({populate:true},函数(windows){
循环:

对于(var w=0;w使用
chrome.window.onRemoved
跟踪窗口何时关闭。这样您可以更优雅地处理窗口关闭案例。

您可以在所有窗口中的所有选项卡之间循环,并检查它是否仍然存在:

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
    });
});
函数ensureTabExists(tabId,回调){
chrome.windows.getAll({populate:true},函数(windows){
var=false;
循环:

对于(w=0;wYeah,这是我的想法。但在我能够删除选项卡层上的侦听器之前,它对我来说似乎毫无用处。因此,测试了它。chrome.window.onRemoved触发器当然是在chrome.tabs.OnSelection更改之后发送的。为了防止错误,我必须设置一个计时器和一个var,表明实际上窗口已关闭。这不仅仅是一个丑陋的错误。)nd不是这个问题的真正解决方案。谢谢serg。我不想用石头杀死“bug”,但实际上这似乎是唯一的解决方案。我稍微修改了脚本(请参见编辑)。感谢这种方法!如果您只需要通过当前窗口选项卡循环,那么只需执行
chrome.tabs.getAllInWindow(null)即可
,而不是所有这些。