addEventListener()第三个参数useCapture (Boolean)详细解析


Posted in Javascript onNovember 07, 2013

举例

<div id="div1">
  <div id="div2">
    <div id="div3">
      <div id="div4">
      </div>
    </div>
  </div>
</div>

如果在 d3 上点击鼠标,事件流是这样的:

捕获阶段 在 div1 处检测是否有 useCapture 为 true 的事件处理程序,若有,则执行该程序,然后再同样地处理 div2。

目标阶段 在 div3 处,发现 div3 就是鼠标点击的节点,所以这里为目标阶段,若有事件处理程序,则执行该程序,这里不论 useCapture 为 true 还是 false。

冒泡阶段 在 div2 处检测是否有 useCapture 为 false 的事件处理程序,若有,则执行该程序,然后再同样地处理 div1。

addEventListener 有三个参数:第一个参数表示事件名称(不含 on,如 "click");第二个参数表示要接收事件处理的函数;第三个参数为 useCapture,本文就讲解它。

<div id="outDiv">
<div id="middleDiv">
    <div id="inDiv">请在此点击鼠标。</div>
</div>
</div>

<div id="info"></div>

var outDiv = document.getElementById("outDiv");
var middleDiv = document.getElementById("middleDiv");
var inDiv = document.getElementById("inDiv");
var info = document.getElementById("info");

outDiv.addEventListener("click", function () { info.innerHTML += "outDiv" + "<br>"; }, false);
middleDiv.addEventListener("click", function () { info.innerHTML += "middleDiv" + "<br>"; }, false);
inDiv.addEventListener("click", function () { info.innerHTML += "inDiv" + "<br>"; }, false);

上述是我们测试的代码,根据 info 的显示来确定触发的顺序,有三个 addEventListener,而 useCapture 可选值为 true 和 false,所以 2*2*2,可以得出 8 段不同的程序。

•全为 false 时,触发顺序为:inDiv、middleDiv、outDiv;

•全为 true 时,触发顺序为:outDiv、middleDiv、inDiv;

•outDiv 为 true,其他为 false 时,触发顺序为:outDiv、inDiv、middleDiv;

•middleDiv 为 true,其他为 false 时,触发顺序为:middleDiv、inDiv、outDiv;

•……

最终得出如下结论:

•true 的触发顺序总是在 false 之前;

•如果多个均为 true,则外层的触发先于内层;

•如果多个均为 false,则内层的触发先于外层。

Javascript 相关文章推荐
《JavaScript DOM 编程艺术》读书笔记之JavaScript 简史
Jan 09 Javascript
JavaScript禁止复制与粘贴的实现代码
May 16 Javascript
vue2.0 根据状态值进行样式的改变展示方法
Mar 13 Javascript
Vue2.0 给Tab标签页和页面切换过渡添加样式的方法
Mar 13 Javascript
JavaScript偏函数与柯里化实例详解
Mar 27 Javascript
JS实现根据详细地址获取经纬度功能示例
Apr 16 Javascript
vue的列表交错过渡实现代码示例
May 05 Javascript
Layui表格行工具事件与数据回填方法
Sep 13 Javascript
javascript实现fetch请求返回的统一拦截
Dec 22 Javascript
JS正则表达式验证密码强度
Mar 18 Javascript
JS JQuery获取data-*属性值方法解析
Sep 01 jQuery
微信小程序APP的生命周期及页面的生命周期
Apr 19 Javascript
zTree插件之单选下拉菜单实例代码
Nov 07 #Javascript
jQuery把表单元素变为json对象
Nov 06 #Javascript
JQuery插件开发示例代码
Nov 06 #Javascript
javascript实现yield的方法
Nov 06 #Javascript
Javascript事件实例详解
Nov 06 #Javascript
zTree插件之多选下拉菜单实例代码
Nov 06 #Javascript
Jquery ajax执行顺序 返回自定义错误信息(实例讲解)
Nov 06 #Javascript
You might like
聊天室php&amp;mysql(一)
2006/10/09 PHP
php上传文件的增强函数
2010/07/21 PHP
PHP使用curl模拟post上传及接收文件的方法
2016/03/04 PHP
php+ajax实现带进度条的上传图片功能【附demo源码下载】
2016/09/14 PHP
node.js chat程序如何实现Ajax long-polling长链接刷新模式
2012/03/13 Javascript
Three.js源码阅读笔记(光照部分)
2012/12/27 Javascript
基于jQuery中对数组进行操作的方法
2013/04/16 Javascript
DOM节点删除函数removeChild()用法实例
2015/01/12 Javascript
jquery form表单获取内容以及绑定数据
2016/02/24 Javascript
JavaScript学习小结之被嫌弃的eval函数和with语句实例详解
2016/08/01 Javascript
Vue数据驱动模拟实现4
2017/01/12 Javascript
浅谈es6语法 (Proxy和Reflect的对比)
2017/10/24 Javascript
vue解决弹出蒙层滑动穿透问题的方法
2018/09/22 Javascript
vue+webpack中配置ESLint
2018/11/07 Javascript
layui2.0使用table+laypage实现真分页
2019/07/27 Javascript
使用vue编写h5公众号跳转小程序的实现代码
2020/11/27 Vue.js
使用AutoJs实现微信抢红包的代码
2020/12/31 Javascript
[52:00]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 LGD vs Optic
2018/04/02 DOTA
[44:30]完美世界DOTA2联赛PWL S2 GXR vs Magma 第一场 11.25
2020/11/26 DOTA
python实现人人网登录示例分享
2014/01/19 Python
分析Python中解析构建数据知识
2018/01/20 Python
Django后台获取前端post上传的文件方法
2018/05/28 Python
python批量赋值操作实例
2018/10/22 Python
python bluetooth蓝牙信息获取蓝牙设备类型的方法
2019/11/29 Python
详解Python在使用JSON时需要注意的编码问题
2019/12/06 Python
torch 中各种图像格式转换的实现方法
2019/12/26 Python
Ref与out有什么不同
2012/11/24 面试题
Java基础面试题
2012/11/02 面试题
我们的节日端午节活动方案
2014/03/02 职场文书
安康杯竞赛活动总结
2014/05/05 职场文书
班级学习雷锋活动总结
2014/07/04 职场文书
人力资源管理毕业求职信
2014/08/05 职场文书
教师查摆问题自查报告
2014/10/11 职场文书
《分数乘法》教学反思
2016/02/24 职场文书
少儿励志名言(80句)
2019/08/14 职场文书
mysql字段为NULL索引是否会失效实例详解
2022/05/30 MySQL