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 相关文章推荐
屏蔽F1~F12的快捷键的js函数
May 06 Javascript
深入理解jQuery中live与bind方法的区别
Dec 18 Javascript
js中生成map对象的方法
Jan 09 Javascript
一步步教大家编写酷炫的导航栏js+css实现
Mar 14 Javascript
BootStrap tab选项卡使用小结
Aug 09 Javascript
jQuery基本选择器和层次选择器学习使用
Feb 27 Javascript
基于Vue实现tab栏切换内容不断实时刷新数据功能
Apr 13 Javascript
JavaScript输入框字数实时统计更新
Jun 17 Javascript
Angularjs中ng-repeat的简单实例
Aug 25 Javascript
jquery select插件异步实时搜索实例代码
Oct 20 jQuery
Node.js搭建小程序后台服务
Jan 03 Javascript
vue a标签点击实现赋值方式
Sep 07 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通用检测函数集合
2006/11/25 PHP
Joomla数据库操作之JFactory::getDBO用法
2016/05/05 PHP
PHP递归遍历指定文件夹内的文件实现方法
2016/11/15 PHP
PHP sdk文档处理常用代码示例解析
2020/12/09 PHP
javascript form 验证函数 弹出对话框形式
2009/06/23 Javascript
IE浏览器打印的页眉页脚设置解决方法
2009/12/08 Javascript
jQuery的实现原理的模拟代码 -2 数据部分
2010/08/01 Javascript
返回上一页并自动刷新的JavaScript代码
2014/02/19 Javascript
javascript搜索框点击文字消失失焦时文本出现
2014/09/18 Javascript
Zero Clipboard实现浏览器复制到剪贴板的方法(多个复制按钮)
2016/03/24 Javascript
AngularJS控制器之间的通信方式详解
2016/11/03 Javascript
AngularJS实现表格的增删改查(仅限前端)
2017/07/04 Javascript
详解node+express+ejs+bootstrap构建项目
2017/09/27 Javascript
JS高阶函数原理与用法实例分析
2019/01/15 Javascript
vue通信方式EventBus的实现代码详解
2019/06/10 Javascript
Vue数据驱动表单渲染,轻松搞定form表单
2019/07/19 Javascript
js实现无限瀑布流实例方法
2019/09/16 Javascript
vue实现浏览器全屏展示功能
2019/11/27 Javascript
Angular处理未可知异常错误的方法详解
2021/01/17 Javascript
python list中append()与extend()用法分享
2013/03/24 Python
python使用socket远程连接错误处理方法
2015/04/29 Python
Python图像灰度变换及图像数组操作
2016/01/27 Python
Python实现的多线程同步与互斥锁功能示例
2017/11/30 Python
Python中pow()和math.pow()函数用法示例
2018/02/11 Python
pandas带有重复索引操作方法
2018/06/08 Python
python 字符串常用方法汇总详解
2019/09/16 Python
Kipling意大利官网:世界著名的时尚休闲包袋品牌
2019/06/05 全球购物
Python中pass语句的作用是什么
2016/06/01 面试题
名企HR怎样看待求职信
2014/02/23 职场文书
《少年王冕》教学反思
2014/04/11 职场文书
市场营销策划方案
2014/06/11 职场文书
副总经理岗位职责范本
2014/09/30 职场文书
杨善洲观后感
2015/06/04 职场文书
2015年清剿火患专项行动工作总结
2015/07/27 职场文书
师德师风培训感言
2015/08/03 职场文书
电力培训学习心得体会
2016/01/11 职场文书