js事件机制----捕获与冒泡机制实例分析


Posted in Javascript onMay 22, 2020

本文实例讲述了js事件机制----捕获与冒泡机制。分享给大家供大家参考,具体如下:

先从事件绑定机制说起, 事件绑定机制通过绑定方法addEventListener()实现,

语法格式如下:

element.addEventListener(event, function, useCapture)

参数值

参数 描述
event 必须。字符串,指定事件名。注意: 不要使用 "on" 前缀。 例如,使用 "click" ,而不是使用 "onclick"。 提示: 所有 HTML DOM 事件,可以查看我们完整的 HTML DOM Event 对象参考手册。
function 必须。指定要事件触发时执行的函数。  当事件对象会作为第一个参数传入函数。 事件对象的类型取决于特定的事件。例如, "click" 事件属于 MouseEvent(鼠标事件) 对象。
useCapture 可选。布尔值,指定事件是否在捕获或冒泡阶段执行。 可能值: true - 事件句柄在捕获阶段执行 false- false- 默认。事件句柄在冒泡阶段执行

我们可以看到第三个参数是布尔值, true表示在捕获阶段执行, 而false指在冒泡阶段执行

所以什么是 捕获和冒泡?

捕获(capture)和冒泡(bubble)是事件传播过程中的两个概念, 比如用户单击某个元素, 但由于元素处于父元素内, 该父元素又处于document对象中, document对象又处于window对象中, 因此该单击事件实际发生在该元素, 父元素, document, window对象上, 而事件传播过程就是浏览器决定依次触发哪个对象的事件处理函数的过程.

DOM事件模型将事件传播过程分为两个阶段: 捕获阶段和冒泡阶段

在事件捕获阶段, 事件从最顶级的父元素逐层向内传递,

在冒泡阶段, 事件从事件发生的直接元素 , 逐层向父元素传递

js事件机制----捕获与冒泡机制实例分析

这里举个简单的例子:

点击孙子元素, 给body中的元素都添加点击事件并输出触发事件的对象id:

<!DOCTYPE html>
<html>
<head>
</head>
<body>
 <div id="父级">
 <div id="儿子">
  <div id="孙子" style="width:100px; height:100px; background-color:yellow">
  </div>
 </div>
 </div>
</body>
<script type="text/javascript">
 var a = document.getElementById('父级'),
 b = document.getElementById('儿子'),
 c = document.getElementById('孙子');
 a.addEventListener("click",show, true);
 b.addEventListener("click",show, true);
 c.addEventListener("click",show, true);
 console.log("前3为捕获,后三个为冒泡");
 a.addEventListener("click",show, false);
 b.addEventListener("click",show, false);
 c.addEventListener("click",show, false);
 function show(even){ console.log(this.id); }
</script>
</html>

js事件机制----捕获与冒泡机制实例分析

其中两条孙子输出相同被折叠了, 可以看到前三个是以捕获顺序, 第三个参数为true, 顺序是从父亲到孙子

后三个为false意思是冒泡顺序, 顺序是孙子到父级,即从内到外

实际上捕获和冒泡时最外层和的元素并不是父级div,

捕获时实际上是:

document-->html-->body-->父级div-->儿子div-->孙子div

冒泡时相反, 只不过body及以上没添加事件并输出, 所以在例子中没显现出来

所以用冒泡还是捕获?

