[英]Event listener receives null detail if run after document loads
我一直在为Chrome扩展程序。
为了正常工作,它必须使用CustomEvent将网站设置的全局窗口变量传递给扩展程序的主脚本。
当页面被加载到活动选项卡中时,这通常可以正常工作,但是每当页面被作为非焦点选项卡加载时,或者当扩展脚本的执行被延迟时,侦听器接收到的事件对象都将具有null
detail属性。
只需清楚一点,该事件的整个detail对象为null
,而不仅仅是所需的变量。 我已经通过将所需的变量作为JSON字符串附加到文档中来解决此问题,但我想了解事件出了什么问题。
代码的相关部分如下。
manifest.json的:
"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" ]
main.js:
$(function() {
document.addEventListener('globalPasser', function(response) {
if(response.detail){
// store variables
}
}, true);
var passGlobals = document.createElement('script');
passGlobals.src = chrome.extension.getURL('injectedScript.js');
(document.head||document.documentElement).appendChild(passGlobals);
passGlobals.onload = function() {
passGlobals.remove();
};
}
injectedScript.js:
var newEvent = new CustomEvent('globalPasser', {detail:{variable: neededGlobalVariable}});
document.dispatchEvent(newEvent);
解决方法/修补程序是通过JSON简单地“清理”数据:
document.dispatchEvent(
new CustomEvent('globalPasser',
JSON.parse(JSON.stringify({
detail: {
variable: neededGlobalVariable
}
}))
)
);
这种情况下的问题是由数据中存在JS函数引起的,有时是在站点仍在处理某些内容时引起的。 DOM节点会引起同样的问题。
有意或无意,但是Chrome从https://crbug.com/85158开始中止序列化整个detail
对象并将其传输为null
,并且此行为与扩展消息传递异乎寻常地不同,扩展消息传递跳过了此类不可序列化的内容: {foo: functionRef, bar: 123}
被传送为{bar: 123}
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.