未捕获的类型错误:非法调用addEventListener

Uncaught TypeError: Illegal invocation on addEventListener

本文关键字:非法 调用 addEventListener 错误 类型      更新时间:2023-09-26

我得到了这个尝试放下EventListener的两个版本的Uncaught TypeError: Illegal invocation:(当应该添加侦听器时,我得到错误,而不是当我单击目标时)

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

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

ronandiv元素,由控制台成功返回,所以我不认为这是问题所在。知道为什么会出现这个错误吗?

您需要将alert封装在函数中。

ronan.addEventListener("click", function() { alert('Hi'); }, false);

这里有一把小提琴作为证据。单独使用alert不起作用,因为当执行侦听器时,该函数中的this的值被设置为侦听的对象。例如,如果在ronan上设置侦听器,则在该侦听器中this === ronan。这给alert带来了一个问题,因为该函数期望this等于window。您可以通过将函数包装在另一个函数中或将其绑定到它期望的this来解决这个问题(没有双关语):

document.body.addEventListener('click', alert.bind(window), false);

不要忘记在IE <你需要使用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]);