2016-02-29 148 views
0

如果用户没有在扩展上登录,我正在实现一个附加到页面的通知,但我只希望扩展在每个浏览器会话中执行一次,以便它们不会获得如果他们没有登录,他们访问的每个页面都会产生令人讨厌的通知。Chrome扩展后台页面状态

他们这样做的方式是通过将我的后台脚本中的布尔值初始化为false,它表示是否在之前添加了通知。

每当用户没有在背景脚本记录将收到消息和基于它上面提到的将通知他们还没有登录用户的布尔值。

background.js

var has_been_notified = false; 
chrome.extension.onMessage.addListener(function(msg, sender) { 
    if(!has_been_notified) { 
     chrome.tabs.sendMessage(sender.tab.id, "login_notification"); 
     has_been_notified = true; 
    } 
}) 

条件应该运行一次,并且一旦布尔值更改为true,就不会再次运行。这是假设后台脚本的状态在整个浏览器会话中保留并且不会再次部署。

当我测试扩展时,即使在初始通知已经触发后,一些随机页面也会收到通知。得到它的网页大约是每10页中有1页,但是我访问的网站完全是任意的。

回答

4

听起来像你试图使用"persistent": falseEvent page。这是推荐的方法,但它有责任了解它是如何工作的。

定期地,如果你的后台脚本没有做任何事情(十分之一秒),它将完全卸载。这会丢失JavaScript上下文的状态,包括所有变量。 Chrome会记住哪些事件具有侦听器,如果事件发生,则页面再次加载,然后触发事件。

如果您需要在整个浏览器会话期间保持内存中的运行时状态,请使用storage API或IndexedDB。由于事件页面不会长时间保持加载状态,因此不能再依赖运行时状态的全局变量。

所以你需要保存在chrome.storage.local状态:

// Don't use extension.sendMessage/onMessage, it's deprecated 
chrome.runtime.onMessage.addListener(function(msg, sender) { 
    chrome.storage.local.get(
     {has_been_notified: false}, // Providing a default if storage is empty 
     function(data) { 
      if(!data.has_been_notified) { 
       chrome.tabs.sendMessage(sender.tab.id, "login_notification"); 
       chrome.storage.local.set({has_been_notified: true}); 
      } 
     } 
    ); 
}); 

如果您需要在每个分机启动复位此,勾入runtime.onStartup而不是脚本执行(可重新启动反复):

chrome.runtime.onStartup.addListener(function() { 
    chrome.storage.local.set({has_been_notified: false}); 
}); 
+0

感谢您的彻底解释和反馈有关弃用。要明确,chrome.runtime.sendMessage/onMessage是否是正确的替代品? – Ephapox

+0

是的,这是直接替换。 – Xan

相关问题