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 相关文章推荐
手机平板等移动端适配跳转URL的js代码
Jan 25 Javascript
使用JavaScript的ActiveXObject对象检测应用程序是否安装的方法
Apr 15 Javascript
jquery实现的鼠标拖动排序Li或Table
May 04 Javascript
javascript中键盘事件用法实例分析
Jan 30 Javascript
bootstrap为水平排列的表单和内联表单设置可选的图标
Feb 15 Javascript
原生js实现选项卡功能
Mar 08 Javascript
Node.js开发第三方微信公众平台
Jun 05 Javascript
浅谈Vue.js 1.x 和 2.x 实例的生命周期
Jul 25 Javascript
webpack使用 babel-loader 转换 ES6代码示例
Aug 21 Javascript
vue2.0在table中实现全选和反选的示例代码
Nov 04 Javascript
Vue父子组件双向绑定传值的实现方法
Jul 31 Javascript
JavaScript Dom实现轮播图原理和实例
Feb 19 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
PHP5与MySQL数据库操作常用代码 收集
2010/03/21 PHP
比较简单的百度网盘文件直链PHP代码
2013/03/24 PHP
php断点续传之文件分割合并详解
2016/12/13 PHP
php实现解析xml并生成sql语句的方法
2018/02/03 PHP
PHP性能测试工具xhprof安装与使用方法详解
2018/04/29 PHP
在php的yii2框架中整合hbase库的方法
2018/09/20 PHP
js中数组Array的一些常用方法总结
2013/08/12 Javascript
JavaScript截取字符串的Slice、Substring、Substr函数详解和比较
2014/03/20 Javascript
ActiveX控件与Javascript之间的交互示例
2014/06/04 Javascript
Iframe实现跨浏览器自适应高度解决方法
2014/09/02 Javascript
javascript常用方法汇总
2014/12/02 Javascript
在JavaScript中处理数组之reverse()方法的使用
2015/06/09 Javascript
JavaScript获取两个数组交集的方法
2015/06/09 Javascript
javascript图片切换综合实例(循环切换、顺序切换)
2016/01/13 Javascript
Vue.Draggable实现拖拽效果
2020/07/29 Javascript
浅谈NodeJs之数据库异常处理
2017/10/25 NodeJs
详解微信小程序input标签正则初体验
2018/08/18 Javascript
Python多重继承的方法解析执行顺序实例分析
2018/05/26 Python
python3读取csv和xlsx文件的实例
2018/06/22 Python
python 地图经纬度转换、纠偏的实例代码
2018/08/06 Python
在cmder下安装ipython以及环境的搭建
2018/10/19 Python
详解使用django-mama-cas快速搭建CAS服务的实现
2019/10/30 Python
python多进程重复加载的解决方式
2019/12/13 Python
flask框架蓝图和子域名配置详解
2020/01/25 Python
巴西男士胡须和头发护理产品商店:Beard
2017/11/13 全球购物
Final类有什么特点
2012/04/25 面试题
综合实践活动方案
2014/02/14 职场文书
2014年社区学雷锋活动总结
2014/03/09 职场文书
环保志愿者活动总结
2014/06/27 职场文书
平遥古城导游词
2015/02/03 职场文书
服务员岗位职责
2015/02/03 职场文书
五一劳动节活动总结
2015/02/09 职场文书
导游词300字
2015/02/13 职场文书
2015年安全工作总结范文
2015/04/02 职场文书
SpringBoot生成License的实现示例
2021/06/16 Java/Android
解决Windows Server2012 R2 无法安装 .NET Framework 3.5
2022/04/29 Servers