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 相关文章推荐
js 连接数据库如何操作数据库中的数据
Nov 23 Javascript
通过JavaScript使Div居中并随网页大小改变而改变
Jun 24 Javascript
jQuery中:last-child选择器用法实例
Dec 31 Javascript
js控制文本框输入的字符类型方法汇总
Jun 19 Javascript
JS面向对象(3)之Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法
Feb 25 Javascript
详解Jquery 遍历数组之$().each方法与$.each()方法介绍
Jan 09 Javascript
解决OneThink中无法异步提交kindeditor文本框中修改后的内容方法
May 05 Javascript
Javascript实现base64的加密解密方法示例
Jun 27 Javascript
ReactNative列表ListView的用法
Aug 02 Javascript
vue 将页面公用的头部组件化的方法
Dec 18 Javascript
JSON基本语法及与JavaScript的异同实例分析
Jan 04 Javascript
详解JavaScript作用域、作用域链和闭包的用法
Sep 03 Javascript
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
西德产收音机
2021/03/01 无线电
一个多文件上传的例子(原创)
2006/10/09 PHP
PHP&amp;MYSQL服务器配置说明
2006/10/09 PHP
php实现的在线人员函数库
2008/04/09 PHP
ThinkPHP中自定义错误页面和提示页面实例
2014/11/22 PHP
超强的IE背景图片闪烁(抖动)的解决办法
2007/09/09 Javascript
javascript 隐藏/显示指定的区域附HTML元素【legend】用法
2010/03/05 Javascript
Javascript 闭包引起的IE内存泄露分析
2012/05/23 Javascript
用JS将搜索的关键字高亮显示实现代码
2013/11/08 Javascript
推荐一个封装好的getElementsByClassName方法
2014/12/02 Javascript
基于jquery实现放大镜效果
2015/08/17 Javascript
angular.js + require.js构建模块化单页面应用的方法步骤
2017/07/19 Javascript
Angular CLI在Angular项目中如何使用scss详解
2018/04/10 Javascript
layui导出所有数据的例子
2019/09/10 Javascript
[05:08]2014DOTA2国际邀请赛 Hao专访复仇的胜利很爽
2014/07/15 DOTA
[40:55]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#4Newbee VS Fnatic
2016/03/03 DOTA
python文件和目录操作方法大全(含实例)
2014/03/12 Python
Python中的列表生成式与生成器学习教程
2016/03/13 Python
利用python将xml文件解析成html文件的实现方法
2017/12/22 Python
Python使用SQLite和Excel操作进行数据分析
2018/01/20 Python
python统计字符的个数代码实例
2020/02/07 Python
在django中form的label和verbose name的区别说明
2020/05/20 Python
css3.0 图形构成实例练习一
2013/03/19 HTML / CSS
GLAMGLOW香港官网:明星出镜前的秘密武器
2017/03/16 全球购物
红色康乃馨酒店:Red Carnation Hotels
2017/06/22 全球购物
优衣库台湾官网:UNIQLO台湾
2019/02/01 全球购物
Yahoo-PHP面试题4
2012/05/05 面试题
司机的工作范围及职责
2013/11/13 职场文书
大客户销售经理职责
2013/12/04 职场文书
银行介绍信范文
2014/01/10 职场文书
高中生物教学反思
2014/02/05 职场文书
公休请假条
2014/04/11 职场文书
协议书样本
2014/04/23 职场文书
户籍证明书标准模板
2014/09/10 职场文书
学术研讨会欢迎词
2015/01/26 职场文书
python微信智能AI机器人实现多种支付方式
2022/04/12 Python