详解javascript事件冒泡


Posted in Javascript onJanuary 09, 2016

事件是javascript中的核心内容之一,在对事件的应用中不可避免的要涉及到一个重要的概念,那就是事件冒泡,在介绍事件冒泡之前,先介绍一下另一个重要的概念事件流:
一.什么是事件流:
文档对象模型(DOM)是一个树形结构,可以形象的用下图表示。

详解javascript事件冒泡

如果一个html元素触发事件,那么这个事件就会在DOM树中的触发节点和根节点之间按照一定的顺序传播,所有经过的节点都会接收到被触发的事件,这个传播过程被称之为事件流。按照事件的传播顺序,可以将其分为两类,一种是事件冒泡,一种是事件捕获,这里就涉及到本章要介绍的主题了:
1.事件冒泡:
所谓的时间冒泡就是当一个元素触发一个事件,事件会像是水泡一样,从触发元素向它的所有父节点传播,一直到根节点都会接收到此事件,如果父元素中注册了相应的事件处理函数,那么尽管事件在子节点触发的,在父元素上注册的事件处理函数同样会被触发。例如在上面图示中,如果触发a元素的onclick事件,那么它的父元素p、document和widow都会接收到此事件,并且如果在相应的父元素注册有时间处理函数,那么此事件处理函数将会执行,看一段代码实例:

<html>
<head>
<meta charset="utf-8"/>
<title>事件冒泡简单介绍</title>
<script type="text/javascript">
window.onload=function(){
 var table=document.getElementById("mytable");
 table.onclick=function(e){
 var event=e||window.event;
 target=event.srcElement||event.target;
 alert(target.innerHTML);
 }
}
</script>
</head>
<body>
<table width="400" border="1" id="mytable">
<tr>
 <td>三水点靠木</td>
 <td>三水点靠木</td>
 <td>三水点靠木</td>
</tr>
<tr>
 <td>三水点靠木</td>
 <td>三水点靠木</td>
 <td>三水点靠木</td>
</tr>
<tr>
 <td>三水点靠木</td>
 <td>三水点靠木</td>
 <td>三水点靠木</td>
</tr>
</table>
</body>
</html>

以上代码的目的是,当点击相应的单元格的时候就会弹出对应单元格中的内容。但是在上面的实现中并不是为每一个单元格注册onclick事件处理函数,而是将onclick事件处理函数注册于单元格的父元素table上,当点击单元格的时候会触发onclick事件,事件还会从从事件对象向上传播,而table元素恰好有注册的onclick事件处理函数,这个时候就会执行此处理函数,当然这里会设置到传递事件对象参数的问题。所有的浏览器都支持事件冒泡。二.事件捕获:
事件捕获和事件冒泡恰好相反,当点击一个元素的时候,事件传播的方向是从根元素到触发元素,IE浏览器并不支持,为了跨浏览器支持,所以默认情况下一般都是使用冒泡型事件处理模型。
2.javascript阻止事件冒泡代码
事件冒泡在某些场景非常的有用,但是有时候也是必须要阻止,下面是一段能够兼容所有主流浏览器的阻止事件冒泡的实例代码。
代码实例:

function stopBubble(e) 
{ 
 if(e&&e.stopPropagation) 
 { 
 e.stopPropagation(); 
 } 
 else
 { 
 window.event.cancelBubble=true; 
 } 
}

以上代码可以阻止事件冒泡,下面对代码做一下简单注释:
二、代码注释:

  • 1.function stopBubble(e) {},此函数用来阻止事件冒泡,参数是个事件对象。
  • 2. if(e&&e.stopPropagation){e.stopPropagation();},判断是否支持stopPropagation,如果支持就使用e.stopPropagation()。stopPropagation()函数IE10和IE10以下浏览器不支持。
  • 3.window.event.cancelBubble=true,当前IE浏览器使用这个可以阻止事件冒泡。

以上就是关于javascript事件冒泡的详细介绍,希望对大家的学习有所帮助。

