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 相关文章推荐
用Div仿showModalDialog模式菜单的效果的代码
Mar 05 Javascript
js修改原型的属性使用介绍
Jan 26 Javascript
JavaScript中使用Math.PI圆周率属性的方法
Jun 14 Javascript
JavaScript实现单击下拉框选择直接跳转页面的方法
Jul 02 Javascript
JavaScript实现下拉列表框数据增加、删除、上下排序的方法
Aug 11 Javascript
javascript中new Array()和var arr=[]用法区别
Dec 01 Javascript
JavaScript实现的简单加密解密操作示例
Jun 01 Javascript
vue.js使用v-if实现显示与隐藏功能示例
Jul 06 Javascript
iView-admin 动态路由问题的解决方法
Oct 03 Javascript
JavaScript实现简单轮播图效果
Dec 01 Javascript
在vue中使用jsx语法的使用方法
Sep 30 Javascript
vue项目配置sass及引入外部scss文件
Apr 14 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
一些操作和快捷键的理解和讨论
2020/03/04 星际争霸
PHP 计算代码执行耗时的代码修正网上普遍错误
2011/05/14 PHP
php打印输出棋盘的实现方法
2014/12/23 PHP
PHP开启目录引索+fancyindex漂亮目录浏览带搜索功能
2019/09/23 PHP
javascript下高性能字符串连接StringBuffer类
2010/08/16 Javascript
用Jquery重写windows.alert方法实现思路
2013/04/03 Javascript
Jquery Ajax解析XML数据(同步及异步调用)简单实例
2014/02/12 Javascript
判断window.onload是否多次使用的方法
2014/09/21 Javascript
简介JavaScript中getUTCMonth()方法的使用
2015/06/10 Javascript
JS随机调用指定函数的方法
2015/07/01 Javascript
JavaScript判断IE版本型号
2015/07/27 Javascript
chrome浏览器如何断点调试异步加载的JS
2016/09/05 Javascript
jQuery 添加样式属性的优先级别方法(推荐)
2017/06/08 jQuery
Node.js 回调函数实例详解
2017/07/06 Javascript
angularjs2 ng2 密码隐藏显示的实例代码
2017/08/01 Javascript
bootstrap3-dialog-master模态框使用详解
2017/08/22 Javascript
ES6/JavaScript使用技巧分享
2017/12/14 Javascript
微信小程序使用form表单获取输入框数据的实例代码
2018/05/17 Javascript
详解Vuex下Store的模块化拆分实践
2019/07/31 Javascript
uniapp电商小程序实现订单30分钟倒计时
2020/11/01 Javascript
python字符串过滤性能比较5种方法
2017/06/22 Python
python3实现域名查询和whois查询功能
2018/06/21 Python
python爬虫开发之selenium模块详细使用方法与实例全解
2020/03/09 Python
django filter过滤器实现显示某个类型指定字段不同值方式
2020/07/16 Python
Python字符串三种格式化输出
2020/09/17 Python
基于HTML5 Canvas 实现商场监控实例详解
2017/11/20 HTML / CSS
失业者真诚求职信范文
2013/12/25 职场文书
青春励志演讲稿
2014/04/29 职场文书
工作态度不端正检讨书
2014/10/04 职场文书
学校总务处领导干部个人对照检查材料思想汇报
2014/10/06 职场文书
爱晚亭导游词
2015/02/09 职场文书
2015年小学语文教学工作总结
2015/05/25 职场文书
求职信如何撰写?
2019/05/22 职场文书
Filebeat 采集 Nginx 日志的方法
2021/03/31 Servers
Python如何用re模块实现简易tokenizer
2022/05/02 Python
pd.drop_duplicates删除重复行的方法实现
2022/06/16 Python