javascript - JS removeEventListener 里面有函数
问题描述
我在按钮上创建了一个带有事件侦听器的函数搜索。问题是 removeEventListener 不起作用,因为 init() 在其中执行。因此,每次单击按钮时都会复制 EventListener。如果我删除 init() 一切都很好。也许我误解了它?
此外,如果我删除函数搜索并且只使用 const 我知道它会触发。但重点是我需要使用搜索。
function search(data) {
const clickHandler = () => {
console.log('search');
init();
};
document.getElementById('search').removeEventListener('click', clickHandler);
document.getElementById('search').addEventListener('click', clickHandler);
}
search(data);
function init() {
console.log('hello');
}
console results:
first time; hello
second time; hello hello
third time; hello hello hello hello
解决方案
这里的问题是范围界定。当您将函数放入另一个函数时,它的作用域就是该函数。所以下次你调用这个函数时,你会创建一个新函数。因此,您正在尝试删除以前不存在的功能。
function clickHandler2() {
console.log('world');
}
function search() {
const clickHandler = () => {
console.log('hello');
};
document.getElementById('search').removeEventListener('click', clickHandler);
document.getElementById('search').addEventListener('click', clickHandler);
document.getElementById('search').removeEventListener('click', clickHandler2);
document.getElementById('search').addEventListener('click', clickHandler2);
}
search();
search();
search();
<button type="button" id="search">Search</button>
推荐阅读
- c# - 如何用 ASP Core 运行爬虫,服务交互和生命周期问题
- ios - 使用“flutter attach”命令附加到应用程序时如何触发断点?
- android - 用户列表在android中为空
- database - 在不同的数据库版本之间导出和导入 (Oracle)
- python - 类的未解析属性引用“对象”
- amazon-web-services - 尝试使用 moto 模拟 s3 时出现 NoSuchBucket 错误
- c# - 在没有文件预览的情况下打印 pdf 文件
- c# - 如何在 C# 中将 wpf 项目包含到 Windows 窗体项目中
- html - 仅在单击标签时执行 perl 代码
- python - 使用 Pandas DataFrame 在网站 URL 上进行模式匹配