Js冒泡事件详解及阻止示例


Posted in Javascript onMarch 21, 2014

Js冒泡机制是指如果某元素定义了事件A,如click事件,如果触发了事件之后,没有阻止冒泡事件,那么事件将向父级元素传播,触发父类的click函数。
如下例所示:

<html> 
<script type="text/javascript" src="jquery-1.7.1.js"></script> 
<script> 
function ialertdouble(e) { 
alert('innerdouble'); 
stopBubble(e); 
} function ialertthree(e) { 
alert('innerthree'); 
stopBubbleDouble(e); 
} 
function stopBubble(e) { 
var evt = e||window.event; 
evt.stopPropagation?evt.stopPropagation():(evt.cancelBubble=true);//阻止冒泡 
} 
function stopBubbleDouble(e) { 
var evt = e||window.event; 
evt.stopPropagation?evt.stopPropagation():(evt.cancelBubble=true);//阻止冒泡 
evt.preventDefault();//阻止浏览器默认行为,这样链接就不会跳转 
} 
$(function() { 
//方法一 
//$('#jquerytest').click(function(event) { 
// alert('innerfour'); 
// event.stopPropagation(); 
// event.preventDefault(); 
//}); 
//方法二 
$('#jquerytest').click(function() { 
alert('innerfour'); 
return false; 
}); 
}); 
</script> 
<div onclick="alert('without');">without 
<div onclick="alert('middle');">middle 
<div onclick="alert('inner');">inner</div> 
<div onclick="ialertdouble(event)">innerdouble</div> 
<p><a href='http://www.baidu.com' onclick="ialertthree(event)">innerthree</a></p> 
<p id='jquerytest'><a href='http://www.baidu.com'>innerfour</a></p> 
</div> 
</div> 
</html>

当你点击inner的时候,会依次弹出‘inner',‘middle'和‘without'。这就是事件冒泡。

从直观上来看,也是这样的,因为最里层的区域是在父级节点中的,点击了子级节点的区域,其实也是点击了父级节点的区域,所以事件会传播起来。

其实,很多的时候,我们并不想事件冒泡,因为这样会同时触发几个事件。

接下来:我们点击innerdouble。就会发现她并没有冒泡,因为她在调用的方法ialertdouble()中调用了stopBubble()方法,方法通过判断浏览器类型(Ie通过cancleBubble() 、firefox通过stopProgation())来阻止冒泡。

但如果是链接的话,我们会发现她也会阻止冒泡,但是会跳转,这就是浏览器的默认行为。需要借助preventDefault()方法来阻止。具体可以查看ialertthree()。

目前主流的都是借助jquery来绑定click事件的,这样的话,就简单多了。

我们可以在点击事件时传入参数event,然后直接

event.stopPropagation();
event.preventDefault(); //没有链接不需要加这个。

这样就可以了。

框架就是好,其实还有更简单的,在事件处理程序中返回false,这是对在事件对象上同时调用stopPropagation()和preventDefault()的一种简写方式。
【详细代码见上面,记得载入jquery.js。】

其实也还可以在每个click事件中加入判断:

$('#id').click(function(event){ 
if(event.target==this){ 
//do something 
} 
})

解析:事件处理程序中的变量event保存着事件对象。而event.target属性保存着发生事件的目标元素。这个属性是DOM API中规定的,但是没有被所有浏览器实现 。jQuery对这个事件对象进行了必要的扩展,从而在任何浏览器中都能够使用这个属性。通过.target,可以确定DOM中首先接收到事件的元素(即实际被单击的元素)。而且,我们知道this引用的是处理事件的DOM元素,所以可以编写以上代码。

不过推荐使用return false,Jquery绑定事件的话。

