一篇文章让你彻底弄懂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 相关文章推荐
jQuery Ajax使用 全解析
Dec 15 Javascript
jquery $.each 和for怎么跳出循环终止本次循环
Sep 27 Javascript
jQuery实现鼠标经过事件的延时处理效果
Aug 20 Javascript
jQuery+CSS实现滑动的标签分栏切换效果
Dec 17 Javascript
JavaScript DOM 对象深入了解
Jul 20 Javascript
javascript少儿编程关于返回值的函数内容
May 27 Javascript
浅谈vue.use()方法从源码到使用
May 12 Javascript
Vue中util的工具函数实例详解
Jul 08 Javascript
Vue中的循环及修改差值表达式的方法
Aug 29 Javascript
详解使用mocha对webpack打包的项目进行&quot;冒烟测试&quot;的大致流程
Apr 27 Javascript
微信小程序的引导页实现代码
Jun 24 Javascript
vue2实现provide inject传递响应式
May 21 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中在数据库中保存Checkbox数据(2)
2006/10/09 PHP
聊天室php&amp;mysql(一)
2006/10/09 PHP
将一维或多维的数组连接成一个字符串的php代码
2010/08/08 PHP
js读取本地excel文档数据的代码
2010/11/11 Javascript
javascript验证只能输入数字和一个小数点示例
2013/10/21 Javascript
jQuery的DOM操作之删除节点示例
2014/01/03 Javascript
使用focus方法让光标默认停留在INPUT框
2014/07/29 Javascript
浅谈JavaScript的事件
2015/02/27 Javascript
JavaScript更改原始对象valueOf的方法
2015/03/19 Javascript
用svg制作富有动态的tooltip
2015/07/17 Javascript
JS实现鼠标滑过链接改变网页背景颜色的方法
2015/10/20 Javascript
AngularJS 过滤与排序详解及实例代码
2016/09/14 Javascript
原生JavaScript实现的简单放大镜效果示例
2018/02/07 Javascript
Angularjs实现多图片上传预览功能
2018/07/18 Javascript
解决angularjs service中依赖注入$scope报错的问题
2018/10/02 Javascript
浅谈让你的代码更简短,更整洁,更易读的ES6小技巧
2018/10/25 Javascript
Angular7中创建组件/自定义指令/管道的方法实例详解
2019/04/02 Javascript
[01:43]倾听DOTA2英雄之声 魅惑魔女国服配音鉴赏
2013/06/06 DOTA
python实现点对点聊天程序
2018/07/28 Python
如何在VSCode上轻松舒适的配置Python的方法步骤
2019/10/28 Python
基于Python获取城市近7天天气预报
2019/11/26 Python
sklearn+python:线性回归案例
2020/02/24 Python
卸载tensorflow-cpu重装tensorflow-gpu操作
2020/06/23 Python
python list等分并从等分的子集中随机选取一个数
2020/11/16 Python
用python查找统一局域网下ip对应的mac地址
2021/01/13 Python
Python Selenium破解滑块验证码最新版(GEETEST95%以上通过率)
2021/01/29 Python
戴尔加拿大官网:Dell加拿大
2016/09/17 全球购物
为什么group by 和order by会使查询变慢
2014/05/16 面试题
工程预算与管理应届生求职信
2013/10/06 职场文书
销售经理工作职责
2014/02/03 职场文书
超市优秀员工获奖感言
2014/08/15 职场文书
师德师风自我剖析材料
2014/09/27 职场文书
《窃读记》教学反思
2016/02/18 职场文书
LayUI+Shiro实现动态菜单并记住菜单收展的示例
2021/05/06 Javascript
用Python进行栅格数据的分区统计和批量提取
2021/05/27 Python
MySQL分区以及建索引的方法总结
2022/04/13 MySQL