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

