addEventListener上的非法调用

时间:2014-03-27 19:36:07

标签: javascript events javascript-events addeventlistener prototypal-inheritance

使用jQuery,您可以在任何jQuery对象上使用.on() / .off() / .trigger()方法,从而为您提供对事件系统的强大访问。我正试图在vanilla JavaScript中做类似的事情,但我一直遇到"TypeError: Illegal Invocation"。我知道这个错误通常是指当方法需要时会丢失this引用。使用.apply.call似乎通常可以解决问题,但我仍遇到问题。

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

EventTarget.prototype

当我尝试在EventEnabled的一个实例上调用这三个方法中的任何一个时,我得到一个“TypeError:Illegal Invocation”。

感谢您对此有任何见解!

1 个答案:

答案 0 :(得分:6)

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

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