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操作textarea方法集合封装(兼容IE,firefox)
Feb 22 Javascript
jquery Mobile入门—外部链接切换示例代码
Jan 08 Javascript
jQuery filter函数使用方法
May 19 Javascript
jQuery实现的网页竖向菜单效果代码
Aug 26 Javascript
基于JavaScript实现移动端点击图片查看大图点击大图隐藏
Nov 04 Javascript
理解javascript中的严格模式
Feb 01 Javascript
jQuery实现邮箱下拉列表自动补全功能
Sep 08 Javascript
实例解析js中try、catch、finally的执行规则
Feb 24 Javascript
ES6新特性之类(Class)和继承(Extends)相关概念与用法分析
May 24 Javascript
解决在vue项目中,发版之后,背景图片报错,路径不对的问题
Mar 06 Javascript
Vue2.0实现组件之间数据交互和通信操作示例
May 16 Javascript
vue实现浏览器全屏展示功能
Nov 27 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
PHP快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件)
2014/04/10 PHP
PHP遍历XML文档所有节点的方法
2015/03/12 PHP
PHP实现在线阅读PDF文件的方法
2015/06/23 PHP
php多线程实现方法及用法实例详解
2015/10/26 PHP
Symfony2中被遗弃的getRequest()方法分析
2016/03/17 PHP
Yii2下点击验证码的切换实例代码
2017/03/14 PHP
Thinkphp5结合layer弹窗定制操作结果页面
2017/07/07 PHP
JavaScript Event学习第九章 鼠标事件
2010/02/08 Javascript
javascript中的delete使用详解
2013/04/11 Javascript
js获取或设置当前窗口url参数的小例子
2013/10/14 Javascript
Jquery Ajax方法传值到action的方法
2014/05/11 Javascript
js函数参数设置默认值的一种变通实现方法
2014/05/26 Javascript
jquery用offset()方法获得元素的xy坐标
2014/09/06 Javascript
浅谈javascript对象模型和function对象
2014/12/26 Javascript
超漂亮的jQuery图片轮播特效
2015/11/24 Javascript
Node.js实现JS文件合并小工具
2016/02/02 Javascript
纯css下拉菜单 无需js
2016/08/15 Javascript
Vue项目webpack打包部署到服务器的实例详解
2017/07/17 Javascript
layer.confirm取消按钮绑定事件的方法
2018/08/17 Javascript
JavaScript实现星级评价效果
2019/05/17 Javascript
ES6 新增的创建数组的方法(小结)
2019/08/01 Javascript
python实现bitmap数据结构详解
2014/02/17 Python
Python中文件的读取和写入操作
2018/04/27 Python
python中dir()与__dict__属性的区别浅析
2018/12/10 Python
设置jupyter中DataFrame的显示限制方式
2020/04/12 Python
Django QuerySet查询集原理及代码实例
2020/06/13 Python
python3 中时间戳、时间、日期的转换和加减操作
2020/07/14 Python
python rsa-oaep加密的示例代码
2020/09/23 Python
css3实现垂直下拉动画菜单示例
2014/04/22 HTML / CSS
俄罗斯街头服装品牌:Black Star Wear
2017/03/01 全球购物
2014新年寄语
2014/01/20 职场文书
自愿解除劳动合同协议书
2014/09/11 职场文书
优秀班主任事迹材料
2014/12/16 职场文书
讲文明倡议书
2015/04/29 职场文书
2016年元旦主持词
2015/07/06 职场文书
浅谈@Value和@Bean的执行顺序问题
2021/06/16 Java/Android