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 相关文章推荐
基于jquery的15款幻灯片插件
Apr 10 Javascript
简略说明Javascript中的= =(等于)与= = =(全等于)区别
Apr 16 Javascript
JQuery分别取得每行最后一列和最后一行的示例代码
Aug 18 Javascript
jQuery简易图片放大特效示例代码
Jun 09 Javascript
js中函数声明与函数表达式
Jun 03 Javascript
解决微信浏览器Javascript无法使用window.location.reload()刷新页面
Jun 21 Javascript
angular源码学习第一篇 setupModuleLoader方法
Oct 20 Javascript
jQuery动态添加.active 实现导航效果代码思路详解
Aug 29 jQuery
Angular CLI 安装和使用教程
Sep 13 Javascript
js动态引入的四种方法
May 05 Javascript
js屏蔽F12审查元素,禁止修改页面代码等实现代码
Oct 02 Javascript
vue如何使用模拟的json数据查看效果
Mar 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简洁函数小结
2011/08/12 PHP
支持中文和其他编码的php截取字符串函数分享(截取中文字符串)
2014/03/13 PHP
php获得网站访问统计信息类Compete API用法实例
2015/04/02 PHP
初识ThinkPHP控制器
2016/04/07 PHP
php修改数组键名的方法示例
2017/04/15 PHP
php对微信支付回调处理的方法
2018/08/23 PHP
PDO::getAvailableDrivers讲解
2019/01/28 PHP
Laravel核心解读之异常处理的实践过程
2019/02/24 PHP
如何确保JavaScript的执行顺序 之jQuery.html深度分析
2011/03/03 Javascript
html dom节点操作(获取/修改/添加或删除)
2014/01/23 Javascript
js实现按一下删除键删除整个单词附demo
2014/09/05 Javascript
Jquery为DIV添加click事件的简单实例
2016/06/02 Javascript
bootstrap Table插件使用demo
2017/08/07 Javascript
vue-cli的eslint相关用法
2017/09/29 Javascript
vue中使用vue-router切换页面时滚动条自动滚动到顶部的方法
2017/11/28 Javascript
vue项目中v-model父子组件通信的实现详解
2017/12/10 Javascript
JavaScript中arguments和this对象用法分析
2018/08/08 Javascript
createObjectURL方法实现本地图片预览
2019/09/30 Javascript
Vue 开发必须知道的36个技巧(小结)
2019/10/09 Javascript
使用JavaScript获取扫码枪扫描得到的条形码的思路代码详解
2020/06/10 Javascript
[03:14]2014DOTA2西雅图国际邀请赛 EG战队巡礼
2014/07/07 DOTA
[03:55]DOTA2完美大师赛选手传记——LFY.MONET
2017/11/18 DOTA
如何用itertools解决无序排列组合的问题
2017/05/18 Python
Python基于正则表达式实现文件内容替换的方法
2017/08/30 Python
pandas DataFrame数据转为list的方法
2018/04/11 Python
pygame实现打字游戏
2021/02/19 Python
Python脚本去除文件的只读性操作
2020/03/05 Python
Python数据可视化实现多种图例代码详解
2020/07/14 Python
Django REST Framework 分页(Pagination)详解
2020/11/30 Python
html5+css3实现一款注册表单实例
2013/04/17 HTML / CSS
联想德国官网:Lenovo Germany
2018/07/04 全球购物
新西兰领先的内衣店:Bendon Lingerie新西兰
2018/07/11 全球购物
招聘专员岗位职责
2014/03/07 职场文书
做人民满意的公务员活动方案
2014/08/25 职场文书
学校机关党总支领导班子整改工作方案
2014/10/26 职场文书
2014年作风建设工作总结
2014/10/29 职场文书