一篇文章让你彻底弄懂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 相关文章推荐
下载网站打开页面后间隔多少时间才显示下载链接地址的代码
Apr 25 Javascript
JavaScript基本编码模式小结
May 23 Javascript
jQuery+css实现的tab切换标签(兼容各浏览器)
Jan 28 Javascript
JS代码实现table数据分页效果
May 26 Javascript
浅析JavaScript函数的调用模式
Aug 10 Javascript
js正则表达式验证密码强度【推荐】
Mar 03 Javascript
整理关于Bootstrap排版的慕课笔记
Mar 29 Javascript
React Navigation 使用中遇到的问题小结
May 08 Javascript
VueJS 组件参数名命名与组件属性转化问题
Dec 03 Javascript
优化Vue项目编译文件大小的方法步骤
May 27 Javascript
vue 使用axios 数据请求第三方插件的使用教程详解
Jul 05 Javascript
Node.js系列之安装配置与基本使用(1)
Aug 30 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
Access数据库导入Mysql的方法之一
2006/10/09 PHP
一些PHP Coding Tips(php小技巧)[2011/04/02最后更新]
2011/05/02 PHP
PHP无刷新上传文件实现代码
2011/09/19 PHP
记录PHP错误日志 display_errors与log_errors的区别
2012/10/09 PHP
CI框架给视图添加动态数据
2014/12/01 PHP
使用Apache的rewrite
2021/03/09 Servers
JS脚本根据手机浏览器类型跳转WAP手机网站(两种方式)
2015/08/04 Javascript
利用React-router+Webpack快速构建react程序
2016/10/27 Javascript
JS异步文件上传(兼容IE8+)
2017/04/02 Javascript
js实现canvas图片与img图片的相互转换的示例
2017/08/31 Javascript
小程序图片长按识别功能的实现方法
2018/08/30 Javascript
Vue 实现列表动态添加和删除的两种方法小结
2018/09/07 Javascript
jQuery中each和js中forEach的区别分析
2019/02/27 jQuery
vuex存值与取值的实例
2019/11/06 Javascript
JavaScript代码压缩工具UglifyJS和Google Closure Compiler的基本用法
2020/04/13 Javascript
Vue + Element-ui的下拉框el-select获取额外参数详解
2020/08/14 Javascript
结合Python的SimpleHTTPServer源码来解析socket通信
2016/06/27 Python
python cx_Oracle模块的安装和使用详细介绍
2017/02/13 Python
python TCP Socket的粘包和分包的处理详解
2018/02/09 Python
python抖音表白程序源代码
2019/04/07 Python
对Python _取log的几种方式小结
2019/07/25 Python
Python 点击指定位置验证码破解的实现代码
2019/09/11 Python
Python大数据之网络爬虫的post请求、get请求区别实例分析
2019/11/16 Python
基于Python脚本实现邮件报警功能
2020/05/20 Python
Forever 21美国官网:美国标志性快时尚品牌
2017/02/20 全球购物
澳大利亚在线批发商:Simply Wholesale
2021/02/24 全球购物
师范生实习个人的自我评价
2013/09/28 职场文书
财务总经理岗位职责
2014/02/16 职场文书
电子商务专业学生职业生涯规划
2014/03/07 职场文书
《长征》教学反思
2014/04/27 职场文书
个人授权委托书范本格式
2014/10/12 职场文书
2014保险公司个人工作总结
2014/12/09 职场文书
应届毕业生的自我评价
2019/06/21 职场文书
2019年冬至:天冷暖人心的问候祝福语大全
2019/12/20 职场文书
Python代码,能玩30多款童年游戏!这些有几个是你玩过的
2021/04/27 Python
Python利用capstone实现反汇编
2022/04/06 Python