详解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 相关文章推荐
JQuery 风格的HTML文本转义
Jul 01 Javascript
jquery中获取元素的几种方式小结
Jul 05 Javascript
javascript中节点的最近的相关节点访问方法
Mar 20 Javascript
javascript读写json示例
Apr 11 Javascript
JS中自定义定时器让它在某一时刻执行
Sep 02 Javascript
javascript省市级联功能实现方法实例详解
Oct 20 Javascript
JS前端开发判断是否是手机端并跳转操作(小结)
Feb 05 Javascript
SpringMVC简单整合Angular2的示例
Jul 31 Javascript
谈谈对vue响应式数据更新的误解
Aug 01 Javascript
JS实现将链接生成二维码并转为图片的方法
Mar 17 Javascript
JavaScript使用ul中li标签实现删除效果
Apr 15 Javascript
js实现浏览器打印功能的示例代码
Jul 15 Javascript
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
apache2.2.4+mysql5.0.77+php5.2.8安装精简
2009/04/29 PHP
PHP异步调用socket实现代码
2012/01/12 PHP
怎样使用php与jquery设置和读取cookies
2013/08/08 PHP
php二分查找二种实现示例
2014/03/12 PHP
WordPress中给媒体文件添加分类和标签的PHP功能实现
2015/12/31 PHP
php5.2的curl-bug 服务器被php进程卡死问题排查
2016/09/19 PHP
老生常谈PHP面向对象之注册表模式
2017/05/26 PHP
从Ajax到JQuery Ajax学习
2007/02/14 Javascript
在textarea中显示html页面的javascript代码
2007/04/20 Javascript
javascript实现上传图片前的预览(TX的面试题)
2007/08/20 Javascript
JS 自定义带默认值的函数
2011/07/21 Javascript
javascript 运算数的求值顺序
2011/08/23 Javascript
利用js实现遮罩以及弹出可移动登录窗口
2013/07/08 Javascript
JS自调用匿名函数具体实现
2014/02/11 Javascript
jQuery判断元素上是否绑定了指定事件的方法
2015/03/17 Javascript
JavaScript数据绑定实现一个简单的 MVVM 库
2016/04/08 Javascript
jquery实现(textarea)placeholder自动换行
2016/12/22 Javascript
jQuery实现动态添加、删除按钮及input输入框的方法
2017/04/27 jQuery
Node.JS利用PhantomJs抓取网页入门教程
2017/05/19 Javascript
js指定步长实现单方向匀速运动
2017/07/17 Javascript
详解使用nvm安装node.js
2017/07/18 Javascript
jQuery+SpringMVC中的复选框选择与传值实例
2018/01/08 jQuery
微信小程序canvas开发水果老虎机的思路详解
2020/02/07 Javascript
vue 路由懒加载中给 Webpack Chunks 命名的方法
2020/04/24 Javascript
Js on及addEventListener原理用法区别解析
2020/07/11 Javascript
Python计算回文数的方法
2015/03/11 Python
解决django后台管理界面添加中文内容乱码问题
2019/11/15 Python
Python判断三段线能否构成三角形的代码
2020/04/12 Python
Pycharm生成可执行文件.exe的实现方法
2020/06/02 Python
pycharm 实现本地写代码,服务器运行的操作
2020/06/08 Python
自荐书范文
2013/12/08 职场文书
单位门卫岗位职责
2013/12/20 职场文书
煤矿安全承诺书
2014/05/22 职场文书
离婚协议书范文2014
2014/10/16 职场文书
写给孩子的新学期寄语
2015/02/27 职场文书
vue 自定义组件添加原生事件
2022/04/21 Vue.js