javascript - 删除处理程序不在范围内的事件侦听器
问题描述
我的情况是我有EventListener
两个元素,并且它们具有相同的处理程序。被EventListeners
添加到函数内部,并且处理程序接受参数。
单击其中一个元素时,EventListeners
应删除这两个元素。
示例代码:
const handler = (e, x, otherEle) => {
e.target.removeEventListener('click', callHandler)
otherEle.removeEventListener('click', callHandler)
//callHandler is not defined
}
const myFunc = ()=>{
let x = 7
let ele1 = document.querySelector("#ele1")
let ele2 = document.querySelector("#ele2")
ele1.addEventListener('click', function callHandler(event){
handler(event, x, ele2)
})
ele2.addEventListener('click', function callHandler(event){
handler(event, x, ele1)
})
}
我试图将函数callHandler
作为参数传递,但没有奏效。
解决方案
您可以使用许多策略来解决此问题。最简单的可能是对具有 ID 的元素的引用已经在全局范围内可用,因此您可以将它们作为常规变量或从window
对象中引用:
const handler = () => {
console.log("calling handler only once");
ele1.removeEventListener('click', handler)
ele2.removeEventListener('click', handler)
}
const myFunc = () => {
// These references to element IDs are already available in the global scope
// let ele1 = document.querySelector("#ele1")
// let ele2 = document.querySelector("#ele2")
ele1.addEventListener('click', handler);
ele2.addEventListener('click', handler);
}
myFunc();
div {
border: 1px solid black;
height: 50px;
width: 50px;
}
<div id="ele1"></div>
<div id="ele2"></div>
另一种选择是简单地使用onclick
而不是添加和删除将以相同方式工作的事件侦听器(它只会阻止侦听元素上的多个单击事件):
const handler = (e, x, otherEle) => {
console.log("calling handler only once");
e.target.onclick = null;
otherEle.onclick = null;
}
const myFunc = ()=>{
let x = 7
let ele1 = document.querySelector("#ele1")
let ele2 = document.querySelector("#ele2")
ele1.onclick = function (event) {
handler(event, x, ele2)
}
ele2.onclick = function (event) {
handler(event, x, ele1)
}
}
myFunc();
div {
border: 1px solid black;
height: 50px;
width: 50px;
}
<div id="ele1"></div>
<div id="ele2"></div>
另一种选择,虽然可能是最棘手的实现,是通过使用类似的东西来传递对函数调用中元素的引用.bind()
范围变得有点笨拙,我不确定它是否可以通过你的箭头函数实现。
ele1.addEventListener('click', handler.bind(this, ele2, x))
推荐阅读
- asp.net-core - 我需要 services.AddMvc 吗?
- r - 修复 r 排序值方法
- reactjs - 如何在 reactjs 中从 API 中查找显示错误消息
- java - 如何在 Java 的网站自动化测试中禁用警报?
- c# - 导致 DataReader 问题的嵌套 foreach 循环
- .net-core - 错误 NETSDK1032:RuntimeIdentifier 平台 'win-x86' 和 PlatformTarget 'x64' 必须兼容
- shell - 只有在没有给出文件名的情况下,我如何才能给 vim 起别名?
- r - 需要使用 Purrr::map_dfc 传递数据文件
- python - 如何在 Windows 10 上运行 tensorflow?我有 GPU Geforce gtx 1650。我可以在上面运行 tensorflow 吗?如果是,那么如何?
- amazon-web-services - 找到导致 cloudwatch 警报的确切 lambda