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遍历checkbox的注意事项说明
Feb 21 Javascript
jQuery取id有.的值的方法
May 21 Javascript
禁止iframe脚本弹出的窗口覆盖了父窗口的方法
Sep 06 Javascript
angular.js之路由的选择方法
Sep 24 Javascript
微信小程序中多个页面传参通信的学习与实践
May 05 Javascript
angularjs结合html5实现拖拽功能
Jun 25 Javascript
详解angular部署到iis出现404解决方案
Aug 14 Javascript
javascript实现导航栏分页效果
Jun 27 Javascript
JS中的算法与数据结构之链表(Linked-list)实例详解
Aug 20 Javascript
layer实现弹出层自动调节位置
Sep 05 Javascript
vue项目中锚点定位替代方式
Nov 13 Javascript
Vue中key的作用示例代码详解
Jun 10 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
星际争霸中的对战模式介绍
2020/03/04 星际争霸
php中随机显示图片的函数代码
2011/06/23 PHP
Codeigniter实现处理用户登录验证后的URL跳转
2014/06/12 PHP
PHP程序员常见的40个陋习,你中了几个?
2014/11/20 PHP
php基于mcrypt_encrypt和mcrypt_decrypt实现字符串加密解密的方法
2016/07/12 PHP
javascript对象的property和prototype是这样一种关系
2007/03/24 Javascript
网页上的Javascript编辑器和代码格式化
2010/04/25 Javascript
js弹窗返回值详解(window.open方式)
2014/01/11 Javascript
node.js实现逐行读取文件内容的代码
2014/06/27 Javascript
JS传值出现中文参数乱码的解决方法
2016/06/30 Javascript
jQuery禁用快捷键例如禁用F5刷新 禁用右键菜单等的简单实现
2016/08/31 Javascript
利用CSS、JavaScript及Ajax实现图片预加载的三大方法
2017/01/22 Javascript
jQuery弹出层插件popShow用法示例
2017/01/23 Javascript
基于bootstrap实现多个下拉框同时搜索功能
2017/07/19 Javascript
input file样式修改以及图片预览删除功能详细概括(推荐)
2017/08/17 Javascript
vue父组件向子组件传递多个数据的实例
2018/03/01 Javascript
在vue项目中使用sass的配置方法
2018/03/20 Javascript
微信小程序之swiper轮播图中的图片自适应高度的方法
2018/04/23 Javascript
Vue动态面包屑功能的实现方法
2019/07/01 Javascript
vue-cli2与vue-cli3在一台电脑共存的实现方法
2019/09/25 Javascript
[51:29]Alliance vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
在Python中封装GObject模块进行图形化程序编程的教程
2015/04/14 Python
Python中使用urllib2模块编写爬虫的简单上手示例
2016/01/20 Python
详解Python中的文件操作
2016/08/28 Python
python处理DICOM并计算三维模型体积
2019/02/26 Python
python 为什么说eval要慎用
2019/03/26 Python
浅谈python3中input输入的使用
2019/08/02 Python
基于Python解密仿射密码
2019/10/21 Python
怎样声明子类
2013/07/02 面试题
如果NULL和0作为空指针常数是等价的,那我到底该用哪一个
2014/09/16 面试题
护士自荐信怎么写
2013/10/18 职场文书
2014年村计划生育工作总结
2014/11/14 职场文书
租车协议书
2015/01/27 职场文书
Django与数据库交互的实现
2021/06/03 Python
浅析MongoDB之安全认证
2021/06/26 MongoDB
Pycharm远程调试和MySQL数据库授权问题
2022/03/18 MySQL