JavaScript实现父子dom同时绑定两个点击事件,一个用捕获,一个用冒泡时执行顺序的方法


Posted in Javascript onMarch 30, 2017

本文实例讲述了JavaScript实现父子dom同时绑定两个点击事件,一个用捕获,一个用冒泡时执行顺序的方法。分享给大家供大家参考,具体如下:

事件的执行顺序绝对是让人头疼的问题。当父元素与子元素都绑定了多个事件,且有的绑定在冒泡阶段、有的绑定在捕获阶段时,事件的触发顺序如何?如果你只关心这个问题,请直接下滑到3. 绑定多个事件,且由用户行为触发。如果你想细致了解JavaScript中的事件发生,请慢慢阅读。

1. 原生事件的发生顺序

一般来讲,当为一个a标签添加click事件以后,点击这个标签,会先执行绑定的事件、后跳转页面。一个input绑定blur事件以后,你在input里输入完内容,点击提交按钮,会先发生blur事件,后发生click事件。当然,这是一般来讲。我在一个React项目中曾经发生表单提交时,先发生click事件,blur事件没有来得及发生,造成表单内容没有检验就提交到后台,原因我至今没有找到,解决办法是在click事件上加一个50ms的延迟。

2. 自定义事件

JavaScript中也支持手动触发事件,请看下面代码。

a.addEventListener('click', function(){
  console.log(input.value);
  console.log(this.getAttribute('href'));
  console.log(location.href);
}, false); //a是我已经通过id获得好的一个a标签
var event = document.createEvent('HTMLEvents'); // initEvent接受3个参数: 事件类型,是否冒泡,是否阻止浏览器的默认行为
event.initEvent('click', true, true);
event.eventType = 'click';
//触发a上绑定的自定义事件
a.dispatchEvent(event);
//注:jQuery中有更简单的trigger()方法实现自定义事件功能

JavaScript中自定义事件的类型有(即document.createEvent('HTMLEvents')中的参数):

1. UIEvents:一般化的UI事件。
2. MouseEvents:一般化的鼠标事件。
3. MutationEvents:一般化的DOM变动事件。
4. HTMLEvents:一般化的HTML事件。

自定义事件的发生比较容易控制,你什么时候触发(dispatchEvent/fireEvent)它,它就什么时候发生。

3. 绑定多个事件,且由用户行为触发

这个情况最复杂,也是标题中的情况:父元素与子元素都绑定多个事件,且有的事件在捕获阶段、有的事件在冒泡阶段。

下面这个例子,父元素div绑定两个事件(一个冒泡阶段、一个捕获阶段),子元素也是这种情况。事件触发顺序如何。

var btn = document.querySelector('button');
var div = document.querySelector('div');
btn.addEventListener('click', function(){
  console.log('bubble','btn');
},false);
btn.addEventListener('click', function(){
  console.log('capture','btn');
},true);
div.addEventListener('click', function(){
  console.log('bubble','div');
},false);
div.addEventListener('click', function(){
  console.log('capture','div');
},true);

执行结果:

JavaScript实现父子dom同时绑定两个点击事件,一个用捕获,一个用冒泡时执行顺序的方法

乍一看这个结果有些乱,但仔细分析可以得出结论

