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 相关文章推荐
ImageFlow可鼠标控制图片滚动
Jan 30 Javascript
优化innerHTML操作(提高代码执行效率)
Aug 20 Javascript
JS的document.all函数使用示例
Dec 30 Javascript
JavaScript模块规范之AMD规范和CMD规范
Oct 27 Javascript
jQuery前端开发35个小技巧
May 24 Javascript
使用BootStrap实现表格隔行变色及hover变色并在需要时出现滚动条
Jan 04 Javascript
微信小程序实现类似微信点击语音播放效果
Mar 30 Javascript
javascript关于“时间”的一次探索
Jul 24 Javascript
JS/CSS实现字符串单词首字母大写功能
Sep 03 Javascript
TypeScript 引用资源文件后提示找不到的异常处理技巧
Jul 15 Javascript
Vue全局事件总线你了解吗
Feb 24 Vue.js
vue3引入highlight.js进行代码高亮的方法实例
Apr 08 Vue.js
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中使用Oracle数据库(3)
2006/10/09 PHP
说明的比较细的php 正则学习实例
2008/07/30 PHP
php+mysqli使用预处理技术进行数据库查询的方法
2015/01/28 PHP
PHP中的随机性 你觉得自己幸运吗?
2016/01/22 PHP
Zend Framework教程之Zend_Controller_Plugin插件用法详解
2016/03/07 PHP
ThinkPHP中Widget扩展的两种写法及调用方法详解
2017/05/04 PHP
php实现的中秋博饼游戏之绘制骰子图案功能示例
2017/11/06 PHP
JavaScript DOM学习第六章 表单实例
2010/02/19 Javascript
Javascript 遮罩层和加载效果代码
2013/08/01 Javascript
JS查找字符串中出现次数最多的字符
2016/09/05 Javascript
利用Vue.js框架实现火车票查询系统(附源码)
2017/02/27 Javascript
jQuery菜单实例(全选,反选,取消)
2017/08/28 jQuery
详解让sublime text3支持Vue语法高亮显示的示例
2017/09/29 Javascript
微信小程序block的使用教程
2018/04/01 Javascript
angularjs自定义过滤器demo示例
2019/08/24 Javascript
解决vue 使用setTimeout,离开当前路由setTimeout未销毁的问题
2020/07/21 Javascript
[01:10]3.19DOTA2发布会 三代刀塔人第一代
2014/03/25 DOTA
python连接mysql调用存储过程示例
2014/03/05 Python
Python datetime时间格式化去掉前导0
2014/07/31 Python
python 安装virtualenv和virtualenvwrapper的方法
2017/01/13 Python
通过源码分析Python中的切片赋值
2017/05/08 Python
Python编程之列表操作实例详解【创建、使用、更新、删除】
2017/07/22 Python
python3 selenium自动化 frame表单嵌套的切换方法
2019/08/23 Python
Python openpyxl读取单元格字体颜色过程解析
2019/09/03 Python
python 密码学示例——理解哈希(Hash)算法
2020/09/21 Python
浅谈h5自定义audio(问题及解决)
2016/08/19 HTML / CSS
Tech21美国/加拿大:英国NO.1防摔保护壳品牌
2018/01/20 全球购物
教师实习自我鉴定
2013/12/13 职场文书
2014高考励志标语
2014/06/05 职场文书
学校感恩教育活动总结
2014/07/07 职场文书
开服装店计划书
2014/08/15 职场文书
公司委托书格式范文
2014/10/09 职场文书
党员廉洁自律个人总结
2015/02/13 职场文书
实习推荐信格式模板
2015/03/27 职场文书
节约用水广告语60条
2019/11/14 职场文书
分析设计模式之模板方法Java实现
2021/06/23 Java/Android