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


Posted in Javascript onAugust 18, 2015

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

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

DOM事件三个阶段

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

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

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

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

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

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

引用来源: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的时候结果是:

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

outer_捕获

middle_捕获

inner_捕获

inner_冒泡

middle_冒泡

outer_冒泡

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

tips:

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

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

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

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

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

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

当我们点击outer时:

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

当我们点击middle时:

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

当我们点击inner时:

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

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

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

Javascript 相关文章推荐
在 IE 中调用 javascript 打开 Excel 表
Dec 21 Javascript
索趣科技的答案
Feb 07 Javascript
新老版本juqery获取radio对象的方法
Mar 01 Javascript
Jquery获取元素的父容器对象示例代码
Feb 10 Javascript
gridview生成时如何去掉style属性中的border-collapse
Sep 30 Javascript
JQuery实现DIV其他动画效果的简单实例
Sep 18 Javascript
Angular.Js中ng-include指令的使用与实现
May 07 Javascript
vue基于viewer实现的图片查看器功能
Apr 12 Javascript
JS中FormData类实现文件上传
Mar 27 Javascript
jquery实现手风琴案例
May 04 jQuery
如何在微信小程序中使用骨架屏的步骤
Jun 12 Javascript
使用JS前端技术实现静态图片局部流动效果
Aug 05 Javascript
js实现带有介绍的Select列表菜单实例
Aug 18 #Javascript
jQuery垂直多级导航菜单代码分享
Aug 18 #Javascript
js简单实现表单中点击按钮动态增加输入框数量的方法
Aug 18 #Javascript
js实现的简单radio背景颜色选择器代码
Aug 18 #Javascript
jquery SweetAlert插件实现响应式提示框
Aug 18 #Javascript
js+css实现上下翻页相册代码分享
Aug 18 #Javascript
javascript实现图片上传前台页面
Aug 18 #Javascript
You might like
PHP中文URL编解码(urlencode()rawurlencode()
2010/07/03 PHP
PHP实现多维数组转字符串和多维数组转一维数组的方法
2015/08/08 PHP
禁止刷新,回退的JS
2006/11/25 Javascript
用javascript实现计算两个日期的间隔天数
2007/08/14 Javascript
js身份证验证超强脚本
2008/10/26 Javascript
基于jQuery的计算文本框字数的代码
2012/06/06 Javascript
js中传递特殊字符(+,&amp;)的方法
2014/01/16 Javascript
JavaScript获取页面中第一个锚定文本的方法
2015/04/03 Javascript
使用Raygun对Node.js应用进行错误处理的方法
2015/06/23 Javascript
js实现的动画导航菜单效果代码
2015/09/10 Javascript
jquery利用拖拽方式在图片上添加热链接
2015/11/24 Javascript
js事件驱动机制 浏览器兼容处理方法
2016/07/23 Javascript
Bootstrap CSS布局之按钮
2016/12/17 Javascript
JavaScript Date 知识浅析
2017/01/29 Javascript
Vue2递归组件实现树形菜单
2017/04/10 Javascript
Vue组件通信之Bus的具体使用
2017/12/28 Javascript
angularjs实现的购物金额计算工具示例
2018/05/08 Javascript
layui中table表头样式修改方法
2018/08/15 Javascript
微信小程序class封装http代码实例
2019/08/24 Javascript
vue input标签通用指令校验的实现
2019/11/05 Javascript
vue-cli创建的项目中的gitHooks原理解析
2020/02/14 Javascript
如何解决jQuery 和其他JS库的冲突
2020/06/22 jQuery
[37:02]OG vs INfamous 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
python自动安装pip
2014/04/24 Python
django利用request id便于定位及给日志加上request_id
2018/08/26 Python
关于Python 解决Python3.9 pandas.read_excel(‘xxx.xlsx‘)报错的问题
2020/11/28 Python
python 如何用urllib与服务端交互(发送和接收数据)
2021/03/04 Python
什么是Linux虚拟文件系统VFS
2015/08/25 面试题
计算机专业自我鉴定
2013/10/15 职场文书
旅游管理毕业生自荐信
2013/11/05 职场文书
自我推荐书
2013/12/04 职场文书
党员个人思想汇报
2013/12/28 职场文书
2014年公务员退休工资改革方案
2014/10/01 职场文书
2016年学生会感恩节活动总结
2016/04/01 职场文书
使用springboot暴露oracle数据接口的问题
2021/05/07 Oracle
MySQL 自定义变量的概念及特点
2021/05/13 MySQL