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

时间:2018-12-22 18:39:27

标签: javascript html dom google-chrome-extension

我一直在开发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" ]

1 个答案:

答案 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}进行传输。