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脚本实现Web页面信息交互
Dec 21 Javascript
Javascript select控件操作大全(新增、修改、删除、选中、清空、判断存在等)
Dec 19 Javascript
JS去除字符串的空格增强版(可以去除中间的空格)
Aug 26 Javascript
javascript document.compatMode兼容性
Feb 23 Javascript
vue时间格式化实例代码
Jun 13 Javascript
jQuery制作input提示内容(兼容IE8以上)
Jul 05 jQuery
微信小程序之发送短信倒计时功能
Aug 30 Javascript
JavaScript中变量提升与函数提升经典实例分析
Jul 26 Javascript
JavaScript基础之this和箭头函数详析
Sep 05 Javascript
JS实现简单日历特效
Jan 03 Javascript
JS实现音乐钢琴特效
Jan 06 Javascript
JavaScript实现PC端四格密码输入框功能
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
人大复印资料处理程序_输入篇
2006/10/09 PHP
php5.2.0内存管理改进
2007/01/22 PHP
自制PHP框架之路由与控制器
2017/05/07 PHP
phpStudy配置多站点多域名和多端口的方法
2017/09/01 PHP
javascript读取RSS数据
2007/01/20 Javascript
setTimeout与setInterval在不同浏览器下的差异
2010/01/24 Javascript
JQuery+JS实现仿百度搜索结果中关键字变色效果
2011/08/02 Javascript
js自定义方法通过隐藏iframe实现文件下载
2013/02/21 Javascript
js异常捕获方法介绍
2013/04/10 Javascript
jQuery使用ajaxSubmit()提交表单示例
2014/04/04 Javascript
jquery模拟LCD 时钟的html文件源代码
2014/06/16 Javascript
jQuery中click事件的定义和用法
2014/12/20 Javascript
js中取得变量绝对值的方法
2015/01/03 Javascript
AngularJS中$watch和$timeout的使用示例
2016/09/20 Javascript
jquery插件treegrid树状表格的使用方法详解(.Net平台)
2017/01/03 Javascript
Mui使用jquery并且使用点击跳转新窗口的实例
2017/08/19 jQuery
React Router v4 入坑指南(小结)
2018/04/08 Javascript
详解webpack 打包文件体积过大解决方案(code splitting)
2018/04/10 Javascript
更强大的vue ssr实现预取数据的方式
2019/07/19 Javascript
vue-socket.io接收不到数据问题的解决方法
2020/05/13 Javascript
Python中用post、get方式提交数据的方法示例
2017/09/22 Python
Python编程实现粒子群算法(PSO)详解
2017/11/13 Python
python打造爬虫代理池过程解析
2019/08/15 Python
通过python扫描二维码/条形码并打印数据
2019/11/14 Python
Python实现计算图像RGB均值方式
2020/06/04 Python
python3跳出一个循环的实例操作
2020/08/18 Python
关于多种方式完美解决Python pip命令下载第三方库的问题
2020/12/21 Python
澳大利亚潮流尖端的快时尚品牌:Cotton On
2016/09/26 全球购物
服务质量承诺书
2014/03/27 职场文书
个人授权委托书范文
2014/09/21 职场文书
2014年妇产科工作总结
2014/12/08 职场文书
涨价通知怎么写
2015/04/23 职场文书
2016年4月份红领巾广播稿
2015/12/21 职场文书
高中政治教师教学反思
2016/02/23 职场文书
创业计划书之物流运送
2019/09/17 职场文书
python的netCDF4批量处理NC格式文件的操作方法
2022/03/21 Python