我正在使用以下代码来检测用户是否即将访问特定网站。
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
内的时,它就会运行。有没有办法只检测一次该URL,并在每次点击该站点中的链接时停止显示该通知?
我是javascript和Chrome扩展API的新手,所以希望我能跟进。
编辑 - 澄清问题,我希望在用户在页面上时只检测一次URL。但是如果他们导航到另一个页面,它将再次检测到该URL。例如,用户访问foo.com并显示通知。用户在页面周围导航,并且不会为这些导航触发通知。用户访问google.com然后返回foo.com并再次显示通知。
答案 0 :(得分:0)
所以你的要求是:
所以基本上,我们从中获取的是你需要存储1比特的信息(“武装”/“解除武装”)每个标签(或者具体地说,每个标签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只有一个值,它不太可能增长很多,但是当删除标签(delete disarmed[tabId]
)或替换标签时,您可以清除其中的条目(onRemoved
)({ {1}} - 您还需要注意更改)。