Firefox Web 扩展 "Can't access dead object" 错误
Firefox Web Extension "Can't access dead object" error
我找不到这个问题的最新答案,而且通常没有时间在这里回答问题,所以我想 post 这样我就可以回答我自己的问题了因为我找到了解决办法。
我正在为 Chrome 和 Firefox 制作 Web 扩展。 Firefox 有这个问题,当我从选项页面 JS 调用后台函数将一些数据设置为后台页面中的 var,然后关闭选项页面时,当后台代码稍后尝试时出现错误 "Can't access dead object"访问已设置的变量。这是代码:
options.js
formInOptions.addEventListener('submit', function(e){
e.preventDefault();
chrome.extension.getBackgroundPage().defaults({
keyname: e.target['form-field'].value
}, function(){
// data saved cb
});
});
background.js
function defaults(oNewDefaults) {
// Global oDefaults already exists, and trying to access this after the options page is closed causes the error.
chrome.storage.local.get({
config: {}
}, function(data) {
let config = data.config;
config.defaults = config.defaults || {};
config.defaults = Object.assign(config.defaults, oNewDefaults); // Merge incoming obj into existing obj
chrome.storage.local.set({
config: config
}, function() {
oDefaults = config.defaults;
});
});
};
为了防止错误,我的解决方案是对传入的 JS obj 进行字符串化,然后重新解析,如下所示:config.defaults = Object.assign(JSON.parse(JSON.stringify(config.defaults)), JSON.parse(JSON.stringify(oNewDefaults)));
我找不到这个问题的最新答案,而且通常没有时间在这里回答问题,所以我想 post 这样我就可以回答我自己的问题了因为我找到了解决办法。
我正在为 Chrome 和 Firefox 制作 Web 扩展。 Firefox 有这个问题,当我从选项页面 JS 调用后台函数将一些数据设置为后台页面中的 var,然后关闭选项页面时,当后台代码稍后尝试时出现错误 "Can't access dead object"访问已设置的变量。这是代码:
options.js
formInOptions.addEventListener('submit', function(e){
e.preventDefault();
chrome.extension.getBackgroundPage().defaults({
keyname: e.target['form-field'].value
}, function(){
// data saved cb
});
});
background.js
function defaults(oNewDefaults) {
// Global oDefaults already exists, and trying to access this after the options page is closed causes the error.
chrome.storage.local.get({
config: {}
}, function(data) {
let config = data.config;
config.defaults = config.defaults || {};
config.defaults = Object.assign(config.defaults, oNewDefaults); // Merge incoming obj into existing obj
chrome.storage.local.set({
config: config
}, function() {
oDefaults = config.defaults;
});
});
};
为了防止错误,我的解决方案是对传入的 JS obj 进行字符串化,然后重新解析,如下所示:config.defaults = Object.assign(JSON.parse(JSON.stringify(config.defaults)), JSON.parse(JSON.stringify(oNewDefaults)));