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 相关文章推荐
用js实现下载远程文件并保存在本地的脚本
May 06 Javascript
Javascript中的变量使用说明
May 18 Javascript
jQuery getJSON()+.ashx 实现分页(改进版)
Mar 28 Javascript
JS中showModalDialog 的使用解析
Apr 17 Javascript
jQuery之日期选择器的深入解析
Jun 19 Javascript
图片翻转效果具体实现代码
Jan 09 Javascript
js跨域请求数据的3种常用的方法
Dec 01 Javascript
JavaScript必知必会(二) null 和undefined
Jun 08 Javascript
Html中 IFrame的用法及注意点
Dec 22 Javascript
EasyUI折叠表格层次显示detailview详解及实例
Dec 28 Javascript
JavaScript设计模式之代理模式简单实例教程
Jul 03 Javascript
jQuery实现的图片点击放大缩小功能案例
Jan 02 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 Smarty模板生成html文档的方法
2010/04/12 PHP
Linux下CoreSeek及PHP扩展模块的安装
2012/09/23 PHP
基于PHPExcel的常用方法总结
2013/06/13 PHP
cakephp2.X多表联合查询join及使用分页查询的方法
2017/02/23 PHP
thinkPHP中钩子的使用方法实例分析
2017/11/16 PHP
laravel 关联关系遍历数组的例子
2019/10/10 PHP
PHP设计模式之迭代器模式Iterator实例分析【对象行为型】
2020/04/26 PHP
PHP中的异常处理机制深入讲解
2020/11/10 PHP
js中将字符串转换成json的三种方式
2011/01/12 Javascript
javascript中IE浏览器不支持NEW DATE()带参数的解决方法
2012/03/01 Javascript
js将控件隐藏及display属性的使用介绍
2013/12/30 Javascript
jquery预览图片实现鼠标放上去显示实际大小
2014/01/16 Javascript
微信小程序 wxapp导航 navigator详解
2016/10/31 Javascript
Node.js 实现简单小说爬虫实例
2016/11/18 Javascript
谈谈jQuery之Deferred源码剖析
2016/12/19 Javascript
NodeJS仿WebApi路由示例
2017/02/28 NodeJs
解决循环中setTimeout执行顺序的问题
2018/06/20 Javascript
JavaScript数组、json对象、eval()函数用法实例分析
2019/02/21 Javascript
使用vue cli4.x搭建vue项目的过程详解
2020/05/08 Javascript
详细分析React 表单与事件
2020/07/08 Javascript
解决Vue使用bus总线时,第一次路由跳转时数据没成功传递问题
2020/07/28 Javascript
Jquery 获取相同NAME 或者id删除行操作
2020/08/24 jQuery
[05:13]2018DOTA2亚洲邀请赛主赛事第二日战况回顾 LGD、VG双雄携手晋级
2018/04/05 DOTA
[50:11]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第三场
2018/04/09 DOTA
利用python打开摄像头及颜色检测方法
2018/08/03 Python
Python对接支付宝支付自实现功能
2019/10/10 Python
django admin管理工具自定义时间区间筛选器DateRangeFilter介绍
2020/05/19 Python
python支持多继承吗
2020/06/19 Python
python实现mask矩阵示例(根据列表所给元素)
2020/07/30 Python
python实现简单的tcp 文件下载
2020/09/16 Python
CSS3实现可关闭的下拉手风琴菜单效果
2015/08/31 HTML / CSS
加拿大百叶窗和窗帘定制网站:Blinds
2017/01/30 全球购物
iHerb台湾:维生素、保健品和健康产品
2018/01/31 全球购物
碧欧泉Biotherm加拿大官方网站:法国高端护肤品牌
2019/10/18 全球购物
2016年领导干部廉政承诺书
2016/03/24 职场文书
十大最强妖精系宝可梦,哲尔尼亚斯实力最强,第五被称为大力士
2022/03/18 日漫