详解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 相关文章推荐
js实现的网站首页随机公告随机公告
Mar 14 Javascript
JQuery触发radio或checkbox的change事件
Dec 18 Javascript
JS实现定时页面弹出类似QQ新闻的提示框
Nov 07 Javascript
JQuery与Ajax调用新浪API获取短网址的代码
Feb 07 Javascript
jQuery页面加载初始化常用的三种方法
Jun 04 Javascript
JS跨域问题详解
Nov 25 Javascript
jquery实现增加删除行的方法
Feb 03 Javascript
node+experss实现爬取电影天堂爬虫
Nov 20 Javascript
微信小程序 Tab页切换更新数据
Jan 05 Javascript
angular中不同的组件间传值与通信的方法
Nov 04 Javascript
在Create React App中使用CSS Modules的方法示例
Jan 15 Javascript
prettier自动格式化去换行的实现代码
Aug 25 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
在PHP中使用XML
2006/10/09 PHP
需要注意的几个PHP漏洞小结
2012/02/05 PHP
ThinkPHP验证码和分页实例教程
2014/08/22 PHP
ThinkPHP5.1+Ajax实现的无刷新分页功能示例
2020/02/10 PHP
jquery tab插件制作实现代码
2010/06/22 Javascript
jQuery判断元素是否是隐藏的代码
2011/04/24 Javascript
用js实现判断当前网址的来路如果不是指定的来路就跳转到指定页面
2011/05/02 Javascript
toggle一个div显示或隐藏且可扩展成自定义下拉框
2013/09/12 Javascript
js分页代码分享
2014/04/28 Javascript
在Linux上用forever实现Node.js项目自启动
2014/07/09 Javascript
jquery插件autocomplete用法示例
2016/07/01 Javascript
关于Javascript中document.cookie的使用
2017/03/08 Javascript
JS正则获取HTML元素的方法
2017/03/31 Javascript
Nodejs读取文件时相对路径的正确写法(使用fs模块)
2017/04/27 NodeJs
Angular4 反向代理Details实践
2018/05/30 Javascript
微信小程序支付功能 php后台对接完整代码分享
2018/06/12 Javascript
vue.js 子组件无法获取父组件store值的解决方式
2019/11/08 Javascript
解决vue prop传值default属性如何使用,为何不生效的问题
2020/09/21 Javascript
Vue实现手机号、验证码登录(60s禁用倒计时)
2020/12/19 Vue.js
python3对拉勾数据进行可视化分析的方法详解
2019/04/03 Python
Python requests模块基础使用方法实例及高级应用(自动登陆,抓取网页源码)实例详解
2020/02/14 Python
Python Scrapy框架:通用爬虫之CrawlSpider用法简单示例
2020/04/11 Python
使用Python FastAPI构建Web服务的实现
2020/06/08 Python
C语言面试题
2013/05/19 面试题
UDP协议功能
2013/01/06 面试题
大学生活学习的自我评价
2013/12/03 职场文书
房屋改造计划书
2014/01/10 职场文书
写给老婆的检讨书
2014/02/21 职场文书
体育专业自荐书
2014/05/29 职场文书
安全责任书怎么写
2014/07/28 职场文书
纪念九一八爱国演讲稿600字
2014/09/14 职场文书
报表员工作失误检讨书范文
2014/09/19 职场文书
2015年大学生党员承诺书
2015/04/27 职场文书
深入讲解数据库中Decimal类型的使用以及实现方法
2022/02/15 MySQL
python创建字典及相关管理操作
2022/04/13 Python
ant design vue的form表单取值方法
2022/06/01 Vue.js