首页 > 解决方案 > 在 Greasemonkey 脚本中扩展 EventTarget 类时自定义事件 addEventListener 不起作用

问题描述

此脚本在粘贴到 FireFox 下的开发人员控制台时有效,但在作为 Greasemonkey 脚本运行时无效,我不完全确定原因。没有关于“extends EventTarget”和“dispatchEvent”的文档或大量讨论。但似乎我无法收听自定义事件。知道为什么或如何解决它吗?

// ==UserScript==
// @name     EventTarget test
// @version  1
// @grant    none
// ==/UserScript==

class evtest extends EventTarget {
    constructor() {
        super();

        console.warn( "CONSTRUCTOR OK" ); // works in GM

        var event = new CustomEvent("test_event", {
            detail: { value: 3.4, lever: false }
        });

        setTimeout(() => {
            console.warn( "DISPATCHING EVENT" ); // works in GM
            this.dispatchEvent( event );
        }, 1000);
    }
}

var test = new evtest();

test.addEventListener("test_event", (e) => {
    console.warn( "RECEIVED EVENT", e.detail ); // does NOT work in GM
});

在 GM 4.3 中运行时,构造函数运行,它调度事件但不接收它。在控制台上,它完成了所有三件事。

标签: javascriptgreasemonkeygreasemonkey-4

解决方案


Greasemonkey 在沙箱内运行,我想这就是您无法捕获事件的原因。

尝试扩展window.EventTarget- 这对我有用,虽然我还没有弄清楚为什么。

脚本中似乎EventTarget有不同的功能。(您可以使用脚本中的一行轻松验证这一点)。window.EventTargetconsole.log(EventTarget == window.EventTarget)


推荐阅读