JS中绑定事件顺序(事件冒泡与事件捕获区别)


Posted in Javascript onJanuary 24, 2017

在JS中,绑定的事件默认的执行时间是在冒泡阶段执行,而非在捕获阶段(重要),这也是为什么当父类和子类都绑定了某个事件,会先调用子类绑定的事件,后调用父类的事件。直接看下面实例

<!Doctype html>
<html>
<head>
 <meta charset="utf-8">
 <title></title>
 <style type="text/css">
 *{margin:0;padding: 0;}
 </style>
</head>
<body>
<div id="id1" style="height:400px; border:1px solid #000;">
 <div id="id2" style="height:200px; border:1px solid #000;">
 <div id="id3" style="height:50px; border:1px solid #000;"></div>
 </div>
</div>
</body>
<script type="text/javascript">
 var obj1=document.getElementById('id1'); 
 obj1.addEventListener('click',function(){
 alert('id1');
 },false);
 var obj2=document.getElementById('id2');
 obj2.addEventListener('click',function(){
 alert('id2');
 },true);
 var obj3=document.getElementById('id3');
 obj3.addEventListener('click',function(){
 alert('id3');
 },true);
 /*如果第三个参数为true,则事件在捕获阶段执行,如果第三个参数为false,则事件在冒泡阶段执行*/
</script>
</html>

当点击id3元素时候,执行结果是:id2,id3,id1

解析:因为obj2与obj3绑定的方法在捕获阶段执行,obj1的事件在冒泡阶段执行。

总结

在JS中,绑定的事件默认的执行时间是在冒泡阶段执行,而非在捕获阶段,必须要理解

不过我们可以通过绑定事件时,指定事件执行时间是在冒泡阶段还是捕获阶段。

obj.addEventListener(event,function(){},bool)

bool:false,代表冒泡阶段执行

bool:true,代表捕获阶段执行

JS在默认情况下获取事件后,就开始从根元素开始捕获所有该事件的监听对象,然后在冒泡阶段逐一执行。捕获阶段是在冒泡阶段前面

阻止冒泡

w3c的方法是e.stopPropagation(),IE则是使用e.cancelBubble = true;

阻止默认行为

w3c的方法是e.preventDefault(),IE则是使用e.returnValue = false;

关于JS 事件冒泡和onclick,click,on()事件触发顺序

onclick,click,on()的优先关系:onclick>click>on();

onclick和click绑定的事件,彼此之间遵守事件冒泡规则,从内到外触发;

on()绑定的事件,总是晚于onclick和click绑定的事件触发;

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
js下关于onmouseout、事件冒泡的问题经验小结
Dec 09 Javascript
JavaScript自定义事件介绍
Aug 29 Javascript
jquery预加载图片的方法
May 27 Javascript
javascript解决IE6下hover问题的方法
Jul 28 Javascript
JavaScript函数的调用以及参数传递
Oct 21 Javascript
Bootstrap自定义文件上传下载样式
May 26 Javascript
vue+Java后端进行调试时解决跨域问题的方式
Oct 19 Javascript
element 结合vue 在表单验证时有值却提示错误的解决办法
Jan 22 Javascript
JS实现的简单分页功能示例
Aug 23 Javascript
vue使用rem实现 移动端屏幕适配
Sep 26 Javascript
Vue CLI3.0中使用jQuery和Bootstrap的方法
Feb 28 jQuery
小程序如何构建骨架屏
May 29 Javascript
input获取焦点时底部菜单被顶上来问题的解决办法
Jan 24 #Javascript
JavaScript解析JSON格式数据的方法示例
Jan 24 #Javascript
解决ajax不能访问本地文件问题(利用js跨域原理)
Jan 24 #Javascript
Jquery树插件zTree实现菜单树
Jan 24 #Javascript
bootstrap table之通用方法( 时间控件,导出,动态下拉框, 表单验证 ,选中与获取信息)代码分享
Jan 24 #Javascript
树结构之JavaScript
Jan 24 #Javascript
AngularJS实现使用路由切换视图的方法
Jan 24 #Javascript
You might like
PHP截取汉字乱码问题解决方法mb_substr函数的应用
2008/03/30 PHP
PHP数组内存耗用太多问题的解决方法
2010/04/05 PHP
Zend Framework教程之Bootstrap类用法概述
2016/03/14 PHP
php正则去除网页中所有的html,js,css,注释的实现方法
2016/11/03 PHP
PHP微信开发之微信录音临时转永久存储
2018/01/26 PHP
基于PHP实现的多元线性回归模拟曲线算法
2018/01/30 PHP
PHP实现微信提现(企业付款到零钱)
2019/08/01 PHP
Laravel 微信小程序后端搭建步骤详解
2019/11/26 PHP
passwordStrength 基于jquery的密码强度检测代码使用介绍
2011/10/08 Javascript
点击页面其它地方隐藏该div的两种思路
2013/11/18 Javascript
JavaScript事件类型中UI事件详解
2016/01/14 Javascript
JS短信验证码倒计时功能的实现(没有验证码,只有倒计时)
2016/10/27 Javascript
JSON键值对序列化和反序列化解析
2017/01/24 Javascript
react使用antd表单赋值,用于修改弹框的操作
2020/10/29 Javascript
解决antd 表单设置默认值initialValue后验证失效的问题
2020/11/02 Javascript
JavaScript中常用的3种弹出提示框(alert、confirm、prompt)
2020/11/10 Javascript
[05:13]2018DOTA2亚洲邀请赛主赛事第二日战况回顾 LGD、VG双雄携手晋级
2018/04/05 DOTA
[02:12]打造更好的电竞完美世界:完美盛典回顾篇
2018/12/19 DOTA
python使用tornado实现登录和登出
2018/07/28 Python
Python正则表达式匹配和提取IP地址
2019/06/06 Python
django使用haystack调用Elasticsearch实现索引搜索
2019/07/24 Python
Django框架创建mysql连接与使用示例
2019/07/29 Python
python 字符串常用方法汇总详解
2019/09/16 Python
Python爬虫requests库多种用法实例
2020/05/28 Python
基于Python采集爬取微信公众号历史数据
2020/11/27 Python
澳大利亚运动鞋零售商:The Athlete’s Foot
2018/11/04 全球购物
网络工程师面试(三木通信技术有限公司)
2013/06/05 面试题
法律进企业活动方案
2014/03/04 职场文书
党课知识竞赛主持词
2014/04/01 职场文书
竞聘上岗演讲稿
2014/05/16 职场文书
学校党的群众路线教育实践活动制度建设计划
2014/11/03 职场文书
2015年教师党员公开承诺书
2015/01/22 职场文书
社区法制宣传月活动总结
2015/05/07 职场文书
机械原理课程设计心得体会
2016/01/15 职场文书
Redis的字符串是如何实现的
2021/10/24 Redis
Python中的socket网络模块介绍
2022/07/23 Python