我正在开发一个使用事件的应用程序。该应用程序的模块在单独的容器中执行,我想使用代理来驯服触发的事件。但是,我似乎无法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
接受代理?
可能是一个老问题,但它可能会帮助某人,因为我没有找到类似的问答。
正如评论中指出的:
代理不会创建完全透明的替换对象。
您也可以注销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);
}