addEventListener多次触发,removeEventListener不生效问题

这两天写了个小功能封装成api供别人使用,在开发中遇到了些问题,记录下。

项目情况是有地方触发多次执行这部分代码,所以我想在每次add前先remove掉。

用addEventListener绑定事件,但是addEventListener可以给同一元素多次绑定同一事件,导致多次触发。

然后就想到用removeEventListener来移除之前绑定的事件。但是,一切都没有那么顺利...

第一次尝试:

var clearBtn = document.querySelector('.clear_handPanel')

// 无效
clearBtn.removeEventListener('click', function () {
    console.log(111)
})

clearBtn.addEventListener('click', function () {
    console.log(111)
})

但是这样是无效的,监听的事件看起来和移除的事件是一样的,但是两个方法并不相同,他们的内存是不一样的,这点在使用时一定要注意。

第二次尝试:

var clearBtn = document.querySelector('.clear_handPanel')

function handleClear () {
    console.log(111)
}

clearBtn.removeEventListener('click', handleClear)

clearBtn.addEventListener('click', handleClear)

这种处理若是先addEventListener再removeEventListener是可以把刚刚add的remove掉的。

但是,项目情况比较特殊,我这里先removeEventListener是想把上一次add的remove掉,再重新add,这样就不会触发多次执行。但是问题又来了,再执行一次时,这个方法也重新声明了,上一次add的function和这次remove的不是同一个function,他们的内存不同,所以这种写法也行不通。

第三次尝试:

var clickFun = null  // 定义在最外层,不会重新执行的地方

aa = function() {
    clickFun  && (window.removeEventListener("click",clickFun));
    clickFun = function(){
        alert("1")
    }
    window.addEventListener("click",clickFun)
}
setInterval(function(){
    aa ()
},2000)

成功啦! 这是参考addEventListener()与removeEventListener(),追加事件和删除追加事件 - Sarah119 - 博客园这里的例子,我也是看了这个大神的文章理解的~

这样每次remove的都是上一次执行的function了。

最最最重要的是要知道,addEventListener和removeEventListener使用时操作的一定要是同一个function(同一内存)。

还有一种解决方式,不通过removeEventListener。为元素加一个属性来识别是否已经有了事件。如果有,就不要再次加事件了。

var clearBtn = document.querySelector('.clear_handPanel')
if (clearBtn.getAttribute("addClickHandleFlag") !== "1") {
    clearBtn.setAttribute("addClickHandleFlag","1")

    clearBtn.addEventListener('click', function () {
        console.log(111)
    })
}

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
如果 "document.removeEventListener" 不起作用,可能有以下几个可能的原因: 1. 事件监听器未正确添加:确保在添加事件监听器时使用正确的语法。正确的语法是指定要监听的事件类型、要执行的函数以及要使用的捕获或冒泡阶段。例如,如果要监听鼠标点击事件,并在触发时执行名为 "myFunction" 的函数,则正确的代码应类似于以下示例: ``` document.addEventListener('click', myFunction); ``` 2. 事件监听器已在另一个位置被移除:检查代码中是否有其他地方使用了 "document.removeEventListener",且该语句可能已经在其他位置调用,从而导致您的代码中的移除操作不起作用。确保所有的 "document.removeEventListener" 调用都是正确的,并且不会在其他地方被重复移除。 3. 事件类型或函数名称拼写错误:确保事件类型和函数名称没有被拼写错误。如果拼写错误,JavaScript 引擎将无法正确识别事件类型或要执行的函数,从而导致 "document.removeEventListener" 无法生效。 4. 使用匿名函数作为事件监听器:如果在添加事件监听器时使用了匿名函数,那么在移除事件监听器时可能会遇到问题。这是因为匿名函数无法通过名称被识别和移除。为了解决这个问题,可以将匿名函数存储在变量中,并在添加和移除事件监听器时使用同一个变量。 综上所述,通过检查代码的语法、移除操作的位置、事件类型和函数名称的拼写以及匿名函数的使用,可以找到 "document.removeEventListener" 不起作用的问题所在。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值