如果用户未在扩展程序上登录,我正在实施要附加到页面的通知但我只希望扩展程序在每个浏览器会话中执行此操作一次,这样他们就不会为每个页面收到烦人的通知如果他们没有登录,他们就会访问。
我这样做的方法是将后台脚本中的布尔值初始化为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,就不再运行。这是假设后台脚本的状态在整个浏览器会话中保留,并且从未再次部署。
当我测试扩展时,即使在初始通知被触发后,一些随机页面也会收到通知。获得它的页面大约是十分之一,但我访问的网站完全是任意的。
答案 0 :(得分:6)
听起来您正在尝试使用UIScrollView
blogpost。这是推荐的方法,但它有责任了解它的工作原理。
如果没有做任何事情(以十分之几秒为单位),您的后台脚本会定期卸载。这会丢失JavaScript上下文的状态,包括所有变量。 Chrome会记住哪些事件附加了侦听器,如果事件发生,页面再次加载,则会触发该事件。
如果需要在整个浏览器会话期间将运行时状态保留在内存中,请使用Event page或IndexedDB。由于事件页面不会长时间保持加载状态,因此您无法再依赖全局变量来运行状态。
因此,您需要在contentSize
中保存状态:
"persistent": false
如果您需要在每次扩展启动时重置此项,请挂钩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});
}
}
);
});