问题描述
此脚本在粘贴到FireFox下的开发人员控制台中时有效,但在作为Greasemonkey脚本运行时不起作用,我不确定为什么。没有关于“扩展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中运行时,构造函数运行,它调度事件但不接收事件。在控制台上,它可以完成所有三件事。
解决方法
Greasemonkey在沙箱中运行,我想这就是为什么您无法捕获事件的原因。
尝试扩展window.EventTarget
-这对我有用,尽管我还没有弄清楚原因。
脚本中的EventTarget
和window.EventTarget
似乎是不同的功能。 (您可以在脚本中的console.log(EventTarget == window.EventTarget)
行中轻松地进行验证)。