gpt4 book ai didi

javascript - 如何使用 JavaScript EventTarget?

转载 作者:行者123 更新时间:2023-12-02 23:36:38 25 4
gpt4 key购买 nike

我想在我的客户端程序中创建一个自定义事件发射器。我正在引用此(稀疏)文档 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

var fake = document.createElement("phony");
fake.addEventListener("hello", function() { console.log("hello there!"); });
fake.dispatchEvent(new Event("hello"));
// "hello there!"

我想知道如何在不使用虚拟元素的情况下执行此操作

最佳答案

我不久前放弃了这个,但最近又需要它。这是我最终使用的。

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 的人,这里是

// 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 - 如何使用 JavaScript EventTarget?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22186467/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com