一篇文章让你彻底弄懂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 相关文章推荐
用js实现计算加载页面所用的时间
Apr 02 Javascript
24款非常有用的 jQuery 插件分享
Apr 06 Javascript
使用jQuery实现的网页版的个人简历(可换肤)
Apr 19 Javascript
理解Javascript的call、apply
Dec 16 Javascript
简述jQuery ajax的执行顺序
Jan 05 Javascript
基于javascript实现动态显示当前系统时间
Jan 28 Javascript
基于MVC方式实现三级联动(JavaScript)
Jan 23 Javascript
vue.js 获取当前自定义属性值
Jun 01 Javascript
基于angular-utils-ui-breadcrumbs使用心得(分享)
Nov 03 Javascript
JavaScript Canvas实现验证码
Aug 02 Javascript
基于Vue 服务端Cookies删除的问题
Sep 21 Javascript
解决微信小程序防止无法回到主页的问题
Sep 28 Javascript
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
?繁体转换的class
2006/10/09 PHP
PHP 获取文件路径(灵活应用__FILE__)
2013/02/15 PHP
ThinkPHP框架设计及扩展详解
2014/11/25 PHP
微信支付PHP SDK之微信公众号支付代码详解
2015/12/09 PHP
使用Laravel中的查询构造器实现增删改查功能
2019/09/03 PHP
js一组验证函数
2008/12/20 Javascript
Prototype Hash对象 学习
2009/07/19 Javascript
浅析JavaScript中浏览器的兼容问题
2016/04/19 Javascript
JavaScript中setter和getter方法介绍
2016/07/11 Javascript
浅谈Webpack多页应用HMR卡住问题
2019/04/24 Javascript
JavaScript中的垃圾回收与内存泄漏示例详解
2019/05/02 Javascript
Vue2.x通用编辑组件的封装及应用详解
2019/05/28 Javascript
15 分钟掌握vue-next响应式原理
2019/10/13 Javascript
Node.js API详解之 assert模块用法实例分析
2020/05/26 Javascript
微信小程序实现电子签名功能
2020/07/29 Javascript
举例讲解Python中的Null模式与桥接模式编程
2016/02/02 Python
Python利用字典将两个通讯录文本合并为一个文本实例
2018/01/16 Python
解决sublime+python3无法输出中文的问题
2018/12/12 Python
python 根据时间来生成唯一的字符串方法
2019/01/14 Python
python实现微信机器人: 登录微信、消息接收、自动回复功能
2019/04/29 Python
python识别图像并提取文字的实现方法
2019/06/28 Python
如何使用python进行pdf文件分割
2019/11/11 Python
如何使用python的ctypes调用医保中心的dll动态库下载医保中心的账单
2020/05/24 Python
容易被忽略的Python内置类型
2020/09/03 Python
python eventlet绿化和patch原理
2020/11/21 Python
CSS3——齿轮转动关键代码
2013/05/02 HTML / CSS
苹果中国官方网站:Apple中国
2016/07/22 全球购物
诺心蛋糕官网:LE CAKE
2018/08/25 全球购物
体育老师的教学自我评价分享
2013/11/19 职场文书
会计系个人求职信范文分享
2013/12/20 职场文书
感恩老师演讲稿600字
2014/08/28 职场文书
学生不讲诚信检讨书
2014/09/29 职场文书
保研导师推荐信
2015/03/25 职场文书
2016党校学习心得体会
2016/01/07 职场文书
《水上飞机》教学反思
2016/02/20 职场文书
Redis实战高并发之扣减库存项目
2022/04/14 Redis