Javascript 未捕获的TypeError:对addEventListener的非法调用

Javascript 未捕获的TypeError:对addEventListener的非法调用,javascript,addeventlistener,Javascript,Addeventlistener,我得到了一个Uncaught TypeError:非法调用,这两个版本都试图放下一个EventListener:(我在应该添加侦听器时得到错误,而不是在单击目标时) ronan.addEventListener(“单击”,警报,错误) addEventListener.apply(ronan,[“单击”,警报,假]) ronan是控制台成功返回的div元素,因此我认为这不是问题所在。知道我为什么会犯这个错误吗?我读了线程,但我无法从中理解它。您需要在函数中包装警报。这将有助于: ronan.ad

我得到了一个
Uncaught TypeError:非法调用
,这两个版本都试图放下一个EventListener:(我在应该添加侦听器时得到错误,而不是在单击目标时)

ronan.addEventListener(“单击”,警报,错误)

addEventListener.apply(ronan,[“单击”,警报,假])


ronan
是控制台成功返回的
div
元素,因此我认为这不是问题所在。知道我为什么会犯这个错误吗?我读了线程,但我无法从中理解它。

您需要在函数中包装
警报。这将有助于:

ronan.addEventListener("click", function() { alert('Hi'); }, false);
这里有一个证据。单独使用
alert
不起作用,因为在执行侦听器时,该函数中的
的值设置为它正在侦听的对象。例如,如果在
ronan
上设置一个侦听器,则在该侦听器中
this===ronan
。这会给
警报
带来问题,因为该函数期望
等于
窗口
。您可以通过将函数包装到另一个函数中或通过将其绑定到它期望的
是什么来解决此问题(并非有意使用双关语):

document.body.addEventListener('click', alert.bind(window), false);
不要忘记,在IE<9中,您需要使用
attachEvent
而不是
addEventListener


使用
apply
/
调用
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]);

也许我应该等到第二天早上才提交这封信,可能是
警报
。。。本机函数。空白的
function(){}
在它的位置工作吗?@Artur Sapek你绝对肯定
ronan
是HTMLLevel吗?如果是这样的话,你能发布代码集的值吗?另外,如果你能提供一个演示页面的链接,那就太好了。顺便问一下,你说的是哪一天早上?欧洲现在是早晨,南美洲现在是凌晨。第二行不是应该是
ronan.addEventListener.apply(…
而不是
addEventListener.apply(…
)?第二行使用
apply
-应该是
Htmlement.prototype.addEventListener.apply(ronan,[function(){}]);
。哦,word,你说得对。事实上,我甚至没有使用prototype对象,只是使用了base,但你的方法在没有prototype部分的情况下仍然有效。我可能应该知道bind(),因为我的JS非常关注DOM。非常感谢你的时间!