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之函数直接量(function(){})()
Jun 29 Javascript
浅析js中的浮点型运算问题
Jan 06 Javascript
jQuery的3种请求方式$.post,$.get,$.getJSON
Mar 28 Javascript
js监听鼠标点击和键盘点击事件并自动跳转页面
Sep 24 Javascript
jQuery实现菜单式图片滑动切换
Mar 14 Javascript
JavaScript使用push方法添加一个元素到数组末尾用法实例
Apr 06 Javascript
详解微信小程序 通过控制CSS实现view隐藏与显示
May 24 Javascript
vue按需引入element Transfer 穿梭框
Sep 30 Javascript
利用vue+elementUI实现部分引入组件的方法详解
Nov 22 Javascript
JavaScript实现页面中录音功能的方法
Jun 04 Javascript
node.js中process进程的概念和child_process子进程模块的使用方法示例
Feb 11 Javascript
vue项目,代码提交至码云,iconfont的用法说明
Jul 30 Javascript
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/11/09 PHP
浅谈PHP正则表达式中修饰符/i, /is, /s, /isU
2014/10/21 PHP
PHP中预定义的6种接口介绍
2015/05/12 PHP
深入理解PHP变量的值类型和引用类型
2015/10/21 PHP
PHP Smarty模版简单使用方法
2016/03/30 PHP
PHP实现websocket通信的方法示例
2018/08/28 PHP
google地图的路线实现代码
2009/08/20 Javascript
javascript 密码框防止用户粘贴和复制的实现代码
2014/02/17 Javascript
Node.js Sequelize如何实现数据库的读写分离
2016/10/23 Javascript
vue.js开发实现全局调用的MessageBox组件实例代码
2017/11/22 Javascript
使用 vue.js 构建大型单页应用
2018/02/10 Javascript
Angular数据绑定机制原理
2018/04/17 Javascript
jQuery实现菜单的显示和隐藏功能示例
2018/07/24 jQuery
vue头部导航动态点击处理方法
2018/11/02 Javascript
jQuery 同时获取多个标签的指定内容并储存为数组
2018/11/20 jQuery
vue3.0封装轮播图组件的步骤
2021/03/04 Vue.js
[02:28]DOTA2亚洲邀请赛附加赛 RECAP赛事回顾
2015/01/29 DOTA
[01:20]PWL S2开团时刻第三期——团战可以输 蝙蝠必须死
2020/11/26 DOTA
Python实现求数列和的方法示例
2018/01/12 Python
详解pyenv下使用python matplotlib模块的问题解决
2018/11/29 Python
基于Python实现用户管理系统
2019/02/26 Python
利用python numpy+matplotlib绘制股票k线图的方法
2019/06/26 Python
使用Python脚本zabbix自定义key监控oracle连接状态
2019/08/28 Python
PyCharm2020.1.2社区版安装,配置及使用教程详解(Windows)
2020/08/07 Python
美国百货齐全的精品网站,提供美式风格的产品:Overstock.com
2016/07/22 全球购物
《三袋麦子》教学反思
2014/03/02 职场文书
《老山界》教学反思
2014/04/08 职场文书
《独坐敬亭山》教学反思
2014/04/08 职场文书
小学节能减排倡议书
2014/05/15 职场文书
电子专业毕业生自荐信
2014/05/25 职场文书
求职简历自我评价范文
2015/03/10 职场文书
2015年高中语文教学总结
2015/08/18 职场文书
军训决心书范文
2015/09/22 职场文书
python脚本框架webpy模板赋值实现
2021/11/20 Python
宫崎骏十大动画电影,宫崎骏好看的动画电影排名
2022/03/22 日漫
MySQL主从切换的超详细步骤
2022/06/28 MySQL