一篇文章让你彻底弄懂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 相关文章推荐
在textarea文本域中显示HTML代码的方法
Mar 06 Javascript
解决表单中第一个非隐藏的元素获得焦点的一个方案
Oct 26 Javascript
通过遮罩层实现浮层DIV登录的js代码
Feb 07 Javascript
javascript内置对象操作详解
Feb 04 Javascript
Javascript中的return作用及javascript return关键字用法详解
Nov 05 Javascript
Bootstrap每天必学之基础排版
Nov 20 Javascript
jquery利用拖拽方式在图片上添加热链接
Nov 24 Javascript
JS原型、原型链深入理解
Feb 27 Javascript
js模仿微信朋友圈计算时间显示几天/几小时/几分钟/几秒之前
Apr 27 Javascript
Angular 4依赖注入学习教程之组件服务注入(二)
Jun 04 Javascript
解决使用Vue.js显示数据的时,页面闪现原始代码的问题
Feb 11 Javascript
vue主动刷新页面及列表数据删除后的刷新实例
Sep 16 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
php 数组的合并、拆分、区别取值函数集
2010/02/15 PHP
PHP APC的安装与使用详解
2013/06/13 PHP
php有道翻译api调用方法实例
2014/12/22 PHP
PHP调用微博接口实现微博登录的方法示例
2018/09/22 PHP
JS DOM 操作实现代码
2010/08/01 Javascript
Javascript绝句欣赏 一些经典的js代码
2012/02/22 Javascript
yui3的AOP(面向切面编程)和OOP(面向对象编程)
2015/05/01 Javascript
JS实现向iframe中表单传值的方法
2017/03/24 Javascript
微信小程序联网请求的轮播图
2017/07/07 Javascript
javaScript中的空值和假值
2017/12/18 Javascript
浅谈gulp创建完整的项目流程
2017/12/20 Javascript
浅谈vue-router 路由传参的方法
2017/12/27 Javascript
vue.js 添加 fastclick的支持方法
2018/08/28 Javascript
JavaScript 点击触发复制功能实例详解
2018/11/02 Javascript
详解小程序中h5页面onShow实现及跨页面通信方案
2019/05/30 Javascript
vue + typescript + 极验登录验证的实现方法
2019/06/27 Javascript
详解webpack-dev-middleware 源码解读
2020/03/23 Javascript
JavaScript实现简单动态表格
2020/12/02 Javascript
8个非常实用的Vue自定义指令
2020/12/15 Vue.js
python利用有道翻译实现&quot;语言翻译器&quot;的功能实例
2017/11/14 Python
Windows下的Jupyter Notebook 安装与自定义启动(图文详解)
2018/02/21 Python
解决Matplotlib图表不能在Pycharm中显示的问题
2018/05/24 Python
python文件操作之批量修改文件后缀名的方法
2018/08/10 Python
python rsync服务器之间文件夹同步脚本
2019/08/29 Python
matlab中imadjust函数的作用及应用举例
2020/02/27 Python
Python将list元素转存为CSV文件的实现
2020/11/16 Python
HTML5 Video标签的属性、方法和事件汇总介绍
2015/04/24 HTML / CSS
使用layui框架实现点击左侧导航切换右侧内容且右侧选项卡跟随变化的效果
2020/11/10 HTML / CSS
西尔斯百货官网:Sears
2016/09/06 全球购物
猫途鹰:全球领先的旅游点评社区
2017/04/07 全球购物
澳大利亚在线时尚精品店:Hello Molly
2018/02/26 全球购物
幼儿园父亲节活动方案
2014/03/11 职场文书
技术员岗位职责
2015/02/04 职场文书
2015年超市工作总结范文
2015/05/26 职场文书
SQL Server中使用表变量和临时表
2022/05/20 SQL Server
Java中的Kafka为什么性能这么快及4大核心详析
2022/09/23 Java/Android