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 相关文章推荐
发布一个基于javascript的动画类 Fx.js
Nov 05 Javascript
javascript判断ie浏览器6/7版本加载不同样式表的实现代码
Dec 26 Javascript
javascript 实现 原路返回
Jan 21 Javascript
js实现商城星星评分的效果
Dec 29 Javascript
利用AJAX实现WordPress中的文章列表及评论的分页功能
May 17 Javascript
jquery实现全选、不选、反选的两种方法
Sep 06 Javascript
Vue.js 2.0窥探之Virtual DOM到底是什么?
Feb 10 Javascript
Vue.js基础学习之class与样式绑定
Mar 20 Javascript
vue生成随机验证码的示例代码
Sep 29 Javascript
小程序怎样让wx.navigateBack更好用的方法实现
Nov 01 Javascript
JavaScript多种滤镜算法实现代码实例
Dec 10 Javascript
vue自定义右键菜单之全局实现
Apr 09 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
re0第二季蕾姆被制作组打入冷宫!艾米莉亚女主扶正,原因唏嘘
2020/04/02 日漫
PHP新手上路(六)
2006/10/09 PHP
php单例模式实现(对象只被创建一次)
2012/12/05 PHP
php对象和数组相互转换的方法
2015/05/12 PHP
优化WordPress中文章与评论的时间显示
2016/01/12 PHP
php+js实现百度地图多点标注的方法
2016/11/30 PHP
PHP获取当前日期及本周一是几月几号的方法
2017/03/28 PHP
jquery下利用jsonp跨域访问实现方法
2010/07/29 Javascript
js下通过prototype扩展实现indexOf的代码
2010/12/08 Javascript
js如何实现设计模式中的模板方法
2013/07/23 Javascript
jquery更换文章内容与改变字体大小代码
2013/09/30 Javascript
详解JavaScript的Polymer框架中的通知交互
2015/07/29 Javascript
JavaScript兼容浏览器FF/IE技巧
2016/08/14 Javascript
angularjs实现文字上下无缝滚动特效代码
2016/09/04 Javascript
jQuery实现select模糊查询(反射机制)
2017/01/14 Javascript
js cookie实现记住密码功能
2017/01/17 Javascript
js转换对象为xml
2017/02/17 Javascript
微信小程序switch组件使用详解
2018/01/31 Javascript
vue axios 在页面切换时中断请求方法 ajax
2018/03/05 Javascript
深入学习js函数的隐式参数 arguments 和 this
2019/06/24 Javascript
JS防抖和节流实例解析
2019/09/24 Javascript
vue 使用 sortable 实现 el-table 拖拽排序功能
2020/12/26 Vue.js
python k-近邻算法实例分享
2014/06/11 Python
Python smallseg分词用法实例分析
2015/05/28 Python
python中nan与inf转为特定数字方法示例
2017/05/11 Python
matplotlib绘制符合论文要求的图片实例(必看篇)
2017/06/02 Python
Python遍历pandas数据方法总结
2018/02/09 Python
python 通过xml获取测试节点和属性的实例
2018/03/31 Python
利用python如何在前程无忧高效投递简历
2019/05/07 Python
网易有道2017内推编程题 洗牌(python)
2019/06/19 Python
使用 Python 在京东上抢口罩的思路详解
2020/02/27 Python
pycharm 实现复制一行的快捷键
2021/01/15 Python
Footshop罗马尼亚:最好的运动鞋选择
2019/09/10 全球购物
2014年入党积极分子党课学习心得体会模板
2014/04/03 职场文书
个人委托书怎么写
2014/09/17 职场文书
三方股东合作协议书范本
2014/09/28 职场文书