Javascript 相关文章推荐
计算世界完全对称日的js代码,粗糙版
Nov 04 Javascript
JQuery实现用户名无刷新验证的小例子
Mar 22 Javascript
使用jquery实现简单的ajax
Jul 08 Javascript
jQuery中:first-child选择器用法实例
Dec 31 Javascript
JS+CSS实现淡入式焦点图片幻灯切换效果的方法
Feb 26 Javascript
JavaScript控制table某列不显示的方法
Mar 16 Javascript
javascript入门教程基础篇
Nov 16 Javascript
解决JS无法调用Controller问题的方法
Dec 31 Javascript
Underscore之Array_动力节点Java学院整理
Jul 10 Javascript
浅谈Node.js之异步流控制
Oct 25 Javascript
微信小程序module.exports模块化操作实例浅析
Dec 20 Javascript
vue基于Teleport实现Modal组件
May 31 Vue.js
js调用浏览器打印模块实现点击按钮触发自定义函数
Mar 21 #Javascript
js中把JSON字符串转换成JSON对象最好的方法
Mar 21 #Javascript
jquery插件冲突(jquery.noconflict)解决方法分享
Mar 20 #Javascript
将中国标准时间转换成标准格式的代码
Mar 20 #Javascript
如何将php数组或者对象传递给javascript
Mar 20 #Javascript
js 触发select onchange事件代码
Mar 20 #Javascript
ie9 提示'console' 未定义问题的解决方法
Mar 20 #Javascript
You might like
PHP使用Session遇到的一个Permission denied Notice解决办法
2014/07/30 PHP
PHP Curl模拟登录微信公众平台、新浪微博实例代码
2016/01/28 PHP
详谈php静态方法及普通方法的区别
2016/10/04 PHP
Js动态添加复选框Checkbox的实例方法
2013/04/08 Javascript
jquery ajax 局部无刷新更新数据的实现案例
2014/02/08 Javascript
jQuery的选择器中的通配符使用介绍
2014/03/20 Javascript
JavaScript数组函数unshift、shift、pop、push使用实例
2014/08/27 Javascript
jquery实现点击展开列表同时隐藏其他列表
2015/08/10 Javascript
EditPlus中的正则表达式 实战(4)
2016/12/15 Javascript
Angular的自定义指令以及实例
2016/12/26 Javascript
微信小程序实现富文本图片宽度自适应的方法
2019/01/20 Javascript
js图片查看器插件用法示例
2019/06/22 Javascript
微信小程序下拉框搜索功能的实现方法
2019/07/31 Javascript
全面解析Vue中的$nextTick
2020/12/24 Vue.js
[02:43]DOTA2英雄基础教程 圣堂刺客
2013/12/09 DOTA
Python实现扫描局域网活动ip(扫描在线电脑)
2015/04/28 Python
Python实现FTP上传文件或文件夹实例(递归)
2017/01/16 Python
详解Python pygame安装过程笔记
2017/06/05 Python
Python中django学习心得
2017/12/06 Python
python操作列表的函数使用代码详解
2017/12/28 Python
Python网络编程之TCP与UDP协议套接字用法示例
2018/02/02 Python
Python 面试中 8 个必考问题
2018/11/16 Python
Flask框架学习笔记之表单基础介绍与表单提交方式
2019/08/12 Python
PyCharm 2019.3发布增加了新功能一览
2019/12/08 Python
html5 postMessage解决跨域、跨窗口消息传递方案
2016/12/20 HTML / CSS
凯特王妃父母建立的派对用品网站:Party Pieces
2017/05/28 全球购物
语文教学感言
2014/02/06 职场文书
创建省级文明单位实施方案
2014/02/27 职场文书
教职工代表大会主持词
2014/04/01 职场文书
合作意向协议书
2015/01/29 职场文书
供应商食品安全承诺书
2015/04/29 职场文书
公司借条范本
2015/05/25 职场文书
2019年汽车租赁合同范本!
2019/08/12 职场文书
ORACLE数据库应用开发的三十个注意事项
2021/06/07 Oracle
mysql left join快速转inner join的过程
2021/06/30 MySQL
Dubbo+zookeeper搭配分布式服务的过程详解
2022/04/03 Java/Android