Chrome扩展程序:选项卡监听器onSelectionChanged

时间:2011-08-21 17:59:20

标签: google-chrome-extension listener

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

2 个答案:

答案 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跟踪窗口关闭的时间。这样你就可以更优雅地处理窗口关闭案例。