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 相关文章推荐
javascript之dhDataGrid Ver2.0.0代码
Jul 01 Javascript
js控制页面控件隐藏显示的两种方法介绍
Oct 09 Javascript
JavaScript之IE的fireEvent方法详细解析
Nov 20 Javascript
jQuery判断元素上是否绑定了指定事件的方法
Mar 17 Javascript
js实现数组冒泡排序、快速排序原理
Mar 08 Javascript
Javascript blur与click冲突解决办法
Jan 09 Javascript
使用微信内嵌H5网页解决JS倒计时失效问题
Jan 13 Javascript
利用Javascript实现一套自定义事件机制
Dec 14 Javascript
关于在vue 中使用百度ueEditor编辑器的方法实例代码
Sep 14 Javascript
Vue 自定义指令实现一键 Copy功能
Sep 16 Javascript
webpack打包html里面img后src为“[object Module]”问题
Dec 22 Javascript
vue实现书本翻页动画效果实例详解
Apr 08 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
模仿OSO的论坛(五)
2006/10/09 PHP
JS中的prototype与面向对象的实例讲解
2013/05/22 Javascript
JavaScript通过HTML的class来获取HTML元素的方法总结
2016/05/24 Javascript
浅谈bootstrap源码分析之scrollspy(滚动侦听)
2016/06/06 Javascript
js HTML5多图片上传及预览实例解析(不含前端的文件分割)
2016/08/26 Javascript
jQuery.uploadify文件上传组件实例讲解
2016/09/23 Javascript
详解javascript中对数据格式化的思考
2017/01/23 Javascript
JS批量替换内容中关键词为超链接
2017/02/20 Javascript
jQuery获取Table某列的值(推荐)
2017/03/03 Javascript
Node.js中的http请求客户端示例(request client)
2017/05/04 Javascript
vue.js学习之vue-cli定制脚手架详解
2017/07/02 Javascript
关于webpack代码拆分的解析
2017/07/20 Javascript
jQuery实现验证表单密码一致性及正则表达式验证邮箱、手机号的方法
2017/12/05 jQuery
详解Nodejs内存治理
2018/05/13 NodeJs
JavaScript使用小插件实现倒计时的方法讲解
2019/03/11 Javascript
node crawler如何添加promise支持
2020/02/01 Javascript
vue滑动吸顶及锚点定位的示例代码
2020/05/10 Javascript
Vue中使用Echarts仪表盘展示实时数据的实现
2020/11/01 Javascript
Python HTMLParser模块解析html获取url实例
2015/04/08 Python
python用装饰器自动注册Tornado路由详解
2017/02/14 Python
Python 删除连续出现的指定字符的实例
2018/06/29 Python
linux下python中文乱码解决方案详解
2019/08/28 Python
python super用法及原理详解
2020/01/20 Python
python绘制汉诺塔
2021/03/01 Python
HTML5之SVG 2D入门2—图形绘制(基本形状)介绍及使用
2013/01/30 HTML / CSS
HTML5实现的图片无限加载的瀑布流效果另带边框圆角阴影
2014/03/07 HTML / CSS
领先的钻石和订婚戒指零售商:Diamonds-USA
2016/12/11 全球购物
描述Cookie和Session的作用,区别和各自的应用范围,Session工作原理
2015/03/25 面试题
金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)-> (一千零一拾一元整)输出
2015/05/29 面试题
纪念九一八事变演讲稿1000字
2014/09/14 职场文书
文明单位汇报材料
2014/12/24 职场文书
学校国庆节活动总结
2015/03/23 职场文书
解决Golang中ResponseWriter的一个坑
2021/04/27 Golang
tensorflow+k-means聚类简单实现猫狗图像分类的方法
2021/04/28 Python
详解Js模块化的作用原理和方案
2021/04/29 Javascript
华为HarmonyOS3.0强在哪? 看看鸿蒙3.0这7个小功能
2023/01/09 数码科技