gpt4 book ai didi

javascript - 非法调用 addEventListener

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:33:57 29 4
gpt4 key购买 nike

使用 jQuery,您可以在任何 jQuery 对象上使用 .on()/.off()/.trigger() 方法,给出您对事件系统的强大访问权限。我正在尝试在 vanilla JavaScript 中做一些类似的事情,但我一直遇到 "TypeError: Illegal Invocation"。我知道此错误通常是指在方法需要引用时丢失了 this 引用。使用 .apply.call 似乎通常可以解决问题,但我仍然遇到问题。

具体来说,我正在尝试创建一个启用事件的“类”,然后我可以从中扩展其他类,从而为我提供一种监听和触发非 DOM 对象事件的方法。 (是的,我知道 JS 没有真正的类。我正在使用 CoffeeScript,这就是那里使用的语法糖。)这是“类”函数,它创建一个新对象,该对象具有与传递给的对象相同的属性和值构造函数,并提供了 .apply() 来自 EventTarget.prototype 的三个方法。非常感谢任何有关如何使这项工作正常进行的指导!

EventEnabled = (function() {
function EventEnabled(obj) {
var key, val;
for (key in obj) {
val = obj[key];
this[key] = val;
}
}

EventEnabled.prototype.addEventListener = function() {
return EventTarget.prototype.addEventListener.apply(this, arguments);
};

EventEnabled.prototype.removeEventListener = function() {
return EventTarget.prototype.removeEventListener.apply(this, arguments);
};

EventEnabled.prototype.dispatchEvent = function() {
return EventTarget.prototype.dispatchEvent.apply(this, arguments);
};

return EventEnabled;

})();

当我尝试在 EventEnabled 的实例上调用这三种方法中的任何一种时,我得到:

"TypeError: Illegal Invocation".

感谢您对此的任何见解!

最佳答案

EventTarget 只是一个 interface它是在 native DOM 对象上实现的,而不是可用于 javascript 的构造函数。虽然它可能在全局范围内可用,但您不能使用它来实例化它的实例。

此外,您只能将其方法应用于 native 实现该接口(interface)的对象(如 DOM 元素),而不能应用于 EventEnabled 构造函数的任意实例。您将需要创建一个内部节点,或者您将需要实现您自己的事件调度系统(如果您不想使用许多可用库中的任何一个)。

关于javascript - 非法调用 addEventListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22697502/

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