美文网首页
addEventListener与removeEventList

addEventListener与removeEventList

作者: MuYs | 来源:发表于2021-05-19 15:45 被阅读0次

    addEventListener,监听事件添加
    removeEventListener,监听事件移除

    方法虽然看起来简单,但是还是有很多要注意的地方

    首先看一下参数,都有3个参数,两个必须,一个可选(默认都为false)
    addEventListener(要绑定的事件名,要绑定的方法,冒泡/捕获标识 boolean)
    removeEventListener(要移除的事件名,要移除的方法,冒泡/捕获标识 boolean)

    来点代码试试

    <div id="div1"></div>
    <script>
    document.getElementById('div1').addEventListener('click',function(event) {
      console.log("i am div1");
    })
    </script>
    

    这样我们就给div1绑定了一个点击事件,点击后控制台会输出 "i am div1"
    不过仔细看会发现,我们addEventListener里面只传了两个参数啊
    没错,因为第三个参数为可选参数,不传的话默认为false
    所以上面代码相当于

    <div id="div1"></div>
    <script>
    document.getElementById('div1').addEventListener('click',function(event) {
      console.log("i am div1");
    },false)
    </script>
    

    那第三个参数 冒泡/捕获标识 有什么用呢

    就像我给它取得名字一样,控制我们绑定的事件是冒泡阶段触发还是捕获阶段触发,简单来说就是控制事件属性为冒泡事件还是捕获事件
    true 为捕获事件,默认/false 为冒泡事件
    关于事件冒泡与事件捕获可结合我的另一篇文章 stopPropagation与preventDefault,事件冒泡与事件捕获那点事儿 一起学习

    需要注意的几个地方:

    同一事件名可以绑定多个方法

    <div id="div1"></div>
    <script>
    document.getElementById('div1').addEventListener('click',function(event) {
      console.log("i am div1");
    })
    document.getElementById('div1').addEventListener('click',function(event) {
      console.log("let me say it again,i am div1");
    })
    //click事件上绑定了两个方法
    </script>
    

    可以通过函数名来引用外部函数(但无法传参)

    <div id="div1"></div>
    <script>
    document.getElementById('div1').addEventListener('click',myTest)
    function myTest(){
     console.log("i am div1");
    }
    //通过函数名来引用外部函数,但无法传参
    </script>
    

    当需要传递参数值时,使用"匿名函数"调用带参数的函数

    <div id="div1"></div>
    <script>
    var a = 1;
    var b = 2;
    document.getElementById('div1').addEventListener('click',function(event) {
      myTest(a,b)
    })
    function myTest(value1,value2){
     console.log("i am div1",value1+ value2);
    }
    </script>
    

    removeEventListener方法只能移除引用外部函数的绑定事件

    <div id="div1"></div>
    <script>
    //这里绑定的是匿名函数function,所以无法移除
    document.getElementById('div1').addEventListener('click',function(event) {
      console.log("i am div1");
    })
    
    //这里绑定的是外部函数myTest,所以可以使用removeEventListener方法移除
    document.getElementById('div1').addEventListener('click',myTest)
    document.getElementById('div1').removeEventListener('click',myTest)
    function myTest(){
     console.log("i am div1");
    }
    </script>
    

    只要冒泡/捕获标识不同,则事件不同

    <div id="div1"></div>
    <script>
    //这里可以理解为有两个事件,一个是冒泡阶段的click事件,一个是捕获阶段的click事件
    document.getElementById('div1').addEventListener('click',myTest)
    document.getElementById('div1').addEventListener('click',myTest,true)
    function myTest(){
     console.log("i am div1");
    }
    //所以点击div1,会触发两次myTest,控制台会输出两次 "i am div1"
    </script>
    

    根据上一条,可以推出,使用removeEventListener时也要指定冒泡/捕获标识,才能删除对应阶段的事件

    <div id="div1"></div>
    <script>
    //这里有两个事件,一个是冒泡阶段的click事件,一个是捕获阶段的click事件
    document.getElementById('div1').addEventListener('click',myTest)
    document.getElementById('div1').addEventListener('click',myTest,true)
    //所以删除事件时也要指定冒泡/捕获标识,单独删两次
    document.getElementById('div1').removeEventListener('click',myTest)
    document.getElementById('div1').removeEventListener('click',myTest,true)
    function myTest(){
     console.log("i am div1");
    }
    </script>
    

    事件触发顺序是先捕获,再冒泡

    <div id="div1"></div>
    <script>
    document.getElementById('div1').addEventListener('click',myTest1)
    document.getElementById('div1').addEventListener('click',myTest,true)
    function myTest(){
     console.log("i am div1");
    }
    function myTest1(){
     console.log("i am div1,too");
    }
    //点击div1,按照先捕获,再冒泡的顺序,控制台会输出
    //"i am div1"
    //"i am div1,too"
    </script>
    

    关于兼容性
    addEventListener与removeEventListener方法只在IE9+后支持
    IE9之前可以使用attachEvent和detachEvent方法

    相关文章

      网友评论

          本文标题:addEventListener与removeEventList

          本文链接:https://www.haomeiwen.com/subject/aulyjltx.html