未捕获的TypeError:addEventListener上的非法调用

时间:2011-08-27 08:25:23

标签: javascript addeventlistener

我为这次尝试放下一个EventListener的两个版本得到一个Uncaught TypeError: Illegal invocation :(我应该在添加监听器时收到错误,而不是在我点击目标时)

ronan.addEventListener("click", alert, false);

addEventListener.apply(ronan, ["click", alert, false]);

ronan是控制台成功返回的div元素,所以我不认为这是问题所在。有什么想法我得到这个错误?我读了this帖子,我无法弄明白。

1 个答案:

答案 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 / calladdEventListener

的说明

你的第二次尝试不起作用,因为你试图将你的论据应用于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]);