对于事件代理来说,在事件捕获或者事件冒泡阶段处理并没有明显的优劣之分,但是由于事件冒泡的事件流模型被所有主流的浏览器兼容,从兼容性角度来说还是建议大家使用事件冒泡模型。

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
javascript数组的扩展实现代码集合
Jun 01 Javascript
不要小看注释掉的JS 引起的安全问题
Dec 27 Javascript
javascript利用初始化数据装配模版的实现代码
Nov 17 Javascript
javascript中input中readonly和disabled区别介绍
Oct 23 Javascript
『jQuery』名称冲突使用noConflict方法解决
Apr 22 Javascript
jquery实现美观的导航菜单鼠标提示特效代码
Sep 06 Javascript
基于jquery步骤进度条源码分享
Nov 12 Javascript
jquery实现页面常用的返回顶部效果
Mar 04 Javascript
Ubuntu 16.04 64位中搭建Node.js开发环境教程
Oct 19 Javascript
关于Function中的bind()示例详解
Dec 02 Javascript
javascript将url解析为json格式的两种方法
Aug 18 Javascript
js的新生代垃圾回收知识点总结
Aug 22 Javascript
JavaScript使用prototype属性实现继承操作示例
May 22 #Javascript
详解如何修改 node_modules 里的文件
May 22 #Javascript
Node.js API详解之 readline模块用法详解
May 22 #Javascript
vue+canvas实现移动端手写签名
May 21 #Javascript
基于canvas实现手写签名(vue)
May 21 #Javascript
jQuery实现移动端笔触canvas电子签名
May 21 #jQuery
js cavans实现静态滚动弹幕
May 21 #Javascript
You might like
php cookie中点号(句号)自动转为下划线问题
2014/10/21 PHP
PHP实现自动识别Restful API的返回内容类型
2015/02/07 PHP
Laravel 5框架学习之向视图传送数据(进阶篇)
2015/04/08 PHP
分享PHP函数实现数字与文字分页代码
2015/07/28 PHP
php页面,mysql数据库转utf-8乱码,utf-8编码问题总结
2015/08/27 PHP
Yii框架创建cronjob定时任务的方法分析
2017/05/23 PHP
JavaScript中this关键字使用方法详解
2007/03/08 Javascript
一个简单的JavaScript 日期计算算法
2009/09/11 Javascript
使用jQuery快速解决input中placeholder值在ie中无法支持的问题
2014/01/02 Javascript
用js控制组织结构图可以任意拖拽到指定位置
2014/01/17 Javascript
基于NodeJS的前后端分离的思考与实践(五)多终端适配
2014/09/26 NodeJs
探讨JavaScript中的Rest参数和参数默认值
2015/07/29 Javascript
关于在mongoose中填充外键的方法详解
2017/08/14 Javascript
jQuery UI实现动画效果代码分享
2018/08/19 jQuery
原生JS实现动态加载js文件并在加载成功后执行回调函数的方法
2020/12/30 Javascript
微信小程序左右滚动公告栏效果代码实例
2019/09/16 Javascript
JavaScript构造函数原理及实现流程解析
2020/11/19 Javascript
[57:12]完美世界DOTA2联赛循环赛 Inki vs Matador BO2第一场 10.31
2020/11/02 DOTA
[48:24]完美世界DOTA2联赛循环赛LBZS vs Forest 第一场 10月30日
2020/10/31 DOTA
Python中协程用法代码详解
2018/02/10 Python
python样条插值的实现代码
2018/12/17 Python
通过PYTHON来实现图像分割详解
2019/06/26 Python
Django项目主urls导入应用中views的红线问题解决
2019/08/10 Python
python matplotlib如何给图中的点加标签
2019/11/14 Python
windows10环境下用anaconda和VScode配置的图文教程
2020/03/30 Python
Pymysql实现往表中插入数据过程解析
2020/06/02 Python
物业保安岗位职责
2014/07/02 职场文书
十佳好少年事迹材料
2014/08/21 职场文书
微笑面对生活演讲稿
2014/09/23 职场文书
个人工作总结范文2014
2014/11/07 职场文书
大学毕业生自我评价
2015/03/02 职场文书
高中团支书竞选稿
2015/11/21 职场文书
社区宣传标语口号
2015/12/26 职场文书
解决mysql问题:由于找不到MSVCR120.dll,无法继续执行代码
2021/06/26 MySQL
redis缓存存储Session原理机制
2021/11/20 Redis
python中 .npy文件的读写操作实例
2022/04/14 Python