JavaScript捕捉事件和阻止冒泡事件实例分析


Posted in Javascript onAugust 03, 2018

本文实例讲述了JavaScript捕捉事件和阻止冒泡事件。分享给大家供大家参考,具体如下:

今日,项目程序出现异常,后发现跟冒泡事件有关,利用此机会探索一下利用Javascript捕获和冒泡事件。

一、要探究捕获和冒泡事件,首先要知道什么是事件的捕获和冒泡,所以呢,先从概念入手;

事件的冒泡:在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序或者事件返回true,那么这个事件会向这个对象的父级对象传播,从里到外,直至它被处理(父级对象所有同类事件都将被激活),或者它到达了对象层次的最顶层,即document对象(有些浏览器是window)。

其实事件冒泡是一个从后代节点向祖先节点冒泡的过程,而捕获是从祖先节点到后节点的过程。

我为了方便理解,则用先捕获,后冒泡,捕获从上到下,冒泡从下到上来记忆。我记得从哪儿看到的,有人把捕获比喻为石头沉入海底,而把冒泡比喻为气泡冒出水面。当然了,捕获的深度取决于你的DOM布局,海底就有点深了哈,^_^

注意:IE6、IE7、IE8只支持冒泡流,不支持捕获流。

二、为什么要阻止冒泡事件

也许会有人问:为什么要阻止冒泡事件呢?阻止冒泡事件有什么用处呢?

下面我们就来说下为什么要阻止冒泡事件:

先举个例子吧,如下代码:

<html>
  <div id='div_1' onclick="alert('I'm First!')">
     <div id='div_2' onclick="alert('I'm Second!')">
         <a id="alink" onclick="alert('I'm Third!')" href="http://www.baidu.com" rel="external nofollow" >Click Here</a>
     </div>
  </div>
</html>

从上面的代码可以看出,div_1是div_2的容器,而div_2是a的容器,总共三层。

我们运行这个实例,点击Click Here会发现,分别弹出了三个alert提示框,而且顺序为I'm Third!I'm Second!I'm First!,这就符合我们上面提到的冒泡的概念了。

而我这次碰到的问题就是这样,我称之为“事件重叠”。

出现这种情况,肯定不行,所以我们要阻止该事件冒泡的发生,那如何来阻止呢?下面将。

三、阻止事件冒泡的方法

首先我先给出一个纯JavaScript版的写法:

function aOnClick(e){
   window.event? window.event.cancelBubble = true : e.stopPropagation();
}

解释:因为IE里的阻止冒泡的写法为window.event.cancelBubble = true,其他浏览器为e.stopPropagation();所以这里做了兼容。

再给出一个jQuery版本的写法:

$(function() {
  $("#alink").click(function(event) {
    event.stopPropagation();
  });
});

四、阻止冒泡的其他方法及不同

我就是用上面的函数阻止了冒泡,但是还有其他的方法可以达到类似的效果,但还是有所不同;

$("#alink").click(function(event) {
  return false;
});

解释:上面方法使用jQuery对alink进行了操作,经过测试,得出结论,该函数阻止了冒泡,但是它将a的默认行为也屏蔽掉了(此处为href属性)。这就是不同之处。

顺便说下,javasccript的阻止默认行为的方法

event.preventDefault();

从上面可以看出,return false;event.stopPropagation();PreventDefault()的并集。

就到这里吧!

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
如何使用jquery控制CSS样式,并且取消Css样式(如背景色,有实例)
Jul 09 Javascript
web css实现整站样式互相切换
Oct 29 Javascript
JS如何将数字类型转化为没3个一个逗号的金钱格式
Jan 27 Javascript
Angularjs编写KindEditor,UEidtor,jQuery指令
Jan 28 Javascript
Javascript必知必会(四)js类型转换
Jun 08 Javascript
js手动播放图片实现图片轮播效果
Sep 17 Javascript
bootstrap弹出层的多种触发方式
May 10 Javascript
5分钟打造简易高效的webpack常用配置
Jul 04 Javascript
使用javascript做在线算法编程
May 25 Javascript
vue forEach循环数组拿到自己想要的数据方法
Sep 21 Javascript
Vue2.5学习笔记之如何在项目中使用和配置Vue
Sep 26 Javascript
微信小程序顶部导航栏可滑动并选中放大
Dec 05 Javascript
关于js对textarea换行符的处理方法浅析
Aug 03 #Javascript
webpack4 + react 搭建多页面应用示例
Aug 03 #Javascript
使用JS代码实现俄罗斯方块游戏
Aug 03 #Javascript
小程序tab页无法传递参数的方法
Aug 03 #Javascript
详解Webpack多环境代码打包的方法
Aug 03 #Javascript
浅析vue-router jquery和params传参(接收参数)$router $route的区别
Aug 03 #jQuery
浅析Vue 和微信小程序的区别、比较
Aug 03 #Javascript
You might like
浅谈php中include文件变量作用域
2015/06/18 PHP
php多重接口的实现方法
2015/06/20 PHP
JavaScript DOM学习第八章 表单错误提示
2010/02/19 Javascript
jquery的index方法实现tab效果
2011/02/16 Javascript
解决用jquery load加载页面到div时,不执行页面js的问题
2014/02/22 Javascript
jQuery学习笔记之 Ajax操作篇(一) - 数据加载
2014/06/23 Javascript
jQuery实现精美的多级下拉菜单特效
2015/03/14 Javascript
javascript实现表单验证
2016/01/29 Javascript
Javascript的this用法
2017/01/16 Javascript
vue + any-touch实现一个iscroll 实现拖拽和滑动动画效果
2019/04/08 Javascript
angular 服务随记小结
2019/05/06 Javascript
[41:41]TFT vs Secret Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
Python开发编码规范
2006/09/08 Python
python发送HTTP请求的方法小结
2015/07/08 Python
python+matplotlib绘制简单的海豚(顶点和节点的操作)
2018/01/02 Python
python pandas dataframe 行列选择,切片操作方法
2018/04/10 Python
numpy中的ndarray方法和属性详解
2019/05/27 Python
解决Python内层for循环如何break出外层的循环的问题
2019/06/24 Python
python实现图片横向和纵向拼接
2020/03/05 Python
keras实现调用自己训练的模型,并去掉全连接层
2020/06/09 Python
详解Pycharm安装及Django安装配置指南
2020/09/15 Python
巴西网上药房:onofre
2016/11/21 全球购物
Jabra捷波朗美国官网:用于办公、车载和运动的无线蓝牙耳麦
2017/02/01 全球购物
好药师网上药店:安全合法的网上药品零售药房
2017/02/15 全球购物
类和结构的区别
2012/08/15 面试题
sort命令的作用和用法
2012/11/04 面试题
入党积极分子思想汇报范文
2014/01/05 职场文书
电子信息科学专业自荐信
2014/01/30 职场文书
总会计师岗位职责
2014/02/19 职场文书
《母鸡》教学反思
2014/02/25 职场文书
就业推荐表自我鉴定范文
2014/03/21 职场文书
植树节标语
2014/06/27 职场文书
个人学习群众路线心得体会
2014/11/05 职场文书
置业顾问岗位职责
2015/02/09 职场文书
高一地理教学工作总结
2015/08/12 职场文书
MySQL 数据丢失排查案例
2021/05/08 MySQL