Chrome扩展程序后台页面状态

Eph*_*pox 1 google-chrome google-chrome-extension

如果用户没有登录扩展程序,我正在实现一个附加到页面的通知,但我只希望扩展程序在每个浏览器会话中执行此操作,这样他们就不会为他们访问的每个页面收到烦人的通知他们没有登录.

我这样做的方法是将我的后台脚本中的布尔值初始化为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;
    }
})
Run Code Online (Sandbox Code Playgroud)

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

当我测试扩展时,即使在初始通知被触发后,一些随机页面也会收到通知.得到它的页面大约是十分之一,但我访问的网站完全是任意的.

Xan*_*Xan 6

听起来你正试图使用​​一个"persistent": false 事件页面.这是推荐的方法,但它有责任了解它的工作原理.

如果它没有做任何事情(在十分之几秒的范围内),你的后台脚本会定期卸载.这会丢失JavaScript上下文的状态,包括所有变量.Chrome会记住哪些事件附加了侦听器,如果事件发生,页面再次加载,则会触发该事件.

如果需要在整个浏览器会话中将运行时状态保留在内存中,请使用storageAPI或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});
            }
        }
    );
});
Run Code Online (Sandbox Code Playgroud)

如果您需要在每个扩展启动时重置此项,请挂钩runtime.onStartup而不是执行脚本(可以重复重新启动):

chrome.runtime.onStartup.addListener(function() {
    chrome.storage.local.set({has_been_notified: false});
});
Run Code Online (Sandbox Code Playgroud)