深入理解事件冒泡(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 相关文章推荐
dojo 之基础篇(二)之从服务器读取数据
Mar 24 Javascript
jQuery实现切换字体大小的方法
Mar 10 Javascript
jquery带动画效果幻灯片特效代码
Aug 27 Javascript
JavaScript实现cookie的写入、读取、删除功能
Nov 05 Javascript
JS获取CSS样式(style/getComputedStyle/currentStyle)
Jan 19 Javascript
使用BootStrap实现用户登录界面UI
Aug 10 Javascript
JavaScript中数组常见操作技巧
Sep 01 Javascript
Angular5中调用第三方js插件的方法
Feb 26 Javascript
微信小程序JS加载esmap地图的实例详解
Sep 04 Javascript
JavaScript实现英语单词题库
Dec 24 Javascript
webpack中的模式(mode)使用详解
Feb 20 Javascript
jQuery实现动态操作table行
Nov 23 jQuery
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定时删除文件夹下文件(清理缓存文件)
2013/01/23 PHP
php生成图片验证码-附五种验证码
2015/08/19 PHP
Yii中CArrayDataProvider和CActiveDataProvider区别实例分析
2016/03/02 PHP
PHP反射实际应用示例
2019/04/03 PHP
PHP设计模式(四)原型模式Prototype实例详解【创建型】
2020/05/02 PHP
javascript String 的扩展方法集合
2008/06/01 Javascript
nodejs通过phantomjs实现下载网页
2015/05/04 NodeJs
JS实现屏蔽网页右键复制及ctrl+c复制的方法【2种方法】
2016/09/04 Javascript
nodejs模块nodemailer基本使用-邮件发送示例(支持附件)
2017/03/28 NodeJs
详解Vue整合axios的实例代码
2017/06/21 Javascript
vue2.0项目中使用Ueditor富文本编辑器示例代码
2017/08/14 Javascript
BootStrap Table实现server分页序号连续显示功能(当前页从上一页的结束序号开始)
2017/09/12 Javascript
微信小程序顶部可滚动导航效果
2017/10/31 Javascript
vue.js 获取select中的value实例
2018/03/01 Javascript
vuex 项目结构目录及一些简单配置介绍
2018/04/08 Javascript
js闭包学习心得总结
2018/04/17 Javascript
vue点击当前路由高亮小案例
2019/09/26 Javascript
使用原生JS实现滚轮翻页效果的示例代码
2020/05/31 Javascript
[06:20]2015国际邀请赛第三日top10
2015/08/08 DOTA
[01:05:56]Liquid vs VP Supermajor决赛 BO 第二场 6.10
2018/07/04 DOTA
Python利用Beautiful Soup模块创建对象详解
2017/03/27 Python
python中如何使用朴素贝叶斯算法
2017/04/06 Python
django开发教程之利用缓存文件进行页面缓存的方法
2017/11/10 Python
flask session组件的使用示例
2018/12/25 Python
Python批量生成特定尺寸图片及图画任意文字的实例
2019/01/30 Python
python射线法判断检测点是否位于区域外接矩形内
2019/06/28 Python
Python时间序列缺失值的处理方法(日期缺失填充)
2019/08/11 Python
Django2 连接MySQL及model测试实例分析
2019/12/10 Python
Python图像处理二值化方法实例汇总
2020/07/24 Python
英国床垫在线:Mattress Online
2016/12/07 全球购物
美国摩托车头盔、零件、齿轮及配件商店:Cycle Gear
2019/06/12 全球购物
《美丽的黄昏》教学反思
2014/02/28 职场文书
房地产经营管理专业自荐信
2014/09/02 职场文书
2015年客服工作总结范文
2015/04/02 职场文书
离婚案件上诉状
2015/05/23 职场文书
Windows server 2003卸载和安装IIS的图文教程
2022/07/15 Servers