gpt4 book ai didi

javascript - 在自定义对象上添加事件监听器

转载 作者:行者123 更新时间:2023-11-28 18:08:03 25 4
gpt4 key购买 nike

var elem =Object.create(CustomEvent.prototype)
elem.arr = [1,2,3];

elem.addEventListener("added_item", function(event) {
elem.push(10);
console.log( event.detail.name );
}, false);

var event = new CustomEvent("added_item", {
detail: { name: "Вася" }
});

elem.dispatchEvent(event);
elem.dispatchEvent(event);
elem.dispatchEvent(event);
elem.dispatchEvent(event);


console.log(elem);

index.html:40 Uncaught TypeError: elem.addEventListener is not a function

CustomEvent 仅适用于 HTMLElements?

有什么替代方案吗?

最佳答案

正如评论中所述,您需要将 elem 作为事件目标,而不是事件。 AFAIK,没有办法将内置的 EventTarget 用于您自己的目的,但 MDN 提供了 simple implementation对于您可以实例化并自己使用的 EventTarget:

var MyEventTarget = function() {
this.listeners = {};
};

MyEventTarget.prototype.listeners = null;
MyEventTarget.prototype.addEventListener = function(type, callback) {
if (!(type in this.listeners)) {
this.listeners[type] = [];
}
this.listeners[type].push(callback);
};

MyEventTarget.prototype.removeEventListener = function(type, callback) {
if (!(type in this.listeners)) {
return;
}
var stack = this.listeners[type];
for (var i = 0, l = stack.length; i < l; i++) {
if (stack[i] === callback){
stack.splice(i, 1);
return this.removeEventListener(type, callback);
}
}
};

MyEventTarget.prototype.dispatchEvent = function(event) {
if (!(event.type in this.listeners)) {
return;
}
var stack = this.listeners[event.type];
event.target = this;
for (var i = 0, l = stack.length; i < l; i++) {
stack[i].call(this, event);
}
};

var elem = new MyEventTarget()
elem.arr = [1, 2, 3];

elem.addEventListener("added_item", function(event) {
elem.arr.push(10);
console.log(event.detail.name);
}, false);

var event = new CustomEvent("added_item", {
detail: {
name: "Вася"
}
});

elem.dispatchEvent(event);
elem.dispatchEvent(event);
elem.dispatchEvent(event);
elem.dispatchEvent(event);


console.log(elem);

关于javascript - 在自定义对象上添加事件监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42199426/

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