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 相关文章推荐
分享14个很酷的jQuery导航菜单插件
Apr 25 Javascript
JS方法调用括号的问题探讨
Jan 24 Javascript
javascript中的括号()用法小结
Apr 14 Javascript
escape编码与unescape解码汉字出现乱码的解决方法
Jul 02 Javascript
浅析javascript中函数声明和函数表达式的区别
Feb 15 Javascript
利用js获取下拉框中所选的值
Dec 01 Javascript
如何在 Vue.js 中使用第三方js库
Apr 25 Javascript
利用Vue v-model实现一个自定义的表单组件
Apr 27 Javascript
JS中Safari浏览器中的Date
Jul 17 Javascript
详解win7 cmd执行vue不是内部命令的解决方法
Jul 27 Javascript
ECMAscript 变量作用域总结概括
Aug 18 Javascript
使用D3.js构建实时图形的示例代码
Aug 28 Javascript
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
十大感人催泪爱情动漫 第一名至今不忍在看第二遍
2020/03/04 日漫
PHP的substr_replace将指定两位置之间的字符替换为*号
2011/05/04 PHP
ThinkPHP3.1之D方法实例详解
2014/06/20 PHP
php 模拟 asp.net webFrom 按钮提交事件实例
2014/10/13 PHP
PHP针对JSON操作实例分析
2015/01/12 PHP
PHP的serialize序列化数据以及JSON格式化数据分析
2015/10/10 PHP
PHP更安全的密码加密机制Bcrypt详解
2017/06/18 PHP
常用js脚本
2006/12/03 Javascript
比较全的JS checkbox全选、取消全选、删除功能代码
2008/12/19 Javascript
jquery.boxy插件的iframe扩展代码
2010/07/02 Javascript
js下通过prototype扩展实现indexOf的代码
2010/12/08 Javascript
Javascript实现的类似Google的Div拖动效果代码
2011/08/09 Javascript
jquery ajax属性async(同步异步)示例
2013/11/05 Javascript
JS设置获取cookies的方法
2014/01/26 Javascript
Javascript中的五种数据类型详解
2014/12/26 Javascript
jQuery实现下滑菜单导航效果代码
2015/08/25 Javascript
JavaScript中的对象继承关系
2016/08/01 Javascript
微信小程序 侧滑删除(左滑删除)
2017/05/23 Javascript
vue 中自定义指令改变data中的值
2017/06/02 Javascript
详谈commonjs模块与es6模块的区别
2017/10/18 Javascript
react native 获取地理位置的方法示例
2018/08/28 Javascript
JS去除字符串最后的逗号实例分析【四种方法】
2019/06/20 Javascript
[54:58]完美世界DOTA2联赛PWL S2 LBZS vs Rebirth 第一场 11.25
2020/11/25 DOTA
Python中类的继承代码实例
2014/10/28 Python
python使用minimax算法实现五子棋
2019/07/29 Python
python web框架 django wsgi原理解析
2019/08/20 Python
python抓取多种类型的页面方法实例
2019/11/20 Python
浅谈tensorflow之内存暴涨问题
2020/02/05 Python
python实现学生信息管理系统(精简版)
2020/11/27 Python
CSS类名支持中文命名的示例
2014/04/04 HTML / CSS
施工安全协议书范本
2014/09/26 职场文书
县委班子四风对照检查材料思想汇报
2014/09/29 职场文书
2014年组织部工作总结
2014/11/14 职场文书
2014年乡镇团委工作总结
2014/12/18 职场文书
2015秋季小学开学寄语
2015/05/27 职场文书
人事部:年度述职报告范文
2019/07/12 职场文书