js冒泡、捕获事件及阻止冒泡方法详细总结


Posted in Javascript onMay 08, 2014

javascript, jquery的事件中都存在事件冒泡和事件捕获的问题,下面将两种问题及其解决方案做详细总结。

事件冒泡是一个从子节点向祖先节点冒泡的过程;

事件捕获刚好相反,是从祖先节点到子节点的过程。

给一个jquery点击事件的例子:

代码如下:

<!DOCTYPE html> 
<meta charset="utf-8"> 
<title>test</title> 
<head> 
<script src="http://code.jquery.com/jquery-latest.js"></script> 
<script type="text/javascript"> 
$(function(){ 
$('#clickMe').click(function(){ 
alert('hello'); 
}); 
$('body').click(function(){ 
alert('baby'); 
}); 
}); 
</script> 
</head> 
<body> 
<div style="width:100px;height:100px;background-color:red;"> 
<button type="button" id="button2">click me</button> 
<button id="clickMe">click</button> 
</div> 
</body> 
</html>

事件冒泡现象:点击 “id=clickMe” 的button,会先后出现“hello” 和 “baby” 两个弹出框。

分析:当点击 “id=clickMe” 的button时,触发了绑定在button 和 button 父元素及body的点击事件,所以先后弹出两个框,出现所谓的冒泡现象。

事件捕获现象:点击没有绑定点击事件的div和 “id=button2” 的button, 都会弹出 “baby” 的对话框。

在实际的项目中,我们要阻止事件冒泡和事件捕获现象。

阻止事件冒泡方法:

法1:当前点击事件中return false;

$('#clickMe').click(function(){ 
alert('hello'); return false; 
});

法2:
$('#clickMe').click(function(event){ 
alert('hello'); var e = window.event || event; 
if ( e.stopPropagation ){ //如果提供了事件对象,则这是一个非IE浏览器 
e.stopPropagation(); 
}else{ 
//兼容IE的方式来取消事件冒泡 
window.event.cancelBubble = true; 
} 
});

貌似捕获事件不能被阻止
Javascript 相关文章推荐
JS中处理与当前时间间隔的函数代码
May 23 Javascript
setInterval()和setTimeout()的用法和区别示例介绍
Nov 17 Javascript
javascript+canvas制作九宫格小程序
Dec 28 Javascript
JQuery中Ajax()的data参数类型实例分析
Dec 15 Javascript
js每隔两秒输出数组中的一项(实例)
May 28 Javascript
axios 封装上传文件的请求方法
Sep 26 Javascript
微信小程序实现预览图片功能
Oct 22 Javascript
jquery将json转为数据字典的实例代码
Oct 11 jQuery
Vue中axios拦截器如何单独配置token
Dec 27 Javascript
es6函数name属性功能与用法实例分析
Apr 18 Javascript
使用Vue Composition API写出清晰、可扩展的表单实现
Jun 10 Javascript
JavaScript浅层克隆与深度克隆示例详解
Sep 01 Javascript
JavaScript二维数组实现的省市联动菜单
May 08 #Javascript
javascript中setTimeout的问题解决方法
May 08 #Javascript
在JavaScript中使用timer示例
May 08 #Javascript
JavaScript中读取和保存文件实例
May 08 #Javascript
ExtJS中设置下拉列表框不可编辑的方法
May 07 #Javascript
jquery 显示*天*时*分*秒实现时间计时器
May 07 #Javascript
解决jQuery动态获取手机屏幕高和宽的问题
May 07 #Javascript
You might like
把从SQL中取出的数据转化成XMl格式
2006/10/09 PHP
重新封装zend_soap实现http连接安全认证的php代码
2011/01/12 PHP
phpStudy配置多站点多域名方法及遇到的403错误解决方法
2017/10/19 PHP
PHP中单例模式的使用场景与使用方法讲解
2019/03/18 PHP
showModelessDialog()使用详解
2006/09/21 Javascript
一个刚完成的layout(拖动流畅,不受iframe影响)
2007/08/17 Javascript
XENON基于JSON变种
2010/07/27 Javascript
JavaScript加强之自定义event事件
2013/09/21 Javascript
jquery validation验证身份证号,护照,电话号码,email(实例代码)
2013/11/06 Javascript
jQuery过滤选择器用法分析
2015/02/10 Javascript
jQuery插件pagewalkthrough实现引导页效果
2015/07/05 Javascript
javascript如何操作HTML下拉列表标签
2015/08/20 Javascript
简单谈谈JavaScript的同步与异步
2015/12/31 Javascript
jquery中live()方法和bind()方法区别分析
2016/06/23 Javascript
js仿小米官网图片轮播特效
2016/09/29 Javascript
基于JS实现的随机数字抽签实例
2016/12/08 Javascript
angular2中Http请求原理与用法详解
2018/01/11 Javascript
在Vue中使用Select选择器拼接label的操作
2020/10/22 Javascript
[14:56]教你分分钟做大人:巫医
2014/10/30 DOTA
[04:03]辉夜杯主赛事 12月25日RECAP精彩回顾
2015/12/26 DOTA
[34:27]DOTA2上海特级锦标赛B组败者赛 VG VS Spirit第一局
2016/02/26 DOTA
[01:51]DAC趣味视频-如何成为职业选手.mp4
2017/04/02 DOTA
Python的Django框架中的数据过滤功能
2015/07/17 Python
利用python解决mysql视图导入导出依赖的问题
2017/12/17 Python
python负载均衡的简单实现方法
2018/02/04 Python
Python实现制度转换(货币,温度,长度)
2019/07/14 Python
PHP基于phpqrcode类库生成二维码过程解析
2020/05/28 Python
解决运行django程序出错问题 'str'object has no attribute'_meta'
2020/07/15 Python
一些PHP的面试题
2015/05/06 面试题
sealed修饰符是干什么的
2012/10/23 面试题
如何用Python输出一个Fibonacci数列
2016/08/28 面试题
化工机械应届生求职信
2013/11/04 职场文书
公务员平时考核实施方案
2014/03/11 职场文书
小学生志愿者活动方案
2014/08/23 职场文书
田径运动会通讯稿
2014/09/13 职场文书
2014年银行工作总结范文
2014/11/12 职场文书