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 关键字“拖曳搜索”之“拖曳”以及 图片“提示自适应放大”效果 的实现
Apr 18 Javascript
TBCompressor js代码压缩
Jan 05 Javascript
关于图片的预加载过程中隐藏未知的
Dec 19 Javascript
js使用正则实现ReplaceAll全部替换的方法
Jul 18 Javascript
关闭页面window.location事件未执行的原因及解决方法
Sep 01 Javascript
jQuery中width()方法用法实例
Dec 24 Javascript
jquery调整表格行tr上下顺序实例讲解
Jan 09 Javascript
JavaScript必知必会(七)js对象继承
Jun 08 Javascript
浅谈移动端之js touch事件 手势滑动事件
Nov 07 Javascript
Node.js复制文件的方法示例
Dec 29 Javascript
详解jQuery同步Ajax带来的UI线程阻塞问题及解决办法
Aug 09 jQuery
JavaScript实现简单的音乐播放器
Aug 14 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
德生S2000电路分析
2021/03/02 无线电
自定义PHP分页函数
2006/10/09 PHP
一些常用的php函数
2006/12/06 PHP
PHP 截取字符串 分别适合GB2312和UTF8编码情况
2009/02/12 PHP
php 中英文语言转换类
2011/09/07 PHP
解析php curl_setopt 函数的相关应用及介绍
2013/06/17 PHP
Laravel 5 框架入门(二)构建 Pages 的管理功能
2015/04/09 PHP
PHP+MySQL统计该库中每个表的记录数并按递减顺序排列的方法
2016/02/15 PHP
javascript动画对象支持加速、减速、缓入、缓出的实现代码
2012/09/30 Javascript
FF IE浏览器修改标签透明度的方法
2014/01/27 Javascript
js加载读取内容及显示与隐藏div示例
2014/02/13 Javascript
jquery插件之文字间歇自动向上滚动效果代码
2016/02/25 Javascript
js实现简单的网页换肤效果
2017/01/18 Javascript
vue.js与element-ui实现菜单树形结构的解决方法
2018/04/21 Javascript
layui写后台表格思路和赋值用法详解
2019/11/14 Javascript
ES6实现图片切换特效代码
2020/01/14 Javascript
用VsCode编辑TypeScript的实现方法
2020/05/07 Javascript
[42:06]2019国际邀请赛全明星赛 8.23
2019/09/05 DOTA
TensorFlow模型保存/载入的两种方法
2018/03/08 Python
详解python pandas 分组统计的方法
2019/07/30 Python
通过实例学习Python Excel操作
2020/01/06 Python
使用python 的matplotlib 画轨道实例
2020/01/19 Python
基于Python正确读取资源文件
2020/09/14 Python
递归实现回文判断(如:abcdedbca就是回文,判断一个面试者对递归理解的简单程序)
2013/04/28 面试题
四年的大学生生活自我评价
2013/12/09 职场文书
创意活动策划书
2014/01/15 职场文书
党的群众路线教育实践活动公开承诺书
2014/03/28 职场文书
专升本学生毕业自我鉴定
2014/10/04 职场文书
材料员岗位职责范本
2015/04/11 职场文书
2015年教师国培感言
2015/08/01 职场文书
2016年“5.12”护士节慰问信
2015/11/30 职场文书
英文诗歌翻译方法(赏析)
2019/08/16 职场文书
导游词之无锡华莱坞
2019/12/02 职场文书
html form表单基础入门案例讲解
2021/07/21 HTML / CSS
python实现Nao机器人的单目测距
2021/09/04 Python
HTML 里 img 元素的 src 和 srcset 属性的区别详解
2023/05/21 HTML / CSS