深入理解事件冒泡(Bubble)和事件捕捉(capture)


Posted in Javascript onMay 28, 2016

事件的发生顺序

假设在一个元素中又嵌套了另一个元素并且两者都有一个onClick事件处理函数(event handler)。如果用户单击元素2,则元素1和元素2的单击事件都会被触发。但是哪一个事件先被触发?哪一个事件处理函数会被首先执行?换句话说,事件的发生顺序到底如何?如下图是当点击span元素区域是,三个点击事件都会被触发,但是先后顺序是怎样的呢?

<div onclick="func1">
   <p onclick="func2">
     <span onclick=""func3>
     </span>
   </p>
 </div>

两种模型

对于这个事件的处理顺序上,Netscape和微软有两种截然不同的处理方法:

•Netscape主张事件会从最外层开始发生,直到最具体的元素,这种事件发生顺序被称为捕获型

•微软则保持事件从最内部元素开始发生,然后一直向上传播,这种事件顺序被称为冒泡型

这两种事件顺序是截然相反的。Explorer浏览器只支持冒泡事件,Mozilla,Opera7和Konqueror两者都支持。而更古老的opera和iCab两者都不支持

w3c

任何发生在w3c事件模型中的事件,首是进入捕获阶段,直到达到目标元素,再进入冒泡阶段。

对于正常的web开发,可以选择是在捕获阶段还是冒泡阶段绑定事件处理函数,这是通过addEventListener()方法实现的,如果这个函数的useCapture参数是true,则在捕获阶段绑定函数,反之false,在冒泡阶段绑定函数。

element.addEventListener(event, function, useCapture)

阻止冒泡

在正常的开发过程中,如果想要阻止事件的传播,通过一个方法实现。

在微软的模型中,你必须设置事件的cancelBubble的属性为true

window.event.cancelBubble = true

在w3c模型中你必须调用事件的stopPropagation()方法

e.stopPropagation()

通过调用这些方法会阻止所有冒泡向外传播。跨浏览器解决方案:

function doSomething(e) {
  if (!e) {
    var e = window.event;
    e.cancelBubble = true;
  }
  if (e.stopPropagation) {
    e.stopPropagation();
  }
}

以上这篇深入理解事件冒泡(Bubble)和事件捕捉(capture)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript DOM 添加事件
Feb 14 Javascript
jquery.ui.draggable中文文档
Nov 24 Javascript
JQuery 选择和过滤方法代码总结
Nov 19 Javascript
使用Object.defineProperty实现简单的js双向绑定
Apr 15 Javascript
js获取元素下的第一级子元素的方法(推荐)
Mar 05 Javascript
JS 组件系列之BootstrapTable的treegrid功能
Jun 16 Javascript
JS实现简单的浮动碰撞效果示例
Dec 28 Javascript
axios简单实现小程序延时loading指示
Jul 30 Javascript
Vue实现表格中对数据进行转换、处理的方法
Sep 06 Javascript
使用JS获取页面上的所有标签
Oct 18 Javascript
VUEX 数据持久化,刷新后重新获取的例子
Nov 12 Javascript
JS+css3实现幻灯片轮播图
Aug 14 Javascript
jqueryMobile 动态添加元素,展示刷新视图的实现方法
May 28 #Javascript
jQuery Mobile动态刷新页面样式的实现方法
May 28 #Javascript
JQuery EasyUI Layout 在from布局自适应窗口大小的实现方法
May 28 #Javascript
jQuery操作动态生成的内容的方法
May 28 #Javascript
javascript 用函数实现继承详解
May 28 #Javascript
jQuery控制li上下循环滚动插件用法实例(附demo源码下载)
May 28 #Javascript
jQuery实现布局高宽自适应的简单实例
May 28 #Javascript
You might like
PHP 魔术函数使用说明
2010/05/14 PHP
php根据一个给定范围和步进生成数组的方法
2015/06/19 PHP
PHP和Mysql中转UTF8编码问题汇总
2015/10/10 PHP
PHP类的声明与实例化及构造方法与析构方法详解
2016/01/26 PHP
php简单备份与还原MySql的方法
2016/05/09 PHP
thinkphp中的多表关联查询的实例详解
2017/10/12 PHP
thinkPHP框架动态配置用法实例分析
2018/06/14 PHP
laravel5.6 框架操作数据 Eloquent ORM用法示例
2020/01/26 PHP
jQuery 页面载入进度条实现代码
2009/02/08 Javascript
详细讲解JS节点知识
2010/01/31 Javascript
JS 密码强度验证(兼容IE,火狐,谷歌)
2010/03/15 Javascript
Javascript Function对象扩展之延时执行函数
2010/07/06 Javascript
基于jquery的实现简单的表格中增加或删除下一行
2010/08/01 Javascript
JS图片无缝滚动(简单利于使用)
2013/06/17 Javascript
JS图片切换的具体方法(带缩略图版)
2013/11/12 Javascript
jquery实现标签支持图文排列带上下箭头按钮的选项卡
2015/03/14 Javascript
微信小程序 location API实例详解
2016/10/02 Javascript
jQuery extend()详解及简单实例
2017/05/06 jQuery
js处理包含中文的字符串实例
2017/10/11 Javascript
ES6 javascript中class静态方法、属性与实例属性用法示例
2017/10/30 Javascript
easyui下拉框动态级联加载的示例代码
2017/11/29 Javascript
微信网页授权并获取用户信息的方法
2018/07/30 Javascript
微信小程序缓存过期时间的使用详情
2019/05/12 Javascript
JS事件循环机制event loop宏任务微任务原理解析
2020/08/04 Javascript
JavaScript canvas实现跟随鼠标移动小球
2021/02/09 Javascript
[31:01]2014 DOTA2国际邀请赛中国区预选赛5.21 CNB VS Orenda
2014/05/23 DOTA
[55:03]LGD vs EG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Python进阶之尾递归的用法实例
2018/01/31 Python
详解Python 循环嵌套
2020/07/09 Python
如何用Python徒手写线性回归
2021/01/25 Python
法律进学校实施方案
2014/03/15 职场文书
学生自我鉴定格式及范文
2014/09/16 职场文书
教师党员批评与自我批评
2014/10/15 职场文书
员工离职感谢信
2015/01/22 职场文书
创业计划书之服装
2019/10/07 职场文书
Oracle使用别名的好处
2022/04/19 Oracle