繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM