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实现滑动解锁功能
Dec 31 Javascript
js进行表单验证实例分析
Feb 10 Javascript
Bootstrap3制作图片轮播效果
May 12 Javascript
【经验总结】编写JavaScript代码时应遵循的14条规律
Jun 20 Javascript
Mvc提交表单的四种方法全程详解
Aug 10 Javascript
js判断价格,必须为数字且不能为负数的实现方法
Oct 07 Javascript
JavaScript的兼容性与调试技巧
Nov 22 Javascript
纯js模仿windows系统日历
Feb 04 Javascript
JavaScript函数柯里化原理与用法分析
Mar 31 Javascript
jquery实现侧边栏左右伸缩效果的示例
Dec 19 jQuery
基于JavaScript实现单例模式
Oct 30 Javascript
js实现整体缩放页面适配移动端
Mar 31 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 网上商城促销设计实例代码
2012/02/17 PHP
PHP7多线程搭建教程
2017/04/21 PHP
swoole和websocket简单聊天室开发
2017/11/18 PHP
php 截取中英文混合字符串的方法
2018/05/31 PHP
PHP实现随机发扑克牌
2020/04/22 PHP
(jQuery,mootools,dojo)使用适合自己的编程别名命名
2010/09/14 Javascript
jQuery 表单验证扩展代码(一)
2010/10/11 Javascript
jQuery动态地获取系统时间实现代码
2013/05/24 Javascript
js清除input中type等于file的值域(示例代码)
2013/12/24 Javascript
JQuery结合CSS操作打印样式的方法
2013/12/24 Javascript
使用JavaScript制作一个简单的计数器的方法
2015/07/07 Javascript
jQuery学习心得总结(必看篇)
2016/06/10 Javascript
jquery实现转盘抽奖功能
2017/01/06 Javascript
vue2.0实战之使用vue-cli搭建项目(2)
2017/03/27 Javascript
React-Native实现ListView组件之上拉刷新实例(iOS和Android通用)
2017/07/11 Javascript
JavaScript面向对象精要(下部)
2017/09/12 Javascript
js canvas实现写字动画效果
2018/11/30 Javascript
如何使用Javascript中的this关键字
2020/05/28 Javascript
js canvas实现五子棋小游戏
2021/01/22 Javascript
对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解
2018/06/28 Python
python文件写入write()的操作
2019/05/14 Python
python lambda表达式(匿名函数)写法解析
2019/09/16 Python
浅谈Pycharm最有必要改的几个默认设置项
2020/02/14 Python
keras用auc做metrics以及早停实例
2020/07/02 Python
详解Anaconda 的安装教程
2020/09/23 Python
浅析Python 字符编码与文件处理
2020/09/24 Python
Python中常用的os操作汇总
2020/11/05 Python
Prototype中如何为一个元素添加一个方法
2014/12/08 面试题
计算机网络毕业生自荐信
2013/10/01 职场文书
市场调查策划方案
2014/06/10 职场文书
2014年最新大专生职业生涯规划书范文
2014/09/13 职场文书
泸县召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
2016十一国庆节慰问信
2015/12/01 职场文书
go语言中json数据的读取和写出操作
2021/04/28 Golang
mysql5.7的安装及Navicate长久免费使用的实现过程
2021/11/17 MySQL
Python使用DFA算法过滤内容敏感词
2022/04/22 Python