js之事件冒泡和事件捕获详细介绍


Posted in Javascript onOctober 28, 2013

(1)冒泡型事件:事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发。

  IE 5.5: div -> body -> document

  IE 6.0: div -> body -> html -> document

  Mozilla 1.0: div -> body -> html -> document -> window

(2)捕获型事件(event capturing):事件从最不精确的对象(document 对象)开始触发,然后到最精确(也可以在窗口级别捕获事件,不过必须由开发人员特别指定)。

(3)DOM事件流:同时支持两种事件模型:捕获型事件和冒泡型事件,但是,捕获型事件先发生。两种事件流会触及DOM中的所有对象,从document对象开始,也在document对象结束。

  DOM事件模型最独特的性质是,文本节点也触发事件(在IE中不会)。

支持W3C标准的浏览器在添加事件时用addEventListener(event,fn,useCapture)方法,基中第3个参数useCapture是一个Boolean值,用来设置事件是在事件捕获时执行,还是事件冒泡时执行。而不兼容W3C的浏览器(IE)用attachEvent()方法,此方法没有相关设置,不过IE的事件模型默认是在事件冒泡时执行的,也就是在useCapture等于false的时候执行,所以把在处理事件时把useCapture设置为false是比较安全,也实现兼容浏览器的效果。

js之事件冒泡和事件捕获详细介绍

事件捕获阶段:事件从最上一级标签开始往下查找,直到捕获到事件目标(target)。
事件冒泡阶段:事件从事件目标(target)开始,往上冒泡直到页面的最上一级标签。

假设一个元素div,它有一个下级元素p。
<div>

<p>元素</p>
</div>
这两个元素都绑定了click事件,如果用户点击了p,它在div和p上都触发了click事件,那这两个事件处理程序哪个先执行呢?事件顺序是什么?
 
两种模型
以前,Netscape和Microsoft是不同的实现方式。

Netscape中,div先触发,这就叫做事件捕获。

Microsoft中,p先触发,这就叫做事件冒泡。

两种事件处理顺序刚好相反。IE只支持事件冒泡,Mozilla, Opera 7 和 Konqueror两种都支持,旧版本的Opera's 和 iCab两种都不支持 。

事件捕获
当你使用事件捕获时,父级元素先触发,子级元素后触发,即div先触发,p后触发。

事件冒泡
当你使用事件冒泡时,子级元素先触发,父级元素后触发,即p先触发,div后触发。

W3C模型
W3C模型是将两者进行中和,在W3C模型中,任何事件发生时,先从顶层开始进行事件捕获,直到事件触发到达了事件源元素。然后,再从事件源往上进行事件冒泡,直到到达document。

程序员可以自己选择绑定事件时采用事件捕获还是事件冒泡,方法就是绑定事件时通过addEventListener函数,它有三个参数,第三个参数若是true,则表示采用事件捕获,若是false,则表示采用事件冒泡。

ele.addEventListener('click',doSomething2,true)

true=捕获

false=冒泡

传统绑定事件方式
在一个支持W3C DOM的浏览器中,像这样一般的绑定事件方式,是采用的事件冒泡方式。

ele.onclick = doSomething2

IE浏览器
如上面所说,IE只支持事件冒泡,不支持事件捕获,它也不支持addEventListener函数,不会用第三个参数来表示是冒泡还是捕获,它提供了另一个函数attachEvent。

ele.attachEvent("onclick", doSomething2);

附:事件冒泡(的过程):事件从发生的目标(event.srcElement||event.target)开始,沿着文档逐层向上冒泡,到document为止。

事件的传播是可以阻止的:
• 在W3c中,使用stopPropagation()方法
• 在IE下设置cancelBubble = true;
在捕获的过程中stopPropagation();后,后面的冒泡过程也不会发生了~
3.阻止事件的默认行为,例如click <a>后的跳转~
• 在W3c中,使用preventDefault()方法;
• 在IE下设置window.event.returnValue = false;
4.哇,终于写完了,一边测试一边写的额,不是所有的事件都能冒泡,例如:blur、focus、load、unload,(这个是从别人的文章里摘过来的,我没测试)。

