javascript - 未捕获的类型错误 : Illegal invocation on addEventListener

标签 javascript addeventlistener

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

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

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

ronan 是控制台成功返回的 div 元素,所以我认为这不是问题所在。为什么我会收到此错误的任何想法?我读了this线程,我无法从中弄清楚。

最佳答案

您需要将 alert 包装在一个函数中。这将起作用:

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

这是一个 fiddle为证。单独使用 alert 是行不通的,因为当一个监听器被执行时,该函数内的 this 的值被设置为它正在监听的对象。例如,如果您在 ronan 上设置监听器,则在该监听器内 this === ronan。这给 alert 带来了问题,因为该函数期望 this 等于 window。您可以通过将函数包装在另一个函数中或将其绑定(bind)到它期望 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]);

关于javascript - 未捕获的类型错误 : Illegal invocation on addEventListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7213369/

相关文章:

javascript - Atlassian 的 Jira 中的 CSS 类名被混淆了

javascript - 如何检查表单的所有字段是否已填写?

Javascript 事件监听器失败,因为 "undefined"不是函数

javascript - 为什么 addEventListener 在事件发生之前触发?

javascript - v-for 循环项目不会立即在 Vue 中更新

javascript - Chart.js 未显示在在线站点上

javascript - 使用 React 时如何正确地将事件监听器添加到输入

javascript - 为什么我一直收到 .addEventListener is not a function?

javascript - React js - this.state 中的 API 响应是空对象

javascript - react : Using arrow function to pass a prop