我为这次尝试放下一个EventListener的两个版本得到一个Uncaught TypeError: Illegal invocation
:(我应该在添加监听器时收到错误,而不是在我点击目标时)
ronan.addEventListener("click", alert, false);
addEventListener.apply(ronan, ["click", alert, false]);
ronan
是控制台成功返回的div
元素,所以我不认为这是问题所在。有什么想法我得到这个错误?我读了this帖子,我无法弄明白。
答案 0 :(得分:29)
您需要在函数中包含alert
。这将有效:
ronan.addEventListener("click", function() { alert('Hi'); }, false);
这是一个fiddle的证明。单独使用alert
不起作用,因为当执行侦听器时,该函数中的this
值将设置为它正在侦听的对象。例如,如果您在ronan
上的侦听器this === ronan
内设置了侦听器。这给alert
带来了问题,因为该函数希望this
等于window
。你可以通过将函数包装在另一个函数中或者将它绑定到它期望this
的任何函数来解决这个问题(没有双关语):
document.body.addEventListener('click', alert.bind(window), false);
不要忘记在IE< 9您需要使用attachEvent
而不是addEventListener
。
关于使用apply
/ call
与addEventListener
你的第二次尝试不起作用,因为你试图将你的论据应用于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]);