js addEventListener removeEventListener

addEventListener,removeEventListener

    • addEventListener()接受三个参数。
      第一个是事件类型,如click,keypress,主意没有on,并且全是小写。
      第二个是处理函数,有一个event参数,event包括type,target等等属性。
      第三个是bool值,不写是false,false为冒泡事件处理函数,true为捕获事件处理函数。
    • removeEventListener()接受三个参数。
      第一个是事件类型,同上。
      第二个是处理函数,必须是注册时同一个函数,传匿名函数没用。如addEventListener的是fun1,removeEventListener也要是fun1
      第三个同上
          var father = document.getElementById("father");
          var fatherHandle = function(event) {
              console.log('--------- father -----------')
          }
          father.addEventListener("click", fatherHandle, false);
          father.removeEventListener("click", fatherHandle, false); //有效
          father.removeEventListener("click", function(){console.log('-- no --')}, false); //无效
    • 能通过多次调用addEventListener为同一个对象注册同一事件类型的多个处理函数,并且按照注册的顺序调用。
      但是使用相同参数多次注册无效,只会注册一次。
    • 在事件处理函数内,this指向事件目标的节点对象
    • 处理函数return false就是阻止默认操作,
      在addEventListener中事件对象的preventDefault()取消默认操作
    • 事件传播三个阶段:
      事件的捕获:由window对象一直到触发的内部对象
      事件处理函数:第三个参数为true为捕获函数,false为冒泡处理函数
      事件的冒泡:由最里面的对象向外扩散一直到根节点。
      调用事件对象的stopPropagation()方法阻止事件冒泡。如果在同一对象上注册了其他函数,会继续调用,但其他对象上就不会再执行。
      stopImmediatePropagation()阻止其他对象的传播也阻止了同一个对象的其他函数执行。

 

    var father = document.getElementById("father");
    var child = document.getElementById("child");
    var fatherHandle = function(event) {
        console.log('--------- father -----------')
    }
    var childHandle = function(event) {
        console.log('--------- child -----------')
    }

    father.addEventListener("click", fatherHandle, true);
    child.addEventListener("click", childHandle, true);
    // father - child
    father.addEventListener("click", fatherHandle, false);
    child.addEventListener("click", childHandle, false);
    // child - father

    var fatherHandle = function(event) {
        console.log('--------- father -----------')
    }
    var childHandle = function(event) {
        console.log('--------- child -----------')
        event.stopPropagation()
    }

    father.addEventListener("click", fatherHandle, false);
    child.addEventListener("click", childHandle, false);
    child.addEventListener("click", function(e){console.log('haha')}, false);
    // child haha

 

 

调用顺序

    • 设置对象属性或html属性得注册函数优先调用
    • addEventListener按注册的顺序调用
    • IE 的attachEvent()不按顺序调用,所以代码不应该以来调用顺序
<body>
    <h1 id="father">
        father
        <span id="child" onclick="fun()">child</span>
    </h1>
<script>
    var child = document.getElementById("child");
    var childHandle = function(event) {
        console.log('--------- child -----------')
    }
    child.addEventListener("click", childHandle, false);
    var fun = function(e) {
        console.log('--------- property -----------')
    }
    // property - child
</script>
</body>
原文地址:https://www.cnblogs.com/wayshon/p/7367951.html