chrome.tabs.onUpdated.addListener()被调用两次

时间:2015-12-06 09:19:28

标签: google-chrome google-chrome-extension

我正在编写chrome扩展程序,在某些网站中,chrome.tabs.onUpdated.addListener()被调用两次。

如果我点击一个链接而不是我自己键入一个URL,则会发生这种情况。

根据我在网络上发现的内容以及StackOverflow上提出的许多问题,Chrome上存在一个错误,但几年前它已修复。

如果页面中有多个iframe,有些人声称会发生这种情况,但在我的情况下,我的页面中没有iframe。

这是我的代码:

App store

如何让它只运行一次?

感谢。

1 个答案:

答案 0 :(得分:3)

使用变量并在侦听器中添加一个检查,以在执行警报之前检查此变量的值。你可以这样做:

var tabUpdated = false;
chrome.tabs.onUpdated.addListener(function (tabId, changeInfo, tab) {
    if (changeInfo.status == 'complete' && tab.status == 'complete' && tab.url != undefined) {
        if (!tabUpdated) {
            alert("tab load complete");
            tabUpdated = true;
        }
    }
});

但是如果内容脚本实际加载两次会因为tabUpdated变量再次初始化为false而失败。在这种情况下,您可以使用chrome的Storage API并存储已调用侦听器的URL。只需添加一个检查,如果存储中存在URL,则不会调用警报,否则它将调用。然后,您可以在浏览器开始或关闭时清除存储空间。

chrome.tabs.onUpdated.addListener(function (tabId, changeInfo, tab) {
    if (changeInfo.status == 'complete' && tab.status == 'complete' && tab.url != undefined) {
        chrome.local.storage.get('URLs', function(URL's) {
            // Iterate through this list here and match with tab.url, if the match is found, just return.
            if (url is there in list) {return;}
            else {
                alert("tab load complete");
                chrome.local.set({URLs: [tab.url]}); 
            }
        });
    }
});

这只是一个如何实现它的例子。根据您的需要调整它。

我希望这会有所帮助。