2016-11-18 86 views
0

我正在使用以下代码来检测用户是否即将访问特定网站。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,并再次显示通知。

+0

太宽泛。在扩展官方文档中阅读存储和后台脚本的基础知识。 –

+0

只有一次..什么?天?浏览会话,直到重新启动?延期的生命期? – Xan

+0

@Xan我已经添加了对该问题的编辑。 –

回答

0

所以,你的要求是:

  • 当用户第一次浏览到有问题的部位,显示通知
  • 只要用户该站点内导航,不要做任何
  • 如果用户导航(对于特定的选项卡),“重新启动”该机制

所以基本上,我们从那里拿走的是你需要存储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])。

+0

非常感谢解决方案。我注意到它不会每次都被调用,并且我发现[this](http://stackoverflow.com/a/21227525/2018846),我想它正在发生。我加了'if(info.status ==“complete”){// arm/disarm code}',但它似乎仍然不能100%的工作。任何想法可能会发生什么? –

+0

可能你也必须观看'onReplaced'。或者,实际上,可以考虑使用'webNavigation' API。 – Xan

+0

感谢您的帮助!我发现通知是在第一次加载页面时创建的并不重要。它通常会在第二页上被捕获(谷歌中的第一个导航栏。com),这对我所需要的没有问题。不过谢谢你!非常感激。 –

相关问题