Chrome扩展程序可以只检测一次网址吗?

时间:2016-11-18 05:01:52

标签: javascript google-chrome-extension

我正在使用以下代码来检测用户是否即将访问特定网站。

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并再次显示通知。

1 个答案:

答案 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}} - 您还需要注意更改)。