绑定在被点击元素的事件是按照代码顺序发生,其他元素通过冒泡或者捕获“感知”的事件,按照W3C的标准,先发生捕获事件,后发生冒泡事件。所有事件的顺序是:其他元素捕获阶段事件 -> 本元素代码顺序事件 -> 其他元素冒泡阶段事件 。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
基于jquery的一个浮动框(扩展性比较好 )
Aug 27 Javascript
jquery数据验证插件(自制,简单,练手)实例代码
Oct 24 Javascript
jquery如何判断表格同一列不同行input数据是否重复
May 14 Javascript
jquery图片滚动放大代码分享(2)
Aug 28 Javascript
javascript中类的定义方式详解(四种方式)
Dec 22 Javascript
JavaScript面向对象之私有静态变量实例分析
Jan 14 Javascript
浅谈jquery之on()绑定事件和off()解除绑定事件
Oct 26 Javascript
VUE基于NUXT的SSR 服务端渲染
Nov 30 Javascript
vue监听键盘事件的相关总结
Jan 29 Vue.js
js面向对象方式实现拖拽效果
Mar 03 Javascript
JS Object构造函数之Object.freeze
Apr 28 Javascript
vue数据字典取键值项目的字典问题
Apr 12 Vue.js
vue2.0实现倒计时的插件(时间戳 刷新 跳转 都不影响)
Mar 30 #Javascript
JavaScript mixin实现多继承的方法详解
Mar 30 #Javascript
Angular.JS中的指令引用template与指令当做属性详解
Mar 30 #Javascript
jQuery源码解读之extend()与工具方法、实例方法详解
Mar 30 #jQuery
jQuery实现Select下拉列表进行状态选择功能
Mar 30 #jQuery
借助node实战JSONP跨域实例
Mar 30 #Javascript
js利用for in循环获取 一个对象的所有属性以及值的实例
Mar 30 #Javascript
You might like
PHP脚本数据库功能详解(下)
2006/10/09 PHP
Php 构造函数construct的前下划线是双的_
2009/12/08 PHP
PHP文件缓存内容保存格式实例分析
2014/08/20 PHP
php实现汉字验证码和算式验证码的方法
2015/03/07 PHP
php限制文件下载速度的代码
2015/10/20 PHP
PHP的AES加密算法完整实例
2016/07/20 PHP
详解Yii2.0使用AR联表查询实例
2017/06/16 PHP
PHP文件操作实例总结【文件上传、下载、分页】
2018/12/08 PHP
更正确的asp冒泡排序
2007/05/24 Javascript
Javascript实现的类似Google的Div拖动效果代码
2011/08/09 Javascript
关于onScroll事件在IE6下每次滚动触发三次bug说明
2011/09/21 Javascript
json对象转字符串如何实现
2012/12/02 Javascript
Google Maps基础及实例解析
2016/08/06 Javascript
为你的微信小程序体积瘦身详解
2017/05/20 Javascript
animate.css在vue项目中的使用教程
2018/08/05 Javascript
Vue项目部署的实现(阿里云+Nginx代理+PM2)
2019/03/26 Javascript
python编程-将Python程序转化为可执行程序[整理]
2007/04/09 Python
Collatz 序列、逗号代码、字符图网格实例
2017/06/22 Python
深入理解Django-Signals信号量
2019/02/19 Python
Django项目中实现使用qq第三方登录功能
2019/08/13 Python
TensorFlow dataset.shuffle、batch、repeat的使用详解
2020/01/21 Python
使用phonegap创建联系人的实现方法
2017/03/30 HTML / CSS
Roots加拿大官网:加拿大休闲服饰品牌
2016/10/24 全球购物
英国鞋类及配饰零售商:Kurt Geiger
2017/02/04 全球购物
大学生活动策划方案
2014/02/10 职场文书
小学教师个人先进事迹材料
2014/05/17 职场文书
关于读书的演讲稿400字
2014/08/27 职场文书
2014教师个人自我评价范文
2014/09/13 职场文书
党政领导班子四风问题对照检查材料思想汇报
2014/10/02 职场文书
2014年办公室人员工作总结
2014/12/09 职场文书
团员年度个人总结
2015/02/26 职场文书
社会主义核心价值观主题教育活动总结
2015/05/07 职场文书
针对吵架老公保证书
2015/05/08 职场文书
pytorch锁死在dataloader(训练时卡死)
2021/05/28 Python
Centos7中MySQL数据库使用mysqldump进行每日自动备份的编写
2021/08/02 MySQL
Java处理延时任务的常用几种解决方案
2022/06/01 Java/Android