【问题标题】:Chrome Extension background page stateChrome 扩展后台页面状态
【发布时间】:2016-02-29 19:52:14
【问题描述】:

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

我这样做的方法是将我的后台脚本中的布尔值初始化为 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,条件应该运行一次并且永远不会再次运行。这是在后台脚本的状态在整个浏览器会话期间被保留并且永远不会再次部署的假设下。

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

【问题讨论】:

    标签: google-chrome google-chrome-extension


    【解决方案1】:

    听起来您正在尝试使用"persistent": false Event 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});
    });
    

    【讨论】:

    • 感谢您的详尽解释和有关弃用的提示。需要明确的是,chrome.runtime.sendMessage/onMessage 是正确的替代品?
    • 是的,它是替代品。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    • 2013-02-07
    • 2012-10-30
    • 1970-01-01
    • 2013-02-02
    • 2015-06-21
    相关资源
    最近更新 更多