DOM事件阶段以及事件捕获与事件冒泡先后执行顺序(图文详解)

 更新时间:2015年08月18日 16:34:34   投稿:mrr  
DOM事件标准定义了两种事件流,这两种事件流有着显著的不同并且可能对你的应用有着相当大的影响。这两种事件流分别是捕获和冒泡。和许多Web技术一样,在它们成为标准之前,Netscape和微软各自不同地实现了它们,下面介绍DOM事件阶段以及事件捕获与事件冒泡先后执行顺序

俗话说的好,好记性不如个烂笔头,这么多技术文章如果不去吃透,技术点很快就容易忘掉,下面是小编平时浏览的技术文章,整理的笔记,分享给大家。

开发过程中我们都希望使用别人成熟的框架,因为站在巨人的肩膀上会使得我们开发的效率大幅度提升。不过,我们也应该、必须了解其基本原理。比如DOM事件,jquery框架帮我们为我们封装和抽象了各浏览器的差异行为,为事件处理带来了极大的便利。不过浏览器逐步走向统一和标准化,我们可以更加安全地使用官方规范的接口。因为只有获得众多开发者的芳心,浏览器才会走得更远。正如我们现在使用低版本浏览器打开某些页面时,会告知我们要用chrome等高级浏览器访问。不过这是一个革命的过程,为了让我们的webPage更好地服务更多的人,现在我们还不得不对这些历史遗留问题做更好的兼容。要做好兼容,除了依赖框架,我们得理解其基本原理。

DOM事件三个阶段

当一个DOM事件被触发时,它不仅仅只是单纯地在本身对象上触发一次,而是会经历三个不同的阶段:

1.捕获阶段:先由文档的根节点document往事件触发对象,从外向内捕获事件对象;

2.目标阶段:到达目标事件位置(事发地),触发事件;

3.冒泡阶段:再从目标事件位置往文档的根节点方向回溯,从内向外冒泡事件对象。

引用来源:http://www.w3.org/TR/DOM-Level-3-Events/#event-flow

事件捕获与事件冒泡先后执行顺序就显而易见了。

实验部分

 打开在线编辑器:http://jsbin.com/goqede/edit?html,css,js,output

代码如下:

<!DOCTYPE html>
 <html lang="en">
 <head>
   <meta charset="UTF-">
   <title>Document</title>
   <style>
     #outer{
       text-align: center;
       width: px;
       height: px;
       background-color: #ccc;
       margin: auto;
     }
     #middle{
       width: px;
       height: px;
       background-color: #f;
       margin: auto;
     }
     #inner{
       width: px;
       height: px;
       background-color: #f;
       margin: auto;
       border-rad
     }
   </style>
 </head>
 <body>
   <div id='outer'>
     <span>outer</span>
     <div id='middle'>
       <span>middle</span>
       <div id='inner'>
         <span>inner</span>
       </div>
     </div>
   </div>
   <script>
     function $(element){
       return document.getElementById(element);
     }
     function on(element,event_name,handler,use_capture){
       if(addEventListener){
         $(element).addEventListener(event_name,handler,use_capture);
       }
       else{
         $(element).attachEvent('on'+event_name,handler);
       }
     }
     on("outer","click",o_click_c,true);
     on("middle","click",m_click_c,true);
     on("inner","click",i_click_c,true);
     on("outer","click",o_click_b,false);
     on("middle","click",m_click_b,false);
     on("inner","click",i_click_b,false);
     function o_click_c(){
       console.log("outer_捕获");
       alert("outer_捕获");
     }
     function m_click_c(){
       console.log("middle_捕获")
       alert("middle_捕获");
     }
     function i_click_c(){
       console.log("inner_捕获")
       alert("inner_捕获");
     }
     function o_click_b(){
       console.log("outer_冒泡")
       alert("outer_冒泡");
     }
     function m_click_b(){
       console.log("middle_冒泡")
       alert("middle_冒泡");
     }
     function i_click_b(){
       console.log("inner_冒泡")
       alert("inner_冒泡");
     }
   </script>
 </body>
 </html>

