gpt4 book ai didi

javascript - Firefox Addons SDK - 如何从内容脚本访问简单存储?

转载 作者:数据小太阳 更新时间:2023-10-29 04:18:36 26 4
gpt4 key购买 nike

我正在使用新的 FireFox Addons SDK 开发扩展。我有一个小部件,附有一个面板。该面板用于控制首选项,因此我需要从面板的内容脚本访问简单存储 api。我知道您不能直接访问 API,所以我尝试使用消息传递。这是我得到的:

exports.main = function() {
var panel = require('panel');
var ss = require('simple-storage');

var prefPanel = panel.Panel({
contentURL: self.data.url('prefPanel.html'),
contentScriptFile: self.data.url('prefPanel.js'),
contentScriptWhen: 'ready',
onMessage: function(message) {
switch(message.method) {
case 'setValue':
ss.storage[message.key] = message.value;
}
},
});

prefPanel.postMessage(ss.storage);


require('widget').Widget({
id: 'ml-pref-button',
content: 'ML',
width: 30,
panel: prefPanel,
})
}

在 prefPanel.js 中我有:

self.on('message', function(storage) {

storage.setValue = function(key, value) {
this[key] = value;
self.postMessage({
method: 'setValue',
'key': key,
'value': value,
});
}

// Do some stuff, using storage object

});

问题是,我得到这个错误:

Error: An exception occurred.
Traceback (most recent call last):
File "resource://jid0-wdemwzahwzh3bsw0kkxlcjg9e7k-at-jetpack-api-utils-lib/content/worker.js", line 405, in postMessage
throw new Error(ERR_DESTROYED);
Error: The page has been destroyed and can no longer be used.

我猜这是因为 prefPanel DOM 和内容脚本还没有加载。 DOM 和内容脚本是在每次显示面板时重新加载,还是始终在后台运行?

最佳答案

是的,我认为每次显示面板时都会重新加载 DOM 和内容脚本(您可以轻松测试这是否正确,只需将 console.log("loaded") 调用您的内容脚本)。因此,您应该在显示面板时简单地发送消息:

var prefPanel = panel.Panel({
contentURL: self.data.url('prefPanel.html'),
contentScriptFile: self.data.url('prefPanel.js'),
contentScriptWhen: 'ready',
onMessage: function(message) {
switch(message.method) {
case 'setValue':
ss.storage[message.key] = message.value;
}
},
onShow: function() {
prefPanel.sendMessage(ss.storage);
}
});

关于javascript - Firefox Addons SDK - 如何从内容脚本访问简单存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8732172/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com