我一直在开发Chrome扩展程序。
为了正常工作,它必须使用CustomEvent将网站设置的全局窗口变量传递给扩展程序的主脚本。
当页面加载到活动选项卡中时,这通常可以正常工作,但是每当将页面加载为非焦点选项卡时,或者当扩展脚本的执行被延迟时,侦听器接收到的事件对象都有一个{{1} } detail属性。
请清楚一点,事件的整个细节对象都是addItem(e) {
let clickObj = e.currentTarget;
let newPrice = parseInt(clickObj.getAttribute('itemprice'));
this.setState({
price: this.state.price + newPrice
});
}
,而不仅仅是所需的变量。我已经通过将所需的变量作为JSON字符串附加到文档中来解决此问题,但我想了解事件出了什么问题。
相关代码如下。
manifest.json:
null
main.js:
null
injectedScript.js:
"content_scripts": [ {
"js": [ "main.js", "jquery-3.3.1.js"],
"matches": [ "*://*.site.com/*"],
"run_at": "document_end"
} ],
"permissions": [ "declarativeContent", "activeTab", "storage", "*://*.site.com/*" ],
"web_accessible_resources": [ "injectedScript.js" ]
答案 0 :(得分:0)
解决方法/修复程序是通过JSON简单地“清理”数据:
document.dispatchEvent(
new CustomEvent('globalPasser',
JSON.parse(JSON.stringify({
detail: {
variable: neededGlobalVariable
}
}))
)
);
在这种情况下,问题是由数据中存在JS函数引起的,有时是在站点仍在处理某些内容时引起的。 DOM节点会引起同样的问题。
有意或无意,但是Chrome终止了对整个detail
对象的序列化,并将其自https://crbug.com/85158开始以null
的形式进行传输,并且这种行为与扩展消息传递有奇怪的区别,扩展消息传递跳过了此类不可序列化的内容:{foo: functionRef, bar: 123}
作为{bar: 123}
进行传输。