在使用chrome.tabs.onUpdated.addListener后访问给定URL时删除侦听器

flo*_*flo 5 javascript google-chrome-extension

这是我的问题:我正在为Gmail开发Chrome扩展程序,并且需要在更新扩展程序时应用一些更改.

例如,我想确保在扩展程序更新后,扩展程序会在Gmail中显示警告对话框.这意味着要检查Gmail在更新时是否已在Chrome窗口中打开,如果没有创建侦听器以便等待将来加载Gmail,然后再显示警告对话框.

下面的代码就是这样.但是,当发现新的Gmail选项卡时,我无法删除侦听器(chrome.tabs.onUpdated.removeListener?).

background.js

     // [...] code before
    // Reload Tabs where Gmail is active
    function reloadTab(order) {
        chrome.windows.getCurrent(function(win) {
            var cwin = win.id;
            chrome.tabs.query({windowId: cwin}, function(tabs) {
                var countGmailTabs = 0;
                for (var i = 0; i < tabs.length; i++) {
                    var t = tabs[i].url;
                    if (t.match('mail.google.com')) {
                        countGmailTabs += 1;
                        if (order === 'set') {
                            chrome.tabs.reload(tabs[i].id);
                        } else if (order !== 'set') {
                            var GmailTab = tabs[i];
                            NewGmailURL(order, GmailTab);
                            return;
                        }
                    }
                }
                // Gmail not found !
                if (countGmailTabs < 1 && order !== 'set') {
                    chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
                        if ( tab.url.match('mail.google.com') && changeInfo.status === 'loading' ) {
                            NewGmailURL('update', tab);
                            return;
                            // Everything OK, now remove listener. How?
                        }
                    });
                }
            });
        });
    }
    // [...]
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助!

有关信息,由于URL参数,将显示警告对话框.

// Modify Gmail URL
var updated = false;
    function NewGmailURL(param, ztab) {
        if (param === 'updated') {
            urlMyExtension = ztab.url.replace(urlGmail + '?query=update&', urlGmail +'?query=' + param + '&');
        } else {
            urlMyExtension = ztab.url.replace(urlGmail, urlGmail + '?query=' + param + '&');
        }
        if (!done && param !== 'updated') {
        chrome.tabs.update(ztab.id, {
            url: urlMyExtension,
            highlighted: ztab.highlighted
        }, null);
        updated = true;
        }
    }
Run Code Online (Sandbox Code Playgroud)

[更新]答案

如果有人遇到同样的问题,这里是@ExpertSystem的答案:

// Listen to Tabs URL
    function myListener(tabId, info, tab) {
        if (tab.url.match("mail.google.com") && (info.status === "loading")) {
            NewGmailURL("update", tab);
            /* Now, let's relieve ourselves from our listener duties */
            chrome.tabs.onUpdated.removeListener(myListener);
            return;
        }
    }

// Reload Tabs where Gmail is active
function reloadTab(order) {
    chrome.tabs.query({ currentWindow: true }, function(tabs) {
            var countGmailTabs = 0;
            for (var i = 0; i < tabs.length; i++) {
                var t = tabs[i].url;
                if (t.match('mail.google.com')) {
                    countGmailTabs += 1;
                    if (order === 'set') {
                        chrome.tabs.reload(tabs[i].id);
                    } else if (order !== 'set') {
                        var GmailTab = tabs[i];
                        NewGmailURL(order, GmailTab);
                        return;
                    }
                }
            }
            // Gmail not found !
            if (countGmailTabs < 1 && order !== 'set') {
                chrome.tabs.onUpdated.addListener(GmailListener);
            }
    });
}
Run Code Online (Sandbox Code Playgroud)

gka*_*pak 8

为了能够删除侦听器,请不要将其实现为匿名函数.将其实现为"命名"函数,允许您在调用时更改它removeListener().
例如:

/* Change this: */
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {...});

/* To this: */
function myListener(tabId, info, tab) {
    if (tab.url.match("mail.google.com") && (info.status === "loading")) {
        NewGmailURL("update", tab);
        /* Now, let's relieve ourselves from our listener duties */
        chrome.tabs.onUpdated.removeListener(myListener);
        return;
    }
});
chrome.tabs.onUpdated.addListener(myListener);
Run Code Online (Sandbox Code Playgroud)

顺便说一下,(与你的问题无关,但是)你正在做几个超级电话:

您不需要获取当前窗口然后获取其选项卡,如下所示:

chrome.windows.getCurrent(function(win) {
    var cwin = win.id;
    chrome.tabs.query({windowId: cwin}, function(tabs) {
    ...
Run Code Online (Sandbox Code Playgroud)

您可以在一个调用中执行此操作,如下所示:(
另请参阅chrome.windows.getCurrent())

chrome.window.getCurrent({ populate: true }, function(win) {
    var tabs = win.tabs;
    ...
Run Code Online (Sandbox Code Playgroud)

或者甚至像这样:(
另见chrome.tabs.query())

chrome.tabs.query({ currentWindow: true }, function(tabs) {
...
Run Code Online (Sandbox Code Playgroud)