监听事件多次绑定多次触发的解决方案

535 2

事件监听多次绑定多次触发:
对于同一DOM多次绑定同一监听事件,可导致绑定的函数触发多次,不满足冗余绑定容差错问题。想要的效果是多次绑定的情况下,在触发时只响应一次。


在做项目时,遇到了有时地图不能拖动的问题,一开始以为是ArcGIS for JavaScript使用不当造成的,连调好长时间,发现代码并未有问题。加断点,写LOG,查看DOM触发时的代码走向。发现在绑定的函数中的LOG打印了多次,这很不正常啊。

思考出现多次的原因:1)DOM重复创建了;2)监听是不是多绑定了。

针对两个问题,检查发现确实是多次绑定导致的,首先想到的是方案一,查完资料找到了方案二。

  1. 方案一

    最简单的方法就是放在外围,不用每次都设置监听,这样做的好处是不用每次都去绑定,只在初始化时完成监听,增加了初始化时的运算量。

  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);

    在接收监听函数时使用实名函数,不要使用匿名函数,不然都没办法取消事件监听。

    网友的问题


关注公众号

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器