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 相关文章推荐
12个非常有创意的JavaScript小游戏
Mar 18 Javascript
jquery 单引号和双引号的区别及使用注意
Jul 31 Javascript
javascript去除字符串中所有标点符号和提取纯文本的正则
Jun 07 Javascript
JQuery的ON()方法支持的所有事件罗列
Feb 28 Javascript
jQuery实现自定义右键菜单的树状菜单效果
Sep 02 Javascript
js格式化时间的方法
Dec 18 Javascript
vue实现个人信息查看和密码修改功能
May 06 Javascript
详解vue项目中调用百度地图API使用方法
Apr 25 Javascript
express框架下使用session的方法
Jul 31 Javascript
Vue通过WebSocket建立长连接的实现代码
Nov 05 Javascript
javascript 使用sleep函数的常见方法详解
Apr 26 Javascript
Vue 的双向绑定原理与用法揭秘
May 06 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
5种PHP创建数组的实例代码分享
2014/01/17 PHP
php+ajax实现无刷新分页的方法
2014/11/04 PHP
实例讲解PHP表单验证功能
2019/02/15 PHP
THINKPHP5分页数据对象处理过程解析
2020/10/28 PHP
{}与function(){}选用空对象{}来存放keyValue
2012/05/23 Javascript
js实现的倒计时按钮实例
2015/06/24 Javascript
基于js实现投票的实例代码
2015/08/04 Javascript
JavaScript中this详解
2015/09/01 Javascript
基于JavaScript实现弹出框效果
2016/02/19 Javascript
js 判断各种数据类型的简单方法(推荐)
2016/08/29 Javascript
js Canvas绘制圆形时钟效果
2017/02/17 Javascript
Angular模板表单校验方法详解
2017/08/11 Javascript
JavaScript基础进阶之数组方法总结(推荐)
2017/09/04 Javascript
JS实现去除数组中重复json的方法示例
2017/12/21 Javascript
微信小程序实现渐入渐出动画效果
2019/06/13 Javascript
基于Node.js的大文件分片上传示例
2019/06/19 Javascript
java实现单链表增删改查的实例代码详解
2019/08/30 Javascript
js实现拾色器插件(ColorPicker)
2020/05/21 Javascript
python2.7删除文件夹和删除文件代码实例
2013/12/18 Python
python获取当前计算机cpu数量的方法
2015/04/18 Python
python编写爬虫小程序
2015/05/14 Python
Python删除windows垃圾文件的方法
2015/07/14 Python
Python3字符串学习教程
2015/08/20 Python
Python 统计字数的思路详解
2018/05/08 Python
python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例
2020/02/28 Python
俄罗斯皮肤健康中心:Pharmacosmetica.ru
2020/02/22 全球购物
Java工程师面试集锦之Spring框架
2013/06/16 面试题
求职信的要素有哪些呢
2013/12/26 职场文书
企业厂务公开实施方案
2014/03/26 职场文书
延安红色之旅心得体会
2014/10/07 职场文书
2014流动人口计划生育工作总结
2014/12/20 职场文书
社会治安综合治理责任书
2015/01/29 职场文书
导游词之金鞭溪风景区
2019/09/12 职场文书
python中的class_static的@classmethod的巧妙用法
2021/06/22 Python
用Python实现屏幕截图详解
2022/01/22 Python
JavaScript事件的委托(代理)的用法示例详解
2022/02/18 Javascript