如果用户未登录该扩展程序,我将实现一个附加到页面的通知,但我只希望该扩展程序在每个浏览器会话中执行一次此操作,这样,如果他们访问的每个页面,他们都不会收到烦人的通知他们尚未登录。
他们这样做的方式是将背景脚本中的布尔值初始化为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时,条件条件应该运行一次,并且永远不再运行。这是基于以下假设:后台脚本的状态在整个浏览器会话中都会保留,并且永远不会再次部署。
在测试扩展程序时,即使在初始通知触发后,一些随机页面也会收到通知。获得该页面的页面大约占十分之一,但完全不受我访问的网站的影响。
听起来您正在尝试使用“"persistent": false
事件”页面。这是推荐的方法,但它有责任了解其工作方式。
如果您的后台脚本有一段时间没有执行任何操作(以十分之一秒为单位),则该脚本会定期完全卸载。这会丢失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});
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句