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 相关文章推荐
提高网站信任度的技巧
Oct 17 Javascript
几个有趣的Javascript Hack
Jul 24 Javascript
js两行代码按指定格式输出日期时间
Oct 21 Javascript
JavaScript执行效率与性能提升方案
Dec 21 Javascript
jQuery表单域选择器用法分析
Feb 10 Javascript
jQuery内容折叠效果插件用法实例分析(附demo源码)
Apr 28 Javascript
node.js express安装及示例网站搭建方法(分享)
Aug 22 Javascript
javascript设计模式之模块模式学习笔记
Feb 15 Javascript
详解Vue2 无限级分类(添加,删除,修改)
Mar 07 Javascript
微信小程序开发之选项卡(窗口底部TabBar)页面切换
Apr 12 Javascript
JS库之Waypoints的用法详解
Sep 13 Javascript
Vue鼠标滚轮滚动切换路由效果的实现方法
Aug 04 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
php addslashes及其他清除空格的方法是不安全的
2012/01/25 PHP
php遍历数组的方法分享
2012/03/22 PHP
php文件服务实现虚拟挂载其他目录示例
2014/04/17 PHP
thinkphp制作404跳转页的简单实现方法
2016/09/22 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
2018/02/08 PHP
laravel5 Eloquent 实现事务方式
2019/10/21 PHP
JQuery右键菜单插件ContextMenu使用指南
2014/12/19 Javascript
JavaScript实现的双向跨域插件分享
2015/01/31 Javascript
jQuery实现返回顶部功能
2016/02/23 Javascript
jquery对象访问是什么及使用方法介绍
2016/05/03 Javascript
利用BootStrap弹出二级对话框的简单实现方法
2016/09/21 Javascript
为Jquery EasyUI 组件加上清除功能的方法(详解)
2017/04/13 jQuery
javascript中UMD规范的代码推演
2018/08/29 Javascript
解决vue+elementui项目打包后样式变化问题
2020/08/03 Javascript
[48:23]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#1COL VS EG第一局
2016/03/05 DOTA
Python实现抓取城市的PM2.5浓度和排名
2015/03/19 Python
python动态性强类型用法实例
2015/05/09 Python
在Python的Django框架中获取单个对象数据的简单方法
2015/07/17 Python
python解决Fedora解压zip时中文乱码的方法
2016/09/18 Python
Python面向对象之继承和组合用法实例分析
2018/08/27 Python
pip安装python库的方法总结
2019/08/02 Python
Python使用itchat 功能分析微信好友性别和位置
2019/08/05 Python
python 一篇文章搞懂装饰器所有用法(建议收藏)
2019/08/23 Python
python实现一个函数版的名片管理系统过程解析
2019/08/27 Python
Django密码存储策略分析
2020/01/09 Python
Python接口自动化系列之unittest结合ddt的使用教程详解
2021/02/23 Python
css3实例教程 一款纯css3实现的环形导航菜单
2014/10/20 HTML / CSS
香港永安旅游网:Wing On Travel
2017/04/10 全球购物
英文版餐饮运营管理求职信
2013/11/06 职场文书
关于幼儿的自我评价
2013/12/18 职场文书
党员干部反四风民主生活会对照检查材料思想汇报
2014/10/12 职场文书
全国爱牙日活动总结
2015/02/05 职场文书
毕业生爱心捐书倡议书
2015/04/27 职场文书
超详细Python解释器新手安装教程
2021/05/10 Python
MySQL数据库配置信息查看与修改方法详解
2022/06/25 MySQL
win11开机发生死循环重启怎么办?win11开机发生死循环重启解决方法
2022/08/05 数码科技