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 相关文章推荐
初探jquery——表单应用范例
Feb 20 Javascript
jQuery 获取URL的GET参数值的小例子
Apr 18 Javascript
jQuery javaScript捕获回车事件(示例代码)
Nov 07 Javascript
Vue.js弹出模态框组件开发的示例代码
Jul 26 Javascript
JavaScript requestAnimationFrame动画详解
Sep 14 Javascript
微信小程序之蓝牙的链接
Sep 26 Javascript
vue实现配置全局访问路径头(axios)
Nov 01 Javascript
Vue data的数据响应式到底是如何实现的
Feb 11 Javascript
JavaScript中继承原理与用法实例入门
May 09 Javascript
Vue + element 实现多选框组并保存已选id集合的示例代码
Jun 03 Javascript
React实现全选功能
Aug 25 Javascript
解决vue安装less报错Failed to compile with 1 errors的问题
Oct 22 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日历[测试通过]
2008/03/27 PHP
PHP合并数组的2种方法小结
2016/11/24 PHP
firefox浏览器下javascript 拖动层效果与原理分析代码
2007/12/04 Javascript
checkbox 多选框 联动实现代码
2008/10/22 Javascript
jquery获取URL中参数解决中文乱码问题的两种方法
2013/12/18 Javascript
EasyUi datagrid 实现表格分页
2015/02/10 Javascript
jquery仿微信聊天界面
2017/05/06 jQuery
Bootstrap模态框插件使用详解
2017/05/11 Javascript
nuxt+axios解决前后端分离SSR的示例代码
2017/10/24 Javascript
解析Angular 2+ 样式绑定方式
2018/01/15 Javascript
Koa2微信公众号开发之消息管理
2018/05/16 Javascript
新手快速上手webpack4打包工具的使用详解
2019/01/28 Javascript
JavaScript数据结构与算法之二叉树实现查找最小值、最大值、给定值算法示例
2019/03/01 Javascript
electron-vue利用webpack打包实现多页面的入口文件问题
2019/05/12 Javascript
[01:09]DOTAPLUS——DOTA2的新时代
2018/04/04 DOTA
php使用递归与迭代实现快速排序示例
2014/01/23 Python
python基础教程之简单入门说明(变量和控制语言使用方法)
2014/03/25 Python
python3 实现对图片进行局部切割的方法
2018/12/05 Python
python+numpy实现的基本矩阵操作示例
2019/07/19 Python
使用Python给头像加上圣诞帽或圣诞老人小图标附源码
2019/12/25 Python
pytorch使用tensorboardX进行loss可视化实例
2020/02/24 Python
python中plt.imshow与cv2.imshow显示颜色问题
2020/07/16 Python
html5 Canvas实现图片旋转的示例
2018/01/15 HTML / CSS
详解html5 shiv.js和respond.min.js
2018/01/24 HTML / CSS
20世纪40年代连衣裙和复古服装:The Seamstress Of Bloomsbury
2018/07/24 全球购物
Belstaff英国官方在线商店:Belstaff.co.uk
2021/02/09 全球购物
什么是URL
2015/12/13 面试题
煤矿班组长的职责
2013/12/25 职场文书
2014年社区植树节活动方案
2014/02/28 职场文书
幼儿园中班教师寄语
2014/04/03 职场文书
小区门卫岗位职责范本
2014/08/24 职场文书
励志广播稿300字(5篇)
2014/09/15 职场文书
2014年小学国庆节活动方案
2014/09/16 职场文书
《钓鱼的启示》教学反思
2016/02/18 职场文书
Python基础之tkinter图形化界面学习
2021/04/29 Python
Python机器学习应用之工业蒸汽数据分析篇详解
2022/01/18 Python