gpt4 book ai didi

javascript - 如果在文档加载后运行,事件监听器将收到空详细信息

转载 作者:行者123 更新时间:2023-11-28 02:26:11 24 4
gpt4 key购买 nike

我一直在为 Chrome 开发一个扩展程序。

为了工作,它必须使用 CustomEvent 将网站设置的全局窗口变量传递给扩展程序的主脚本。
当页面在事件选项卡中加载时,这通常工作正常,但每当它作为非焦点选项卡加载时,或者当扩展脚本的执行被延迟时,监听器接收到的事件对象有一个 null 细节属性。

需要说明的是,事件的整个详细信息对象都是null,而不仅仅是所需的变量。我已经通过将所需变量作为 JSON 字符串附加到文档来解决此问题,但我想了解事件出了什么问题。

相关部分代码如下。

list .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" ]

主要.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();
};
}

注入(inject)脚本.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 节点会导致同样的问题。

https://crbug.com/85158 以来,Chrome 有意或无意地中止了整个detail 对象的序列化并将其作为null 进行传输。并且这种行为与扩展消息传递有奇怪的不同,后者会跳过此类不可序列化的内容:{foo: functionRef, bar: 123} 被传输为 {bar: 123}

关于javascript - 如果在文档加载后运行,事件监听器将收到空详细信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53898356/

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