dispatchEvent(新的Proxy(事件,{})不起作用

时间:2018-09-06 20:19:44

标签: javascript ecmascript-6 javascript-events dispatchevent es6-proxy

我正在开发一个使用事件的应用程序。该应用程序的模块在单独的容器中执行,我考虑过使用代理来处理被触发的事件。但是,我似乎无法使dispatchEvent接受已代理的事件。

以下失败:

let event = new CustomEvent('my event');
let eventProxy = new Proxy(event, {});
let eventTarget = document.createElement('div');

try {
    eventTarget.dispatchEvent(eventProxy); // VM134:4 Uncaught TypeError: Failed to execute 'dispatchEvent' on 'EventTarget': parameter 1 is not of type 'Event'
} catch(error) {
    console.log(error.message);
}

任何人都知道如何使dispatchEvent可以接受代理吗?

1 个答案:

答案 0 :(得分:0)

可能是一个老问题,但它可能对某人有所帮助,因为我没有找到类似的问答。

正如评论中所指出的:

<块引用>

代理不会创建完全透明的替换对象。

您也可以退出 eventProxy 并看到大多数属性都无法被指控。

我的建议是用一个具有返回事件的函数的对象包装您的 Event。 (对于多个事件,您甚至可以使用该对象作为所有事件的网关)。

然后,通过调用该函数来调度返回的事件。

现在,当您代理新对象时,您可以覆盖处理程序中的 get 以记录调用。

let event = new CustomEvent('my event');
let eventWrapper = { getEvent: ()=> event };
let handler = {
get: function(target, thisArg, argumentsList) {
    console.log('Logged!');
    return Reflect.get(...arguments)
  }
}
let eventProxy = new Proxy(eventWrapper, handler);
let eventTarget = document.createElement('div');

try {
    eventTarget.dispatchEvent(eventProxy.getEvent());
    console.log("Done!")
} catch(error) {
    console.log(error.message);
}