一篇文章让你彻底弄懂JS的事件冒泡和事件捕获


Posted in Javascript onAugust 14, 2017

在学校,听老师讲解事件冒泡和事件捕获机制的时候跟听天书一样,只依稀记得IE使用的是事件冒泡,其他浏览器则是事件捕获。当时的我,把它当成IE浏览器兼容问题,所以没有深究(IE8以下版本的浏览器已基本退出市场)。工作至今,虽然多次遇到该类问题,但均未深究,始终一知半解,遇到了全TM靠猜(选A不行就选B呗)。今天闲来无事自己做了个demo,算是把这个问题彻底搞明白了。

先上结论:他们是描述事件触发时序问题的术语。事件捕获指的是从document到触发事件的那个节点,即自上而下的去触发事件。相反的,事件冒泡是自下而上的去触发事件。绑定事件方法的第三个参数,就是控制事件触发顺序是否为事件捕获。true,事件捕获;false,事件冒泡。默认false,即事件冒泡。Jquery的e.stopPropagation会阻止冒泡,意思就是到我为止,我的爹和祖宗的事件就不要触发了。

这是HTML结构

<div id="parent">
  <div id="child" class="child"></div>
  </div>

现在我们给它们绑定上事件

document.getElementById("parent").addEventListener("click",function(e){
  alert("parent事件被触发,"+this.id);
  })
  document.getElementById("child").addEventListener("click",function(e){
  alert("child事件被触发,"+this.id)
  })

结果:

child事件被触发,child
parent事件被触发,parent

结论:先child,然后parent。事件的触发顺序自内向外,这就是事件冒泡。

现在改变第三个参数的值为true

document.getElementById("parent").addEventListener("click",function(e){
  alert("parent事件被触发,"+e.target.id);
  },true)
  document.getElementById("child").addEventListener("click",function(e){
  alert("child事件被触发,"+e.target.id)
  },true)

结果:

parent事件被触发,parent
child事件被触发,child

结论:先parent,然后child。事件触发顺序变更为自外向内,这就是事件捕获。

貌似没什么卵用,上一个利用事件冒泡的案例,反正我是经常会用到。

<ul>
  <li>item1</li>
  <li>item2</li>
  <li>item3</li>
  <li>item4</li>
  <li>item5</li>
  <li>item6</li>
 </ul>

需求是这样的:鼠标放到li上对应的li背景变灰。

利用事件冒泡实现:

$("ul").on("mouseover",function(e){
   $(e.target).css("background-color","#ddd").siblings().css("background-color","white");
  })

也许有人会说,我们直接给所有li都绑上事件也可以啊,一点也不麻烦,只要……

 $("li").on("mouseover",function(){
   $(this).css("background-color","#ddd").siblings().css("background-color","white");
  })

是,这样也行。而且从代码简洁程度上,两者是相若仿佛的。但是,前者少了一个遍历所有li节点的操作,所以在性能上肯定是更优的。
还有就是,如果我们在绑定事件完成后,页面又动态的加载了一些元素……

$("<li>item7</li>").appendTo("ul");
这时候,第二种方案,由于绑定事件的时候item7还不存在,所以为了效果,我们还要给它再绑定一次事件。而利用冒泡方案由于是给ul绑的事件……
高下立判!

以上就是小编为大家整理的js事件冒泡事件捕获的详细介绍的内容啦。希望大家继续支持三水点靠木~

Javascript 相关文章推荐
利用div+jquery自定义滚动条样式的2种方法
Jul 18 Javascript
简单的两种Extjs formpanel加载数据的方式
Nov 09 Javascript
jquery实现右侧栏菜单选择操作
Mar 04 Javascript
JavaScript实现简单Tip提示框效果
Apr 20 Javascript
Jquery表单验证失败后不提交的解决方法
Oct 18 Javascript
用AngularJS来实现监察表单按钮的禁用效果
Nov 02 Javascript
jQuery插件FusionCharts实现的2D柱状图效果示例【附demo源码下载】
Mar 06 Javascript
vue 动态绑定背景图片的方法
Aug 10 Javascript
实例详解vue.js浅度监听和深度监听及watch用法
Aug 16 Javascript
微信小程序图片左右摆动效果详解
Jul 13 Javascript
微信小程序后台持续定位功能使用详解
Aug 23 Javascript
梳理一下vue中的生命周期
Dec 30 Vue.js
Vue.js如何实现路由懒加载浅析
Aug 14 #Javascript
JavaScript中的return布尔值的用法和原理解析
Aug 14 #Javascript
一个Js文件函数中调用另一个Js文件函数的方法演示
Aug 14 #Javascript
利用纯JS实现像素逐渐显示的方法示例
Aug 14 #Javascript
jQuery 实时保存页面动态添加的数据的示例
Aug 14 #jQuery
js异步编程小技巧详解
Aug 14 #Javascript
js数字滑动时钟的简单实现(示例讲解)
Aug 14 #Javascript
You might like
PHP的FTP学习(一)[转自奥索]
2006/10/09 PHP
实战mysql导出中文乱码及phpmyadmin导入中文乱码的解决方法
2010/06/11 PHP
php json_encode值中大括号与花括号区别
2013/09/30 PHP
详解PHP的Yii框架中的Controller控制器
2016/03/29 PHP
PHP手机号中间四位用星号*代替显示的实例
2017/06/02 PHP
用JS控制回车事件的代码
2011/02/20 Javascript
基于jQuery的合并表格中相同文本的相邻单元格的代码
2011/04/06 Javascript
document.compatMode的CSS1compat使用介绍
2014/04/03 Javascript
JS实现倒计时和文字滚动的效果实例
2014/10/29 Javascript
javascript框架设计读书笔记之数组的扩展与修复
2014/12/02 Javascript
node.js回调函数之阻塞调用与非阻塞调用
2015/11/13 Javascript
常常会用到的截取字符串substr()、substring()、slice()方法详解
2015/12/16 Javascript
利用浮层使select不可选的实现方法
2016/12/03 Javascript
基于Datatables跳转到指定页的简单实例
2017/11/09 Javascript
微信小程序使用audio组件播放音乐功能示例【附源码下载】
2017/12/08 Javascript
浅谈node模块与npm包管理工具
2018/01/03 Javascript
js中事件对象和事件委托的介绍
2019/01/21 Javascript
[00:32]2018DOTA2亚洲邀请赛Mineski出场
2018/04/04 DOTA
python实现随机密码字典生成器示例
2014/04/09 Python
分析在Python中何种情况下需要使用断言
2015/04/01 Python
Tensorflow实现卷积神经网络用于人脸关键点识别
2018/03/05 Python
opencv python 傅里叶变换的使用
2018/07/21 Python
Python with语句和过程抽取思想
2019/12/23 Python
PyCharm设置Ipython交互环境和宏快捷键进行数据分析图文详解
2020/04/23 Python
Python3如何使用多线程升程序运行速度
2020/08/11 Python
纯CSS3实现带动画效果导航菜单无需js
2013/09/27 HTML / CSS
造型师求职自荐信
2013/09/27 职场文书
会计专业毕业生自我鉴定
2013/10/29 职场文书
设计师个人求职信范文
2014/02/02 职场文书
2015年世界卫生日活动总结
2015/02/09 职场文书
2015年教研组工作总结
2015/05/04 职场文书
中国古代史学名著《战国策》概述
2019/08/09 职场文书
创业计划书之都市休闲农庄
2019/12/28 职场文书
用javascript制作qq注册动态页面
2021/04/14 Javascript
Python中如何处理常见报错
2022/01/18 Python
Java使用HttpClient实现文件下载
2022/08/14 Java/Android