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 DataSet数据源处理代码
Mar 29 Javascript
JS动态调用方法名示例介绍
Dec 18 Javascript
jQuery点击自身以外地方关闭弹出层的简单实例
Dec 24 Javascript
jquery统计用户选中的复选框的个数
Jun 06 Javascript
Javascript实现简单的富文本编辑器附演示
Jun 16 Javascript
JavaScript中的值类型详细介绍
Dec 29 Javascript
最简单纯JavaScript实现Tab标签页切换的方式(推荐)
Jul 25 Javascript
Angular组件化管理实现方法分析
Mar 17 Javascript
js实现京东轮播图效果
Jun 30 Javascript
node中koa中间件机制详解
Aug 22 Javascript
使用JS中的Replace()方法遇到的问题小结
Oct 20 Javascript
浅谈Vue static 静态资源路径 和 style问题
Nov 07 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设计模式之简单工厂模式详解
2014/09/04 PHP
微信获取用户地理位置信息的原理与步骤
2015/11/12 PHP
PHP通过文件保存和更新信息的方法分析
2019/09/12 PHP
File文件控件,选中文件(图片,flash,视频)即立即预览显示
2009/04/09 Javascript
Javascript 中的 && 和 || 使用小结
2010/04/25 Javascript
JQuery下的Live方法和$.browser方法使用代码
2010/06/02 Javascript
Javascript中的isNaN函数使用说明
2011/11/10 Javascript
js实现按一下删除键删除整个单词附demo
2014/09/05 Javascript
javascript中parseInt()函数的定义和用法分析
2014/12/20 Javascript
基于JS2Image实现圣诞树代码
2015/12/24 Javascript
ES6的新特性概览
2016/03/10 Javascript
js调用屏幕宽度的简单方法
2016/11/14 Javascript
基于JavaScript实现的希尔排序算法分析
2017/04/14 Javascript
javascript闭包的使用之按钮切换功能
2018/08/30 Javascript
详解vue-cli 脚手架 安装
2019/04/16 Javascript
jQuery实现动态加载(按需加载)javascript文件的方法分析
2019/05/31 jQuery
webpack 如何同时输出压缩和未压缩的文件的实现步骤
2020/06/05 Javascript
python通过邮件服务器端口发送邮件的方法
2015/04/30 Python
python中getaddrinfo()基本用法实例分析
2015/06/28 Python
详解Python在七牛云平台的应用(一)
2017/12/05 Python
pandas.DataFrame.to_json按行转json的方法
2018/06/05 Python
python实现猜拳小游戏
2020/04/05 Python
Django 实现xadmin后台菜单改为中文
2019/11/15 Python
Python3 解决读取中文文件txt编码的问题
2019/12/20 Python
html5清空画布方法(三种)
2017/10/16 HTML / CSS
J2SDK1.5与J2SDK5.0有什么区别
2012/09/19 面试题
音乐学院硕士生的自我评价分享
2013/11/01 职场文书
英语专业毕业生自我鉴定
2013/11/09 职场文书
师范大学毕业自我鉴定
2013/11/21 职场文书
感谢信的格式
2015/01/21 职场文书
出租车拒载检讨书
2015/01/28 职场文书
教师外出学习心得体会
2016/01/18 职场文书
《小摄影师》教学反思
2016/02/18 职场文书
创业计划书之青年旅馆
2019/09/23 职场文书
go语言中切片与内存复制 memcpy 的实现操作
2021/04/27 Golang
python爬取豆瓣电影TOP250数据
2021/05/23 Python