我正在编写chrome扩展程序,在某些网站中,chrome.tabs.onUpdated.addListener()被调用两次。
如果我点击一个链接而不是我自己键入一个URL,则会发生这种情况。
根据我在网络上发现的内容以及StackOverflow上提出的许多问题,Chrome上存在一个错误,但几年前它已修复。
如果页面中有多个iframe,有些人声称会发生这种情况,但在我的情况下,我的页面中没有iframe。
这是我的代码:
App store
如何让它只运行一次?
感谢。
答案 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]});
}
});
}
});
这只是一个如何实现它的例子。根据您的需要调整它。
我希望这会有所帮助。