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 相关文章推荐
ASP 过滤数组重复数据函数(加强版)
May 31 Javascript
jquery.cookie.js 操作cookie实现记住密码功能的实现代码
Apr 27 Javascript
jquery解析JSON数据示例代码
Mar 17 Javascript
全国省市二级联动下拉菜单 js版
May 10 Javascript
浅谈JQ中mouseover和mouseenter的区别
Sep 13 Javascript
jQuery扩展实现text提示还能输入多少字节的方法
Nov 28 Javascript
JavaScript闭包_动力节点Java学院整理
Jun 27 Javascript
在iframe中使bootstrap的模态框在父页面弹出问题
Aug 07 Javascript
ExtJs整合Echarts的示例代码
Feb 27 Javascript
React 使用Hooks简化受控组件的状态绑定
Mar 18 Javascript
Node.js API详解之 dgram模块用法实例分析
Jun 05 Javascript
jQuery冲突问题解决方法
Jan 19 jQuery
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 金额数字转换成英文
2010/05/06 PHP
PHP导入Excel到MySQL的方法
2011/04/23 PHP
PHP排序算法之归并排序(Merging Sort)实例详解
2018/04/21 PHP
PHP登录验证功能示例【用户名、密码、验证码、数据库、已登陆验证、自动登录和注销登录等】
2019/02/25 PHP
php7性能提升的原因详解
2019/10/13 PHP
多浏览器支持的右下角浮动窗口
2010/04/01 Javascript
jQuery中使用Ajax获取JSON格式数据示例代码
2013/11/26 Javascript
JavaScript实现显示函数调用堆栈的方法
2016/04/21 Javascript
jquery实现图片轮播器
2017/05/23 jQuery
简单谈谈原生js的math对象
2017/06/27 Javascript
利用babel将es6语法转es5的简单示例
2017/12/01 Javascript
JS 使用 window对象的print方法实现分页打印功能
2018/05/16 Javascript
JS实现的3des+base64加密解密算法完整示例
2018/05/18 Javascript
使用JavaScript破解web
2018/09/28 Javascript
微信小程序中为什么使用var that=this
2019/08/27 Javascript
nodejs+koa2 实现模仿springMVC框架
2020/10/21 NodeJs
vue 导航守卫和axios拦截器有哪些区别
2020/12/19 Vue.js
[02:05]2014DOTA2国际邀请赛 BBC外卡赛赛后总结
2014/07/09 DOTA
[02:32]“虐狗”镜头慎点 2016国际邀请赛中国区预选赛现场玩家采访
2016/06/28 DOTA
python通过cookie模拟已登录状态的初步研究
2016/11/09 Python
Python实现简易端口扫描器代码实例
2017/03/15 Python
浅谈用VSCode写python的正确姿势
2017/12/16 Python
python使用thrift教程的方法示例
2019/03/21 Python
Python利用神经网络解决非线性回归问题实例详解
2019/07/19 Python
Python Opencv中用compareHist函数进行直方图比较对比图片
2020/04/07 Python
Speedo美国:澳大利亚顶尖泳衣制造商
2016/08/03 全球购物
JAVA和C++区别都有哪些
2015/03/30 面试题
什么是符号链接,什么是硬链接?符号链接与硬链接的区别是什么?
2014/01/19 面试题
数据管理员的自我评价分享
2013/11/15 职场文书
建筑施工员岗位职责
2013/11/26 职场文书
数控技术专业毕业自荐书范文
2014/02/05 职场文书
交通事故协议书范文
2014/04/16 职场文书
组织委员竞选稿
2015/11/21 职场文书
MySQL中InnoDB存储引擎的锁的基本使用教程
2021/05/26 MySQL
Win11快速关闭所有广告推荐
2022/04/19 数码科技
Apache SkyWalking 监控 MySQL Server 实战解析
2022/09/23 Servers