当我们点击inner的时候结果是:

outer_捕获

middle_捕获

inner_捕获

inner_冒泡

middle_冒泡

outer_冒泡

由此可见:确实是先由外向内事件捕获,一直到事发元素,在由内向外冒泡到根节点上

tips:

当事件触发在目标阶段时,会根据事件注册的先后顺序执行,在其他两个阶段注册顺序不影响事件执行顺序。也就是说如果该处既注册了冒泡事件,也注册了捕获事件,则按照注册顺序执行。

 例如当我点击inner的时候,按照以上顺序,答案确实是我们想要的答案:

当我的事件注册顺序改变成如下代码时:

当我们点击outer时:

当我们点击middle时:

当我们点击inner时:

可以看出在目标阶段的事发元素上的事件执行顺序是有事件注册顺序决定的

以上内容就是本文对DOM事件阶段以及事件捕获与事件冒泡先后执行顺序(图文详解),希望对大家今后的工作、学习有所帮助。

相关文章

  • jQuery hover事件简单实现同时绑定2个方法

    jQuery hover事件简单实现同时绑定2个方法

    这篇文章主要介绍了jQuery hover事件简单实现同时绑定2个方法,可实现同时绑定悬停与离开事件的功能,非常简单实用,需要的朋友可以参考下
    2016-06-06
  • Jquery 学习笔记(一)

    Jquery 学习笔记(一)

    从今天起正式学习Jquery(实际严格讲已经用了几个月的Jquery的一丁点东西),边学边做边记笔记;阅读书籍《锋利的Jquery》+Jquery API Doc。
    2009-10-10
  • jQuery 3.0 的 setter和getter 模式详解

    jQuery 3.0 的 setter和getter 模式详解

    这篇文章主要介绍了jQuery 3.0 的 setter和getter 模式详解的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-07-07
  • jQuery 淡入/淡出效果函数用法分析

    jQuery 淡入/淡出效果函数用法分析

    这篇文章主要介绍了jQuery 淡入/淡出效果函数用法,结合实例形式分析了jQuery 淡入/淡出功能fadeIn()、fadeOut()、fadeToggle()及fadeTo()函数基本功能、使用方法与操作注意事项,需要的朋友可以参考下
    2020-05-05
  • jQuery根据元素值删除数组元素的方法

    jQuery根据元素值删除数组元素的方法

    这篇文章主要介绍了jQuery根据元素值删除数组元素的方法,涉及jQuery中splice及inArray方法的使用技巧,需要的朋友可以参考下
    2015-06-06
  • 修复jQuery tablesorter无法正确排序的bug(加千分位数字后)

    修复jQuery tablesorter无法正确排序的bug(加千分位数字后)

    这篇文章主要介绍了如何修复jQuery tablesorter无法正确排序的bug(加千分位数字后)的相关资料,需要的朋友可以参考下
    2016-03-03
  • jQuery实现当按下回车键时绑定点击事件

    jQuery实现当按下回车键时绑定点击事件

    当按下回车键时,绑定按钮点击事件,本文为大家介绍下jQuery回车键绑定点击事件的具体实现
    2014-01-01
  • 15款优秀的jQuery导航菜单插件分享

    15款优秀的jQuery导航菜单插件分享

    这篇文章收集了15款优秀的jQuery导航菜单插件分享给大家。jQuery 是一个非常优秀的 JavaScript 框架,使用简单灵活,同时还有许多成熟的插件可供选择,jQuery 让网站有更好的可用性和用户体验,给访问者对网站留下非常好的印象。
    2011-07-07
  • jquery mobile事件多次绑定示例代码

    jquery mobile事件多次绑定示例代码

    这种绑定方法会在整个document每pageinit一次,就对xxx进行的某一事件进行绑定,而pageinit事件什么时候会触发,感兴趣的朋友可以了解下
    2013-09-09
  • jQuery获取元素父节点的方法

    jQuery获取元素父节点的方法

    这篇文章主要介绍了使用jQuery获取元素父节点的方法,通俗易懂,需要的朋友可以参考下。
    2016-06-06

最新评论