事件冒泡是什么如何用jquery阻止事件冒泡


Posted in Javascript onMarch 20, 2013

(1)什么是事件起泡
首先你要明白一点,当一个事件发生的时候,该事件总是有一个事件源,即引发这个事件的对象,一个事件不能凭空产生,这就是事件的发生。

当事件发生后,这个事件就要开始传播。为什么要传播呢?因为事件源本身并没有处理事件的能力。例如我们点击一个按钮时,就会产生一个click事件,但这个按钮本身不能处理这个事件(废话),事件必须从这个按钮传播出去,从而到达能够处理这个事件的代码中(例如我们给按钮的onclick属性赋一个函数的名字,就是让这个函数去处理该按钮的click事件)。

当事件在传播过程中,找到了一个能够处理它的函数,这时候我们就说这个函数捕捉到了这个事件。

说到这里,关键的问题来了,那就是一个函数是如何捕捉一个事件的呢?这就涉及到事件的冒泡了。

为了更好地理解冒泡的概念,我建议你现在想象一下你的面前放着一杯水,但这杯水和我们平时看到的有点点不同,它分为数层,每一层又分成一或多个区域,最顶层是我们熟悉的窗口对象(即window对象),下一层分为好几个区域(document对象、history对象等等),而document对象的下一层又分为多个子对象。

这些对象的层次关系构成了DOM中的对象树。
事件的传播是有方向的,当点击一个按钮时所产生的事件从这个按钮处开始向上传播(就像一个水泡从杯底冒上来,这就是之所以叫事件冒泡的原因),但这个事件总是寻找特定的属性是否有值。例如按钮的click事件先寻找在按钮上是否有onclick属性的有意义的定义(即该属性指向一个存在的函数或一段可执行的语句),如果有,执行这个函数或语句;然后事件继续向上传播,到达按钮的上一层对象(例如一个form对象或document对象,总之是包含了按钮的父对象),如果该对象也定义了onclick属性,则执行属性的值。

所以,如果这个按钮上面有3层(form、document、window),且这三层都定义了onclick属性,则当按钮的click事件产生时,将会调用4个(包括按钮本身的一个)函数或执行4段语句。
事件的这几个特性在0级dom中也是适用的。

(2)jquery阻止事件起泡实例
1、通过返回false来取消默认的行为并阻止事件起泡。
jQuery 代码:

$("form").bind( 
"submit", 

function() { 


return false; 

 } 
);

2、通过使用 preventDefault() 方法只取消默认的行为。
jQuery 代码:
$("form").bind( 
"submit", 

function(event){ 


event.preventDefault(); 

} 
);

3、通过使用 stopPropagation() 方法只阻止一个事件起泡。
jQuery 代码:
$("form").bind( 
"submit", 

function(event){ 


event.stopPropagation(); 

} 
);

(3)关于js事件起泡的验证
今天这个问题主要涉及到几个关键词:对象,触发事件,捕获事件,执行处理、起泡。这其实就是整个js执行的过程。其中冒泡这个过程很有意思。其实就像是一杯水,但是这杯水是分层次的,最底下是当前触发事件的对象。然后越往上范围越大,最顶层肯定是window,倒数第二层是document。气泡在上浮过程中会判断当前所到达的层有没有绑定事件处理方法。有话就执行相应的处理。没有的话就继续起泡。直到到达最顶层的window窗口层。我们可以在任何一层做相应的处理以阻止事件继续起泡。方法就是调用事件对象的阻止起泡的方法。event.stopPropagation();下面是写的一个验证js事件起泡的过程方法。
<script type="text/javascript"> 
$(document).ready(function(){ 
$('.one').click(function(e){ 
alert('one'); 
});




 
$('.two').click(function(e){   
alert('two'); 
}); 
$('.three').click(function(e){ 
alert('three'); 
//阻止起泡取消下面的注释 
// e.stopPropagation(); 
}); 
}); 
</script> 
<div class="one" style="width:200px;height:200px;background:green;"> 
one 
<div class="two" style="width:150px;height:150px;background:yellow;"> 
two 
<div class="three"> 
three 
</div> 
</div> 
</div>

(4)总结
1.一个事件起泡对应触发的是上层的同一事件

特殊:如果two设置成双击事件,那么在你单击two的时候就会起泡触发one单击的事件

(双击包含单击)。
2.如果在click事件中,在你要处理的事件之前加上e.preventDefault();
 那么就取消了行为(通俗理解:相当于做了个return操作),不执行之后的语句了。
