事件冒泡、事件捕获、事件委托

1、定义

事件捕获指的是从document到触发事件的那个节点,即自上而下的去触发事件。
相反的,事件冒泡是自下而上的去触发事件。绑定事件方法的第三个参数,就是控制事件触发顺序是否为事件捕获。
true,事件捕获;false,事件冒泡。默认false,即事件冒泡。e.stopPropagation会阻止冒泡

2、示例

<div id="div1">
  <div id="div2">元素</div>
</div>
<script>

  //事件冒泡

  var div1 = document.getElementById("div1");
  var div2 = document.getElementById("div2");

  div2.addEventListener("click", function(e){console.log("孩子事件")}, true);
  div1.addEventListener("click", function(e){console.log("父亲事件")}, true);

</script>

<script>

  //事件捕获
  var div1 = document.getElementById("div1");
  var div2 = document.getElementById("div2");

  div2.addEventListener("click", function(e){console.log("孩子事件")}, true);
  div1.addEventListener("click", function(e){console.log("父亲事件")}, true);
</script>

3、取消冒泡(两种方式)

标准的W3C 方式:e.stopPropagation();这里的stopPropagation是标准的事件对象的一个方法,调用即可

非标准的IE方式:ev.cancelBubble=true; 这里的cancelBubble是 IE事件对象的属性,设为true就可以了

function stopBubble(e) {
    //如果提供了事件对象,则这是一个非IE浏览器
   if ( e && e.stopPropagation )
      //因此它支持W3C的stopPropagation()方法
      e.stopPropagation();
  else{
  //否则,我们需要使用IE的方式来取消事件冒泡
    window.event.cancelBubble = true;
  } }
4、事件冒泡应用(事件委托或称事件代理)
优点:<1>新添加的元素还会有之前的事件<2>减少循环添加事件,性能更好
<script>

  window.onload = function(){
    var oUl = document.getElementById('ull');
    var aLi = document.getElementsByTagName('li');

    oUl.onmouseover = function(ev){
      var event = ev||window.event; // 获取event对象
      var target = ev.target || ev.srcElement; // 获取触发事件的目标对象

      if(target.nodeName.toLowerCase() == 'li'){ //判断目标对象是不是li
        target.style.background = 'red';
      }

    }

  }

</script>
posted on 2018-12-18 11:42  金翅鸟  阅读(402)  评论(0编辑  收藏  举报