一篇文章让你彻底弄懂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 相关文章推荐
用javascript实现无刷新更新数据的详细步骤 asp
Dec 26 Javascript
csdn 批量接受好友邀请
Feb 19 Javascript
Jquery AJAX 框架的使用方法
Nov 03 Javascript
javascript 获取所有id中包含某关键字的控件的实现代码
Nov 25 Javascript
jquery学习笔记 用jquery实现无刷新登录
Aug 08 Javascript
多种方法实现load加载完成后把图片一次性显示出来
Feb 19 Javascript
创建js对象和js类的方法汇总
Dec 24 Javascript
JavaScript跨平台的开源框架NativeScript
Mar 24 Javascript
js实现分享到随页面滚动而滑动效果的方法
Apr 10 Javascript
jQuery实现智能判断固定导航条或侧边栏的方法
Sep 04 Javascript
js实现前端图片上传即时预览功能
Aug 02 Javascript
js实现ajax的用户简单登入功能
Jun 18 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
支持php4、php5的mysql数据库操作类
2008/01/10 PHP
easyui的tabs update正确用法分享
2014/03/21 PHP
PHP图片处理之图片背景、画布操作
2014/11/19 PHP
php判断用户是否手机访问代码
2015/06/08 PHP
PHP简单读取PDF页数的实现方法
2016/07/21 PHP
关于JQuery($.load)事件的用法和分析
2013/04/09 Javascript
Js+php实现异步拖拽上传文件
2015/06/23 Javascript
使用jQuery处理AJAX请求的基础学习教程
2016/05/10 Javascript
jQuery tagsinput在h5邮件客户端中应用详解
2016/09/26 Javascript
源码分析Vue.js的监听实现教程
2017/04/23 Javascript
Vue入门之数据绑定(小结)
2018/01/08 Javascript
vue中使用极验验证码的方法(附demo)
2019/12/04 Javascript
vue和小程序项目中使用iconfont的方法
2020/05/19 Javascript
微信小程序自定义扫码功能界面的实现代码
2020/07/02 Javascript
Python 调用DLL操作抄表机
2009/01/12 Python
Python中使用strip()方法删除字符串中空格的教程
2015/05/20 Python
python下读取公私钥做加解密实例详解
2017/03/29 Python
Django实现的自定义访问日志模块示例
2017/06/23 Python
python中pip的安装与使用教程
2018/08/10 Python
在Python中定义一个常量的方法
2018/11/10 Python
Python3对称加密算法AES、DES3实例详解
2018/12/06 Python
python 同时运行多个程序的实例
2019/01/07 Python
浅谈Python type的使用
2019/11/19 Python
python/Matplotlib绘制复变函数图像教程
2019/11/21 Python
css3 box-sizing属性使用参考指南
2013/01/08 HTML / CSS
建筑公司文秘岗位职责
2013/11/29 职场文书
化工专业大学生职业生涯规划书
2014/01/14 职场文书
幼儿园教师岗位职责
2014/03/17 职场文书
创先争优演讲稿
2014/09/15 职场文书
机关党总支领导班子整改方案
2014/09/20 职场文书
乡镇党员干部四风对照检查材料思想汇报
2014/09/27 职场文书
教师先进个人材料
2014/12/17 职场文书
工程部部长岗位职责
2015/02/12 职场文书
文艺演出主持词
2015/07/01 职场文书
安全生产奖惩制度
2015/08/06 职场文书
Python生成九宫格图片的示例代码
2021/04/14 Python