Javascript 相关文章推荐
javascript引用对象的方法
Jan 11 Javascript
利用Javascript判断操作系统的类型实现不同操作系统下的兼容性
Jan 29 Javascript
javascript获取网页中指定节点的父节点、子节点的方法小结
Apr 24 Javascript
JavaScript设计模式之适配器模式介绍
Dec 28 Javascript
JS中字符串trim()使用示例
May 26 Javascript
简介JavaScript中的getSeconds()方法的使用
Jun 10 Javascript
基于JS模仿windows文件按名称排序效果
Jun 29 Javascript
jQuery Validate验证框架详解(推荐)
Dec 17 Javascript
angularjs 实现带查找筛选功能的select下拉框实例
Jan 11 Javascript
在nginx上部署vue项目(history模式)的方法
Dec 28 Javascript
jquery 输入框查找关键字并提亮颜色的实例代码
Jan 23 jQuery
关于Vue中的options选项
Mar 22 Vue.js
javascript抖动元素的小例子
Oct 28 #Javascript
replace()方法查找字符使用示例
Oct 28 #Javascript
JS 如何获取radio选中后的值及不选择取radio的值
Oct 28 #Javascript
Document:getElementsByName()使用方法及示例
Oct 28 #Javascript
JS截取字符串常用方法详细整理
Oct 28 #Javascript
js自动生成对象的属性示例代码
Oct 28 #Javascript
js实现点小图看大图效果的思路及示例代码
Oct 28 #Javascript
You might like
PHP时间戳使用实例代码
2008/06/07 PHP
PHP 查找字符串常用函数介绍
2012/06/07 PHP
jQuery插件echarts实现的循环生成图效果示例【附demo源码下载】
2017/03/04 Javascript
AngularJS动态绑定ng-options的ng-model实例代码
2017/06/21 Javascript
使用cropper.js裁剪头像的实例代码
2017/09/29 Javascript
jquery获取元素到屏幕四周可视距离的方法
2018/09/05 jQuery
微信小程序实现无限滚动列表
2020/05/29 Javascript
使用Sonarqube扫描Javascript代码的示例
2018/12/26 Javascript
JS中数组实现代码(倒序遍历数组,数组连接字符串)
2019/12/29 Javascript
vue 翻页组件vue-flip-page效果
2020/02/05 Javascript
vue+koa2搭建mock数据环境的详细教程
2020/05/18 Javascript
基于jquery实现彩色投票进度条代码解析
2020/08/26 jQuery
vue 防止页面加载时看到花括号的解决操作
2020/11/09 Javascript
[02:48]DOTA2英雄基础教程 拉席克
2013/12/12 DOTA
[34:47]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第一场 11.18
2020/11/18 DOTA
Django框架下在视图中使用模版的方法
2015/07/16 Python
python通过加号运算符操作列表的方法
2015/07/28 Python
Python使用正则表达式抓取网页图片的方法示例
2017/04/21 Python
详解Python 多线程 Timer定时器/延迟执行、Event事件
2019/06/27 Python
使用PyTorch训练一个图像分类器实例
2020/01/08 Python
CSS3实现水平居中、垂直居中、水平垂直居中的实例代码
2020/02/27 HTML / CSS
AmazeUI 导航条的实现示例
2020/08/14 HTML / CSS
Java的基础面试题附答案
2016/01/10 面试题
【魔兽争霸3重制版】原版画面与淬火MOD画面对比
2021/03/26 魔兽争霸
党支部书记先进事迹
2014/01/17 职场文书
办公室主任先进事迹
2014/01/18 职场文书
运动会入场词200字
2014/02/15 职场文书
幼儿园六一儿童节主持节目串词
2014/03/21 职场文书
《秋游》教学反思
2014/04/24 职场文书
槐乡的孩子教学反思
2014/04/27 职场文书
缅怀革命先烈演讲稿
2014/05/14 职场文书
给上级领导的感谢信
2015/01/22 职场文书
创先争优个人总结
2015/03/04 职场文书
浅谈Nginx 中的两种限流方式
2021/03/31 Servers
python执行js代码的方法
2021/05/13 Python
python turtle绘图命令及案例
2021/11/23 Python