一篇文章让你彻底弄懂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 得到当前页面高度和宽度的两个函数
Feb 21 Javascript
等待指定时间后自动跳转或关闭当前页面的js代码
Jul 09 Javascript
AngularJS基础学习笔记之表达式
May 10 Javascript
js实现超酷的照片墙展示效果图附源码下载
Oct 08 Javascript
Struts2+jquery.form.js实现图片与文件上传的方法
May 05 Javascript
Angular.Js之Scope作用域的学习教程
Apr 27 Javascript
vue实现全选和反选功能
Aug 31 Javascript
Angular4学习教程之HTML属性绑定的方法
Jan 04 Javascript
JS中min函数实例讲解
Feb 18 Javascript
vue选项卡切换登录方式小案例
Sep 27 Javascript
vue实现点击按钮下载文件功能
Oct 11 Javascript
vue3.0 项目搭建和使用流程
Mar 04 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
让这部DC动画新作刷新你的认知
2020/03/03 欧美动漫
php 中英文语言转换类
2011/09/07 PHP
php异常处理技术,顶级异常处理器
2012/06/13 PHP
php中引用符号(&amp;)的使用详细介绍
2016/12/06 PHP
Laravel5.7 Eloquent ORM快速入门详解
2019/04/12 PHP
jquery 打开窗口返回值实现代码
2010/03/04 Javascript
javascript 判断中文字符长度的函数代码
2012/08/27 Javascript
javascript作用域问题实例分析
2015/07/13 Javascript
浅谈jquery.fn.extend与jquery.extend区别
2015/07/13 Javascript
js实现仿Discuz文本框弹出层效果
2015/08/13 Javascript
js鼠标点击图片切换效果实现代码
2015/11/19 Javascript
JS冒泡事件与事件捕获实例详解
2016/11/25 Javascript
基于jQuery实现选项卡效果
2017/01/04 Javascript
微信小程序 在线支付功能的实现
2017/03/14 Javascript
微信小程序 首页制作简单实例
2017/04/07 Javascript
荐书|您有一份JavaScript书单待签收
2017/07/21 Javascript
Vue 表单控件绑定的实现示例
2017/08/11 Javascript
vue插件--仿微信小程序showModel实现模态提示窗功能
2020/08/19 Javascript
通过数据库向Django模型添加字段的示例
2015/07/21 Python
python实现在IDLE中输入多行的方法
2018/04/19 Python
pyqt5 获取显示器的分辨率的方法
2019/06/18 Python
Python获取、格式化当前时间日期的方法
2020/02/10 Python
python 错误处理 assert详解
2020/04/20 Python
Django路由层URLconf作用及原理解析
2020/09/24 Python
Python 数据分析之逐块读取文本的实现
2020/12/14 Python
Python 使用SFTP和FTP实现对服务器的文件下载功能
2020/12/17 Python
巧用HTML5给按钮背景设计不同的动画简单实例
2016/08/09 HTML / CSS
荷兰网上买鞋:MooieSchoenen.nl
2017/09/12 全球购物
利物浦足球俱乐部官方商店(美国):Liverpool FC US
2019/10/09 全球购物
会计专业自荐信范文
2013/12/02 职场文书
打架检讨书400字
2014/01/17 职场文书
单位委托书范本
2014/04/04 职场文书
学校运动会广播稿范文
2014/10/02 职场文书
幼儿园教师自荐书
2015/03/06 职场文书
导游词之无锡古运河
2019/11/14 职场文书
python编程项目中线上问题排查与解决
2021/11/01 Python