监听事件多次绑定多次触发的解决方案
事件监听多次绑定多次触发:
对于同一DOM多次绑定同一监听事件,可导致绑定的函数触发多次,不满足冗余绑定容差错问题。想要的效果是多次绑定的情况下,在触发时只响应一次。
在做项目时,遇到了有时地图不能拖动的问题,一开始以为是ArcGIS for JavaScript使用不当造成的,连调好长时间,发现代码并未有问题。加断点,写LOG,查看DOM触发时的代码走向。发现在绑定的函数中的LOG打印了多次,这很不正常啊。
思考出现多次的原因:1)DOM重复创建了;2)监听是不是多绑定了。
针对两个问题,检查发现确实是多次绑定导致的,首先想到的是方案一,查完资料找到了方案二。
方案一
最简单的方法就是放在外围,不用每次都设置监听,这样做的好处是不用每次都去绑定,只在初始化时完成监听,增加了初始化时的运算量。
方案二
冲了会浪,找到另一个解决办法,这样可以根据什么时候需要设置监听而随时绑定,方法接着往下看~
问题示例:
1
2
3
4
5
6
7
8
9
10function doSomeThing (e) {
console.log('something is', e);
}
var btn = document.getElementById('circle');
btn.addEventListener('click', function (e) {
doSomeThing(e);
}, false);
btn.addEventListener('click', function (e) {
doSomeThing(e);
}, false);
上面的代码会在触发时执行两次,并不是我们想看到的,我们本想预料的是执行一次绑定的函数,完成时间监听的闭环。
问题永远不会偶然并单独出现,你遇到了,别人肯定也会遇到,方案也会有很多,以下是别人的解决方案。
1
2
3
4
5
6function doSomeThing (e) {
console.log('something is', e);
}
var btn = document.getElementById('circle');
btn.addEventListener('click', doSomeThing, false);
btn.addEventListener('click', doSomeThing, false);在接收监听函数时使用实名函数,不要使用匿名函数,不然都没办法取消事件监听。