Chrome扩展程序可以只检测一次URL吗?
我正在使用以下代码来检测用户是否即将访问特定网站。Chrome扩展程序可以只检测一次URL吗?
var array = ["foo.bar", "foo.com", "foo.org"];
chrome.tabs.onUpdated.addListener(function (id, info, tab) {
for (var i = 0, len = array.length; i < len; i++) {
if (tab.url.indexOf(array[i]) != -1) {
chrome.notifications.create('main', {
type: 'basic',
iconUrl: 'icon.png',
title: 'Title Message',
message: 'Message Body'
}, function(notificationId) {});
}
}});
的问题是,它每次运行用户导航内foo.com
例如。有没有办法只检测一次该网址,并且每次点击该网站中的链接时都不会显示通知?
我是新来的JavaScript和Chrome扩展API,所以希望我可以跟着。
编辑 - 为了澄清问题,我希望它在用户在页面上时只检测一次URL。但是,如果他们导航到另一个页面,它会再次检测到该URL。例如,用户转到foo.com并显示通知。用户在页面周围导航,并且通知不会为这些导航而跳闸。用户转到google.com,然后返回到foo.com,并再次显示通知。
所以,你的要求是:
- 当用户第一次浏览到有问题的部位,显示通知
- 只要用户该站点内导航,不要做任何
- 如果用户导航(对于特定的选项卡),“重新启动”该机制
所以基本上,我们从那里拿走的是你需要存储1位价值的信息(“武装”/“disarme d“)每个标签(或具体而言,每个标签ID)。在浏览器会话之间不需要持久性,所以只需要一个持久的背景页面就足够了(如果您想使用活动页面,则需要chrome.storage
,但它不在回答的范围内)。
下面是一个例子,以“报警” /“陷阱”术语一致:
var disarmed = {}; // Will contain tab IDs that are disarmed
// disarmed[tabId] is false by default
var hosts = ["foo.bar", "foo.com", "foo.org"];
chrome.tabs.onUpdated.addListener(function (id, info, tab) {
var trigger = false; // Determines if our condition is met
hosts.forEach(function(hostname) {
// Note: this is a bad condition - will trigger on http://example.com/?q=foo.com
// But that's for you to fix
if (tab.url.indexOf(hostname) != -1) {
trigger = true;
}
});
if (trigger) {
// Condition satisfied, see if we need to notify
if (!disarmed[tab.id]) {
notify(tab); // You may want to know the URL in notify()
disarmed[tab.id] = true;
}
} else {
// Condition no longer satisfied, rearm
disarmed[tab.id] = false;
}
});
function notify(tab) {
chrome.notifications.create('main', {
type: 'basic',
iconUrl: 'icon.png',
title: 'Title Message',
message: 'Message Body'
}, function(notificationId) {});
}
一点点在这里关注的是,随着时间的推移,disarmed
的大小会增加。如果每个标签ID只有一个值,那么很可能不会增加,但当标签被移除(onRemoved
)或替换(onReplaced
- 您需要更改时也需要注意)时,您可以清除其中的条目(delete disarmed[tabId]
)。
非常感谢解决方案。我注意到它不会每次都被调用,并且我发现[this](http://stackoverflow.com/a/21227525/2018846),我想它正在发生。我加了'if(info.status ==“complete”){// arm/disarm code}',但它似乎仍然不能100%的工作。任何想法可能会发生什么? –
可能你也必须观看'onReplaced'。或者,实际上,可以考虑使用'webNavigation' API。 – Xan
感谢您的帮助!我发现通知是在第一次加载页面时创建的并不重要。它通常会在第二页上被捕获(谷歌中的第一个导航栏。com),这对我所需要的没有问题。不过谢谢你!非常感激。 –
太宽泛。在扩展官方文档中阅读存储和后台脚本的基础知识。 –
只有一次..什么?天?浏览会话,直到重新启动?延期的生命期? – Xan
@Xan我已经添加了对该问题的编辑。 –