我尝试使用以下两种方式添加事件监听器,但都遇到了“非法调用”的类型错误:(当应该添加监听器时出现错误,而不是在单击目标时)
ronan.addEventListener("click", alert, false);
addEventListener.apply(ronan, ["click", alert, false]);
ronan
是一个 div
元素,控制台可以成功返回它,因此我认为这不是问题所在。你有什么想法,为什么会出现此错误?我阅读了此文,但没有从中找到答案。
我尝试使用以下两种方式添加事件监听器,但都遇到了“非法调用”的类型错误:(当应该添加监听器时出现错误,而不是在单击目标时)
ronan.addEventListener("click", alert, false);
addEventListener.apply(ronan, ["click", alert, false]);
ronan
是一个 div
元素,控制台可以成功返回它,因此我认为这不是问题所在。你有什么想法,为什么会出现此错误?我阅读了此文,但没有从中找到答案。
alert
包裹在一个函数中。这样做将会生效:ronan.addEventListener("click", function() { alert('Hi'); }, false);
这里有一个演示。仅使用 alert
不起作用,因为当监听器被执行时,函数内部的 this
值被设置为正在监听的对象。例如,如果在 ronan
上设置了监听器,则在该监听器内部 this === ronan
。这会对 alert
造成问题,因为该函数期望 this
等于 window
。您可以通过将函数包装在另一个函数中或将其绑定到它期望的任何对象上来解决这个问题。
document.body.addEventListener('click', alert.bind(window), false);
请注意,在IE <9中,您需要使用attachEvent
而不是addEventListener
。
关于在addEventListener
中使用apply
/call
的说明
您的第二次尝试将无法工作,因为您尝试将参数应用于window.addEventListener
,而不是HTMLElement.prototype.addEventListener
,这是完全不同的函数:
// This won't work
addEventListener.apply(ronan, ["click", alert.bind(window), false]);
// This will work
HTMLElement.prototype.addEventListener.apply(ronan, ['click', alert.bind(window), false]);
alert
原生函数的问题。一个空白的function(){}
能否替代它? - Jamesapply
的第一个参数是原型,这就是我理解中apply
的重点。 @phihag:调用元素的代码在我的JS中的许多其他地方都成功使用。它很长而且不相关,但当我在控制台输入ronan
时,我会得到以下返回值:<div style="position: relative; top: 37px; left: 10px; margin-bottom: 5px; height: 37px; " id="bandRonan Delisle Quartet" class="all">…</div>
- Artur Sapekapply
- 应该是HTMLElement.prototype.addEventListener.apply(ronan, [function () { }]);
。 - MatthewattachEvent
而不是addEventListener
。 - Matthew