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 相关文章推荐
去除链接虚线全面分析总结
Aug 15 Javascript
asp.net+js 实现无刷新上传解析csv文件的代码
May 17 Javascript
Javascript学习笔记之函数篇(六) : 作用域与命名空间
Nov 23 Javascript
js实现文字垂直滚动和鼠标悬停效果
Dec 31 Javascript
JavaScript中style.left与offsetLeft的使用及区别详解
Jun 08 Javascript
JavaScript学习小结之被嫌弃的eval函数和with语句实例详解
Aug 01 Javascript
Actionscript与javascript交互实例程序(修改)
Sep 22 Javascript
微信小程序 省市区选择器实例详解(附源码下载)
Jan 05 Javascript
JS简单判断滚动条的滚动方向实现方法
Apr 28 Javascript
node文件上传功能简易实现代码
Jun 16 Javascript
10个最受欢迎的 JavaScript框架(推荐)
Apr 24 Javascript
使用Typescript开发微信小程序的步骤详解
Jan 12 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
Yii分页用法实例详解
2014/12/04 PHP
Yii2搭建后台并实现rbac权限控制完整实例教程
2016/04/28 PHP
javascript Window及document对象详细整理
2011/01/12 Javascript
js中return false(阻止)的用法
2013/08/14 Javascript
JavaScript代码简单实现求杨辉三角给定行的最大值
2013/10/29 Javascript
js判断字符是否是汉字的两种方法小结
2014/01/03 Javascript
jQuery基于扩展实现的倒计时效果
2016/05/14 Javascript
JavaScript 中的 this 简单规则
2017/09/19 Javascript
JS实现判断图片是否加载完成的方法分析
2018/07/31 Javascript
基于JS开发微信网页录音功能的实例代码
2019/04/30 Javascript
ES6的解构赋值实例详解
2019/05/06 Javascript
express框架下使用session的方法
2019/07/31 Javascript
JavaScript交换两个变量方法实例
2019/11/25 Javascript
JS代码检查工具ESLint介绍与使用方法
2020/02/04 Javascript
vue微信分享插件使用方法详解
2020/02/18 Javascript
js实现拖拽元素选择和删除
2020/08/25 Javascript
[01:19:33]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第一场 2月2日
2021/03/11 DOTA
Python操作列表的常用方法分享
2014/02/13 Python
使用Python的Dataframe取两列时间值相差一年的所有行方法
2018/07/10 Python
浅谈django rest jwt vue 跨域问题
2018/10/26 Python
python将list转为matrix的方法
2018/12/12 Python
详解python中eval函数的作用
2019/10/22 Python
Tensorflow实现在训练好的模型上进行测试
2020/01/20 Python
让IE9以下版本的浏览器兼容HTML5的方法
2014/03/12 HTML / CSS
美国波道夫·古德曼百货官网:Bergdorf Goodman
2017/11/07 全球购物
会计专业个人求职信范文
2014/01/08 职场文书
批评与自我批评材料
2014/02/15 职场文书
幼儿发展评估方案
2014/06/11 职场文书
节约用电倡议书
2015/04/28 职场文书
学校教学管理制度
2015/08/06 职场文书
高中班主任培训心得体会
2016/01/07 职场文书
2016年最美孝心少年事迹材料
2016/02/26 职场文书
大学迎新生的欢迎词
2019/06/25 职场文书
Python网络编程之ZeroMQ知识总结
2021/04/25 Python
node快速搭建后台的实现步骤
2022/02/18 NodeJs
【海涛教你打dota】体验一超神发条:咱是抢盾专业户
2022/04/01 DOTA