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 相关文章推荐
在你的网页中嵌入外部网页的方法
Apr 02 Javascript
javascript import css实例代码
Jul 18 Javascript
jquery分页插件AmSetPager(自写)
Apr 15 Javascript
常见表单重复提交问题整理及解决方法
Nov 13 Javascript
三种AngularJS中获取数据源的方式
Feb 02 Javascript
js实现精确到秒的倒计时效果
May 29 Javascript
WEB 前端开发中防治重复提交的实现方法
Oct 26 Javascript
vue mounted 调用两次的完美解决办法
Oct 29 Javascript
Vux+Axios拦截器增加loading的问题及实现方法
Nov 08 Javascript
JavaScript模板引擎应用场景及实现原理详解
Dec 14 Javascript
vue-resourc发起异步请求的方法
Feb 11 Javascript
详解Vue 单文件组件的三种写法
Feb 19 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
上海无线电三厂简史修改版
2021/03/01 无线电
php面向对象值单例模式
2016/05/03 PHP
PHP实现自动识别原编码并对字符串进行编码转换的方法
2016/07/13 PHP
ThinkPHP+EasyUI之ComboTree中的会计科目树形菜单实现方法
2017/06/09 PHP
jQueryUI如何自定义组件实现代码
2010/11/14 Javascript
使用jQuery实现的网页版的个人简历(可换肤)
2013/04/19 Javascript
21个JavaScript事件(Events)属性汇总
2014/12/02 Javascript
JavaScript 开发工具webstrom使用指南
2014/12/09 Javascript
Javascript定义类(class)的三种方法详解
2015/03/13 Javascript
javascript中Math.random()使用详解
2015/04/15 Javascript
详解JavaScript正则表达式中的global属性的使用
2015/06/16 Javascript
jquery带有索引按钮且自动轮播切换特效代码分享
2015/09/15 Javascript
jQuery插件datatables使用教程
2016/04/21 Javascript
JS中如何比较两个Json对象是否相等实例代码
2016/07/13 Javascript
angular.js+node.js实现下载图片处理详解
2017/03/31 Javascript
深究AngularJS如何获取input的焦点(自定义指令)
2017/06/12 Javascript
iview tabs 顶部导航栏和模块切换栏的示例代码
2019/03/04 Javascript
将RGB值转换为灰度值的简单算法
2019/10/09 Javascript
vue项目从node8.x升级到12.x后的问题解决
2019/10/25 Javascript
vue 限制input只能输入正数的操作
2020/08/05 Javascript
python使用MySQLdb访问mysql数据库的方法
2015/08/03 Python
Pycharm代码无法复制,无法选中删除,无法编辑的解决方法
2018/10/22 Python
详解python中@的用法
2019/03/27 Python
Django如何自定义model创建数据库索引的顺序
2019/06/20 Python
Python动态强类型解释型语言原理解析
2020/03/25 Python
python3 中使用urllib问题以及urllib详解
2020/08/03 Python
微信浏览器左上角返回按钮拦截功能
2017/11/21 HTML / CSS
HTML5语音识别标签写法附图
2013/11/18 HTML / CSS
两道JAVA笔试题
2016/09/14 面试题
企业管理专业个人求职信范文
2013/09/24 职场文书
一年级学生评语大全
2014/04/21 职场文书
建筑横幅标语
2014/10/09 职场文书
2014年稽查工作总结
2014/12/20 职场文书
辞职信格式范文
2015/05/13 职场文书
民政局2016年“六一”儿童节慰问活动总结
2016/04/06 职场文书
Requests什么的通通爬不了的Python超强反爬虫方案!
2021/05/20 Python