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 null,undefined,字符串小结
Aug 21 Javascript
JavaScript高级程序设计阅读笔记(五) ECMAScript中的运算符(一)
Feb 27 Javascript
两种方法实现文本框输入内容提示消失
Mar 17 Javascript
JS 去除Array中的null值示例代码
Nov 20 Javascript
js快速排序的实现代码
Dec 08 Javascript
node.js中的fs.mkdir方法使用说明
Dec 17 Javascript
javascript作用域链(Scope Chain)用法实例解析
Nov 30 Javascript
bootstrap fileinput完整实例分享
Nov 08 Javascript
详解vue父子模版嵌套案例
Mar 04 Javascript
vue中子组件调用兄弟组件方法
Jul 06 Javascript
JavaScript队列结构Queue实现过程解析
Mar 07 Javascript
Python版实现微信公众号扫码登陆
May 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
PHP数组去重的更快实现方式分析
2018/05/09 PHP
实例讲解PHP表单
2020/06/10 PHP
谷歌浏览器 insertCell与appendChild的区别
2009/02/12 Javascript
JQuery下拉框应用示例介绍
2014/04/23 Javascript
jquery如何扑捉回车键触发的事件
2014/04/24 Javascript
js使用cookie记录用户名的方法
2015/11/26 Javascript
使用jQuery或者原生js实现鼠标滚动加载页面新数据
2016/03/06 Javascript
Bootstrap php制作动态分页标签
2016/12/23 Javascript
Vue.js实现输入框绑定的实例代码
2017/08/24 Javascript
vue组件父子间通信详解(三)
2017/11/07 Javascript
JavaScript中set与get方法用法示例
2018/08/15 Javascript
小程序云开发如何实现图片上传及发表文字
2019/05/17 Javascript
Vue项目实现简单的权限控制管理功能
2019/07/17 Javascript
jQuery轮播图功能制作方法详解
2019/12/03 jQuery
JS组件库AlloyTouch实现图片轮播过程解析
2020/05/29 Javascript
Python2.x和3.x下maketrans与translate函数使用上的不同
2015/04/13 Python
Python开发如何在ubuntu 15.10 上配置vim
2016/01/25 Python
对python中UDP,socket的使用详解
2019/08/22 Python
Python3.5 win10环境下导入kera/tensorflow报错的解决方法
2019/12/19 Python
解决运行django程序出错问题 'str'object has no attribute'_meta'
2020/07/15 Python
django中ImageField的使用详解
2020/12/21 Python
浅析HTML5:'data-'属性的作用
2018/01/23 HTML / CSS
中国医药集团国药在线:国药网
2017/02/06 全球购物
美国玩具公司:U.S.Toy
2018/05/19 全球购物
PHP面试题大全
2015/10/16 面试题
值类型与引用类型有什么不同?请举例说明?并分别列举几种相应的数据类型
2015/10/24 面试题
护理毕业生自我鉴定
2014/02/11 职场文书
学习雷锋活动总结
2014/04/29 职场文书
青奥会口号
2014/06/12 职场文书
精神文明建设标语
2014/06/16 职场文书
见习报告的格式
2014/11/04 职场文书
2016年优秀党务工作者先进事迹材料
2016/02/29 职场文书
爱国之歌(8首)
2019/09/29 职场文书
nginx配置ssl实现https的方法示例
2021/03/31 Servers
Python如何把不同类型数据的json序列化
2021/04/30 Python
SQL Server中T-SQL标识符介绍与无排序生成序号的方法
2022/05/25 SQL Server