Javascript 相关文章推荐
文本框根据输入内容自适应高度的代码
Oct 24 Javascript
js子页面获取父页面数据示例
May 15 Javascript
Bootstrap每天必学之工具提示(Tooltip)插件
Apr 26 Javascript
JS监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法
Aug 05 Javascript
Ionic默认的Tabs模板使用实例
Aug 29 Javascript
使用BootStrap进行轮播图的制作
Jan 06 Javascript
JavaScript中在光标处插入添加文本标签节点的详细方法
Mar 22 Javascript
vue和react等项目中更简单的实现展开收起更多等效果示例
Feb 22 Javascript
小程序tab页无法传递参数的方法
Aug 03 Javascript
vue学习笔记五:在vue项目里面使用引入公共方法详解
Apr 04 Javascript
微信小程序实现类似微信点击语音播放效果
Mar 30 Javascript
JavaScript表格隔行变色和Tab标签页特效示例【附jQuery版】
Jul 11 jQuery
js父页面中使用子页面的方法
Jan 09 #Javascript
jquery调整表格行tr上下顺序实例讲解
Jan 09 #Javascript
实例讲解js验证表单项是否为空的方法
Jan 09 #Javascript
小心!AngularJS结合RequireJS做文件合并压缩的那些坑
Jan 09 #Javascript
javascript跑马灯抽奖实例讲解
Apr 17 #Javascript
jQuery页面刷新(局部、全部)问题分析
Jan 09 #Javascript
javascript返回顶部的按钮实现方法
Jan 09 #Javascript
You might like
关于在php.ini中添加extension=php_mysqli.dll指令的说明
2007/06/14 PHP
PHP将两个关联数组合并函数提高函数效率
2014/03/18 PHP
PHP数组编码gbk与utf8互相转换的两种方法
2016/09/01 PHP
浅谈Laravel模板实体转义带来的坑
2019/10/22 PHP
RR vs IO BO3 第二场2.13
2021/03/10 DOTA
点击广告后才能获得下载地址
2006/10/26 Javascript
基于jquery的一个图片hover的插件
2010/04/24 Javascript
15 个 JavaScript Web UI 库
2010/05/19 Javascript
20个最新的jQuery插件
2012/01/13 Javascript
IE8下Jquery获取select选中的值post到后台报错问题
2014/07/02 Javascript
bootstrap-treeview自定义双击事件实现方法
2016/01/09 Javascript
javascript和jquery实现用户登录验证
2016/05/04 Javascript
Svg.js实例教程及使用手册详解(一)
2016/05/16 Javascript
如何提高Dom访问速度
2017/01/05 Javascript
JS表单数据验证的正则表达式(常用)
2017/02/18 Javascript
Angularjs的启动过程分析
2017/07/18 Javascript
简单谈谈JS中的正则表达式
2017/09/11 Javascript
Angular模版驱动表单的使用总结
2018/05/05 Javascript
vue2单元测试环境搭建
2018/05/24 Javascript
写一个Vue Popup组件
2019/02/25 Javascript
JS实现处理时间,年月日,星期的公共方法示例
2019/05/31 Javascript
在Vue中用canvas实现二维码和图片合成海报的方法
2019/06/10 Javascript
操作按钮悬浮固定在微信小程序底部的实现代码
2019/08/02 Javascript
[32:39]完美世界DOTA2联赛循环赛 Forest vs Inki BO2第一场 11.04
2020/11/04 DOTA
详解Python中 __get__和__getattr__和__getattribute__的区别
2016/06/16 Python
Django rest framework工具包简单用法示例
2018/07/20 Python
Python面向对象程序设计示例小结
2019/01/30 Python
django模板结构优化的方法
2019/02/28 Python
python查找重复图片并删除(图片去重)
2019/07/16 Python
python 中的命名空间,你真的了解吗?
2020/08/19 Python
美国知名日用品连锁超市:Dollar General(多来店)
2017/01/14 全球购物
什么是方法的重载
2013/06/24 面试题
学校评语大全
2014/05/06 职场文书
三严三实民主生活会发言稿
2014/10/13 职场文书
怀孕辞职信怎么写
2015/02/28 职场文书
生日祝酒词大全
2015/08/10 职场文书