3.e.stopPropagation()只要在click事件中,就不会触发上层click事件。

Javascript 相关文章推荐
JSON扫盲帖 JSON.as类教程
Feb 16 Javascript
jquery1.4后 jqDrag 拖动 不可用
Feb 06 Javascript
让你的博文自动带上缩址的实现代码,方便发到微博客上
Dec 28 Javascript
精通Javascript系列之数值计算
Jun 07 Javascript
使用jquery组件qrcode生成二维码及应用指南
Feb 22 Javascript
JS获取一个未知DIV高度的方法
Aug 09 Javascript
JavaScript基于DOM操作实现简单的数学运算功能示例
Jan 16 Javascript
Vuejs 组件——props数据传递的实例代码
Mar 07 Javascript
JS自定义函数实现时间戳转换成date的方法示例
Aug 27 Javascript
基于Web Audio API实现音频可视化效果
Jun 12 Javascript
小程序实现tab标签页
Nov 16 Javascript
vue/cli 配置动态代理无需重启服务的方法
May 20 Vue.js
jQuery对象和Javascript对象之间转换的实例代码
Mar 20 #Javascript
jquery的ajax请求全面了解
Mar 20 #Javascript
js控制滚动条缓慢滚动到顶部实现代码
Mar 20 #Javascript
JSON+JavaScript处理JSON的简单例子
Mar 20 #Javascript
js或者jquery判断图片是否加载完成实现代码
Mar 20 #Javascript
javascript 三种方法实现获得和设置以及移除元素属性
Mar 20 #Javascript
asp.net中System.Timers.Timer的使用方法
Mar 20 #Javascript
You might like
thinkPHP框架乐观锁和悲观锁实例分析
2019/10/30 PHP
各情景下元素宽高的获取实现代码
2011/09/13 Javascript
js跨浏览器实现将字符串转化为xml对象的方法
2013/09/25 Javascript
javascript检查浏览器是否已经启用XX功能
2015/07/10 Javascript
jquery实现可自动收缩的TAB网页选项卡代码
2015/09/06 Javascript
js控制TR的显示隐藏
2016/03/04 Javascript
AngularJS教程之环境设置
2016/08/16 Javascript
Nodejs中使用phantom将html转为pdf或图片格式的方法
2017/09/18 NodeJs
原生JS实现的多个彩色小球跟随鼠标移动动画效果示例
2018/02/01 Javascript
vue自定义tap指令及tap事件的实现
2018/09/18 Javascript
CryptoJS中AES实现前后端通用加解密技术
2018/12/18 Javascript
详解element-ui中form验证杂记
2019/03/04 Javascript
JavaScript实现无限轮播效果
2020/11/19 Javascript
全面解析Vue中的$nextTick
2020/12/24 Vue.js
[02:37]TI8勇士令状不朽珍藏II视频展示
2018/06/23 DOTA
使用python爬取B站千万级数据
2018/06/08 Python
将python图片转为二进制文本的实例
2019/01/24 Python
Python自定义函数计算给定日期是该年第几天的方法示例
2019/05/30 Python
python binascii 进制转换实例
2019/06/12 Python
对Django的restful用法详解(自带的增删改查)
2019/08/28 Python
python图形开发GUI库pyqt5的详细使用方法及各控件的属性与方法
2020/02/14 Python
Python中pyecharts安装及安装失败的解决方法
2020/02/18 Python
python list等分并从等分的子集中随机选取一个数
2020/11/16 Python
澳大利亚百货商店中销量第一的商务衬衫品牌:Van Heusen
2018/07/26 全球购物
js正则匹配markdown里的图片标签的实现
2021/03/24 Javascript
高中毕业生个人自我鉴定
2013/11/24 职场文书
经济管理专业自荐信
2013/12/30 职场文书
求职信范文英文版
2014/01/05 职场文书
八年级语文教学反思
2014/02/11 职场文书
《小石潭记》教学反思
2014/02/13 职场文书
入学申请自荐信范文
2014/02/26 职场文书
工作会议主持词
2014/03/17 职场文书
文员试用期转正自我鉴定
2014/09/14 职场文书
2015年仓管员工作总结
2015/04/21 职场文书
各类场合主持词开场白范文集锦
2019/08/16 职场文书
HTML+css盒子模型案例(圆,半圆等)“border-radius” 简单易上手
2021/05/10 HTML / CSS