如何使用 JavaScript EventTarget? [英] How to use JavaScript EventTarget?
本文介绍了如何使用 JavaScript EventTarget?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想在我的客户端程序中创建一个自定义事件发射器.我正在为 EventTarget
I would like to create a custom event emitter in my client-side programs. I am referencing this (sparse) documentation for EventTarget
我的实施尝试
var Emitter = function Emitter() {
EventTarget.call(this);
};
Emitter.prototype = Object.create(EventTarget.prototype, {
constructor: {
value: Emitter
}
});
我想要的用途
var e = new Emitter();
e.addEventListener("hello", function() {
console.log("hello there!");
});
e.dispatchEvent(new Event("hello"));
// "hello there!"
失败的地方
var e = new Emitter();
// TypeError: Illegal constructor
我做错了什么?
更新
以下是可能的,但它是一个依赖于虚拟 DOMElement 的 hack
The following is possible, but it's a hack that depends on a dummy DOMElement
var fake = document.createElement("phony");
fake.addEventListener("hello", function() { console.log("hello there!"); });
fake.dispatchEvent(new Event("hello"));
// "hello there!"
我想知道如何在不使用虚拟元素的情况下做到这一点
I'd like to know how to do this without having to use the dummy element
推荐答案
我之前放弃了这个,但最近又需要它.这是我最终使用的.
I gave up on this awhile ago, but recently needed it again. Here's what I ended up using.
ES6
class Emitter {
constructor() {
var delegate = document.createDocumentFragment();
[
'addEventListener',
'dispatchEvent',
'removeEventListener'
].forEach(f =>
this[f] = (...xs) => delegate[f](...xs)
)
}
}
// sample class to use Emitter
class Example extends Emitter {}
// run it
var e = new Example()
e.addEventListener('something', event => console.log(event))
e.dispatchEvent(new Event('something'))
ES5
function Emitter() {
var eventTarget = document.createDocumentFragment()
function delegate(method) {
this[method] = eventTarget[method].bind(eventTarget)
}
[
"addEventListener",
"dispatchEvent",
"removeEventListener"
].forEach(delegate, this)
}
// sample class to use it
function Example() {
Emitter.call(this)
}
// run it
var e = new Example()
e.addEventListener("something", function(event) {
console.log(event)
})
e.dispatchEvent(new Event("something"))
是的!
对于那些需要支持旧版本 ecmascript 的人,这里是你
For those that need to support older versions of ecmascript, here you go
// IE < 9 compatible
function Emitter() {
var eventTarget = document.createDocumentFragment();
function addEventListener(type, listener, useCapture, wantsUntrusted) {
return eventTarget.addEventListener(type, listener, useCapture, wantsUntrusted);
}
function dispatchEvent(event) {
return eventTarget.dispatchEvent(event);
}
function removeEventListener(type, listener, useCapture) {
return eventTarget.removeEventListener(type, listener, useCapture);
}
this.addEventListener = addEventListener;
this.dispatchEvent = dispatchEvent;
this.removeEventListener = removeEventListener;
}
用法保持不变
这篇关于如何使用 JavaScript EventTarget?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文