深入理解事件冒泡(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 相关文章推荐
制作特殊字的脚本
Jun 26 Javascript
js数组的操作指南
Dec 28 Javascript
JS打字效果的动态菜单代码分享
Aug 21 Javascript
jQuery多级联动下拉插件chained用法示例
Aug 20 Javascript
AngularJS下对数组的对比分析
Aug 24 Javascript
Bootstrap表单简单实现代码
Mar 06 Javascript
vue之数据交互实例代码
Jun 16 Javascript
vue绑定class与行间样式style详解
Aug 16 Javascript
jQuery ajax读取本地json文件的实例
Oct 31 jQuery
代码详解JS操作剪贴板
Feb 11 Javascript
Vue表单绑定的实例代码(单选按钮,选择框(单选时,多选时,用 v-for 渲染的动态选项)
May 13 Javascript
Nest.js 授权验证的方法示例
Feb 22 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实现HTML实体编号与非ASCII字符串相互转换类实例
2016/11/02 PHP
BOOM vs RR BO5 第四场 2.14
2021/03/10 DOTA
JavaScript QueryString解析类代码
2010/01/17 Javascript
将查询条件的input、select清空
2014/01/14 Javascript
Extjs表单常见验证小结
2014/03/07 Javascript
javascript实现图片跟随鼠标移动效果的方法
2015/05/13 Javascript
浅谈Jquery核心函数
2015/06/18 Javascript
jquery操作select元素和option的实例代码
2016/02/03 Javascript
js获取当前日期时间及其它日期操作汇总
2016/03/08 Javascript
设置jQueryUI DatePicker默认语言为中文
2016/06/04 Javascript
bootstrap制作jsp页面(根据值让table显示选中)
2017/01/05 Javascript
Node.js中的require.resolve方法使用简介
2017/04/23 Javascript
bootstrap-Treeview实现级联勾选
2017/11/23 Javascript
VSCode 配置React Native开发环境的方法
2017/12/27 Javascript
webpack v4 从dev到prd的方法
2018/04/02 Javascript
JavaScript设计模式之建造者模式实例教程
2018/07/02 Javascript
vue.js提交按钮时进行简单的if判断表达式详解
2018/08/08 Javascript
jQuery删除/清空指定元素的所有子节点实例代码
2019/07/04 jQuery
微信小程序image图片加载完成监听
2019/08/31 Javascript
浅谈React中组件逻辑复用的那些事儿
2020/05/21 Javascript
[32:30]夜魇凡尔赛茶话会 第一期01:谁是卧底
2021/03/11 DOTA
数据挖掘之Apriori算法详解和Python实现代码分享
2014/11/07 Python
举例讲解Python中装饰器的用法
2015/04/27 Python
python追加元素到列表的方法
2015/07/28 Python
python爬虫框架talonspider简单介绍
2017/06/09 Python
Python代码实现KNN算法
2017/12/20 Python
Win10 安装PyCharm2019.1.1(图文教程)
2019/09/29 Python
Python闭包与装饰器原理及实例解析
2020/04/30 Python
Qoo10马来西亚:全球时尚和引领潮流的购物市场
2016/08/25 全球购物
C#如何允许一个类被继承但是避免这个类的方法被重载?
2015/02/24 面试题
土木工程专业个人求职信
2013/12/05 职场文书
完整版商业计划书
2014/09/15 职场文书
优秀员工推荐材料
2014/12/20 职场文书
Nginx+SpringBoot实现负载均衡的示例
2021/03/31 Servers
Go语言 go程释放操作(退出/销毁)
2021/04/30 Golang
简述Java中throw-throws异常抛出
2021/08/07 Java/Android