Chrome存储onChanged事件 - 扩展程序的后台和弹出窗口之间

11
我希望存储我扩展的设置-可以通过弹出窗口进行更改。
chrome.storage.local.set({'extension-status': 'on'}, function() {
    console.log('extension on status stored');
}

当更改此设置时,在我的后台页面接收更新:

chrome.storage.onChanged.addListener(function(changes, namespace) {
     console.log("change recived!");
});

在弹出窗口的日志中,我看到了“扩展状态已存储”的消息,但在后台页面的日志中没有看到“收到更改”的消息。

我该如何对这个存储对象的更改做出反应?


4
你是实际改变这个值,还是只是将它设置为相同的值(“开启”)? - Scott
@ScottF,无论 OP 是否更改值都没有关系。如果有监听器并且您设置了该值,则每次都应调用您的监听器。我刚试过了,它可以正常工作。 - Sachin Jain
1
@blunderboy 这不是真的。打开控制台并运行:chrome.storage.onChanged.addListener(console.log.bind(console)),然后运行 chrome.storage.local.set({asdf:"on"})。你会看到变化。继续运行 chrome.storage.local.set({asdf:"on"})。不会再发送更多的变化。 - Scott
@scott 我试过了。如果你说再试一次,我会再试一次并告诉你结果。 - Sachin Jain
2
我遇到了这个问题,肯定是改变了值。后台页面没有触发任何事件。 - stickfigure
2个回答

2

这是一个旧问题,但截至2023年3月4日仍然相关。

所以对于像我一样遇到这个问题的人,这是我的解决方案。
简而言之,在Chrome中使用{{link1:storage.session,而不是storage.local}}。

storage.session在{{link2:Chrome 102可用,但在Firefox上不可用}}。

// manifest.json
{
  ...
  "permissions": [..., "storage", ...],
  "minimum_chrome_version": "102",
  ...
}

// service-worker.ts
function storageOnChanged(changes: {[key: string]: chrome.storage.StorageChange}) {
  console.log(changes); // {key : { newValue: 'value' }}
}
chrome.storage.session.setAccessLevel({ accessLevel: 'TRUSTED_AND_UNTRUSTED_CONTEXTS' });
chrome.storage.session.onChanged.addListener(storageOnChanged);

// content-script.js
chrome.storage.session.set({ key: 'value' }).then(() => {
  console.log('key is set to ' + 'value');
});

关于Firefox,嗯,我没有测试过。

1
节省了我大量的时间,谢谢。 - Gunther
将信息保存在会话中并不等同于本地保存。这引起了担忧。 - Huantao

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接