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 相关文章推荐
Extjs学习笔记之三 extjs form更多的表单项
Jan 07 Javascript
JavaScript中的集合及效率
Jan 08 Javascript
探讨JQUERY JSON的反序列化类 using问题的解决方法
Dec 19 Javascript
jquery列表拖动排列(由项目提取相当好用)
Jun 17 Javascript
JavaScript设计模式之外观模式实例
Oct 10 Javascript
JavaScript实现的经典文件树菜单效果
Sep 08 Javascript
JS+CSS实现的竖向简洁折叠菜单效果代码
Oct 22 Javascript
js计算文本框输入的字符数
Oct 23 Javascript
JS实现购物车特效
Feb 02 Javascript
JavaScript切换搜索引擎的导航网页搜索框实例代码
Jun 11 Javascript
一个基于react的图片裁剪组件示例
Apr 18 Javascript
javaScript代码飘红报错看不懂?读完这篇文章再试试
Aug 19 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
一个程序下载的管理程序(二)
2006/10/09 PHP
PHP中Date()时间日期函数的使用方法小结
2011/04/20 PHP
php二维数组排序详解
2013/11/06 PHP
JQuery 学习笔记 选择器之六
2009/07/23 Javascript
functional继承模式 摘自javascript:the good parts
2011/06/20 Javascript
弹出窗口并且此窗口带有半透明的遮罩层效果
2014/03/13 Javascript
javascript判断回文数详解及实现代码
2017/02/03 Javascript
JS基于正则表达式的替换操作(replace)用法示例
2017/04/28 Javascript
Vue SPA 初次进入加载动画实现代码
2019/11/14 Javascript
2019年度web前端面试题总结(主要为Vue面试题)
2020/01/12 Javascript
JS FormData对象使用方法实例详解
2020/02/12 Javascript
js实现双人五子棋小游戏
2020/05/28 Javascript
python连接mysql并提交mysql事务示例
2014/03/05 Python
教你用python3根据关键词爬取百度百科的内容
2016/08/18 Python
python制作websocket服务器实例分享
2016/11/20 Python
Python OpenCV实现图片上输出中文
2018/01/22 Python
python如何对实例属性进行类型检查
2018/03/20 Python
python3获取当前文件的上一级目录实例
2018/04/26 Python
pandas值替换方法
2018/07/10 Python
如何利用Python模拟GitHub登录详解
2019/07/15 Python
Django REST framwork的权限验证实例
2020/04/02 Python
calendar在python3时间中常用函数举例详解
2020/11/18 Python
用HTML5 Canvas API中的clearRect()方法实现橡皮擦功能
2016/03/15 HTML / CSS
html5拖拽应用记录及注意点
2020/05/27 HTML / CSS
GetYourGuide台湾:预订旅游活动、景点和旅游项目
2019/06/10 全球购物
java程序员面试交流
2012/11/29 面试题
维护民族团结演讲稿
2014/08/27 职场文书
大学生党员自我批评思想汇报
2014/10/10 职场文书
班主任经验交流心得体会
2015/11/02 职场文书
学校教代会开幕词
2016/03/04 职场文书
CSS实现多个元素在盒子内两端对齐效果
2021/03/30 HTML / CSS
Python list去重且保持原顺序不变的方法
2021/04/03 Python
Python Pandas pandas.read_sql函数实例用法
2021/06/21 Python
“鬼灭之刃”热度不减,其成功背后的原因是什么?
2022/03/22 日漫
IDEA 2022 Translation 未知错误 翻译文档失败
2022/04/24 Java/Android
HttpClient实现表单提交上传文件
2022/08/14 Java/Android