码迷,mamicode.com
首页 > 其他好文 > 详细

浅谈浏览器的事件冒泡机制

时间:2017-11-26 18:49:42      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:listen   sel   ati   this   小例子   函数   back   ack   dev   

  JS中事件执行的整个过程称之为事件流,分为三个阶段:事件捕获、事件目标处理函数、事件冒泡。

  当某个元素触发某个事件(如onclick),顶级对象document发出一个事件流,顺着DOM的树节点向触发它的目标节点流去,直到到达目标元素,这个层层递进、向下找寻目标点的过程为事件的捕获阶段,此过程中与事件相应的函数是不会被触发的。

  到达目标元素,便会执行绑定在此元素上的、与事件相应的函数,即事件目标处理函数阶段。

  最后,从目标元素起,再依次往顶层对象传递,途中如果有节点绑定了同名事件,这些事件所对应的函数会逐一被触发,此过程便称之为事件冒泡。

  通常情况下,事件相应的函数都是在冒泡阶段触发执行的,addEventListener的第三个参数默认false,表示冒泡时执行(为true时,函数在捕获阶段便会执行)。

  使用e.stopPropagation() 或 e.cancelBubble = true(IE)可以阻断事件向当前元素的父元素冒泡。

  

一个小例子

<div style="background-color: red;">
    <div style="background-color: green;">
        <div style="background-color: yellow;"></div>
    </div>
</div>
   
  var div =document.querySelectorAll(‘div‘);
  function fn1(){
        console.log(this);
    }
   function fn2(e){
        console.log(this);
        e.cancelBubble = true;
        e.stopPropagation();
    }

    div[0].addEventListener(‘click‘,fn1,false);
    div[1].addEventListener(‘click‘,fn1,false);
    div[2].addEventListener(‘click‘,fn2,false);

    div[0].addEventListener(‘click‘,fn1,true);
    div[1].addEventListener(‘click‘,fn1,true);
    div[2].addEventListener(‘click‘,fn1,true);

结果为 red—>green—>yellow—>yellow—>green

(前三个结果是事件捕获阶段执行函数输出的,在捕获阶段,从最高节点起,但凡绑定了click事件,便执行;之后进入冒泡阶段,由于div[1]身上阻止了事件冒泡,因此它的父级div[0]的click不会被触发,事件到div[1]便停止了。)

如果把阻止冒泡的行为添加在捕获阶段,如捕获阶段的div[1]身上,则只会依次输出捕获过程中触发click事件时div[0]、div[1]的函数执行结果,之后的捕获行为和冒泡行为将全部被阻断。

 

浅谈浏览器的事件冒泡机制

标签:listen   sel   ati   this   小例子   函数   back   ack   dev   

原文地址:http://www.cnblogs.com/zoechak00037/p/7899528.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!