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条件判断使用小技巧总结
Sep 08 Javascript
javascript Xml增删改查(IE下)操作实现代码
Jan 30 Javascript
Javascript中的相等与不等运算
Apr 25 Javascript
来自国外的页面JavaScript文件优化
Dec 08 Javascript
JQuery实现点击div以外的位置隐藏该div窗口
Sep 13 Javascript
javaScript如何处理从java后台返回的list
Apr 24 Javascript
js 调用百度地图api并在地图上进行打点添加标注
May 13 Javascript
jQuery实现带滚动线条导航效果的方法
Jan 30 Javascript
JS实现点击事件统计的简单实例
Jul 10 Javascript
JS组件系列之JS组件封装过程详解
Apr 28 Javascript
微信小程序选择图片和放大预览图片功能
Nov 02 Javascript
JS实现电话号码的字母组合算法示例
Feb 26 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
使用eAccelerator加密PHP程序
2008/10/03 PHP
PHP判断是否为空的几个函数对比
2015/04/21 PHP
phpfpm的作用和用法
2019/10/10 PHP
php实现文件上传基本验证
2020/03/04 PHP
JavaScript高级程序设计(第3版)学习笔记6 初识js对象
2012/10/11 Javascript
node.js中的path.delimiter方法使用说明
2014/12/09 Javascript
jQuery实现的数值范围range2dslider选取插件特效多款代码分享
2015/08/27 Javascript
AngularJS中如何使用$parse或$eval在运行时对Scope变量赋值
2016/01/25 Javascript
javascript之Boolean类型对象
2016/06/07 Javascript
jQuery实现的跨容器无缝拖动效果代码
2016/06/21 Javascript
vue组件中的样式属性scoped实例详解
2018/10/30 Javascript
JS实现带阴历的日历功能详解
2019/01/24 Javascript
Vue表单控件绑定图文详解
2019/02/11 Javascript
微信小程序在其他页面监听globalData中值的变化
2019/07/15 Javascript
微信小程序缓存支持二次开发封装实现解析
2019/12/16 Javascript
[01:03:00]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第一局
2016/02/25 DOTA
[01:06:54]DOTA2-DPC中国联赛 正赛 SAG vs DLG BO3 第二场 2月28日
2021/03/11 DOTA
python安装教程 Pycharm安装详细教程
2017/05/02 Python
详解tensorflow实现迁移学习实例
2018/02/10 Python
pip命令无法使用的解决方法
2018/06/12 Python
python 解决动态的定义变量名,并给其赋值的方法(大数据处理)
2018/11/10 Python
python 使用socket传输图片视频等文件的实现方式
2019/08/07 Python
使用python模拟命令行终端的示例
2019/08/13 Python
Python中url标签使用知识点总结
2020/01/16 Python
python实现图像拼接功能
2020/03/23 Python
Python sublime安装及配置过程详解
2020/06/29 Python
Python爬虫UA伪装爬取的实例讲解
2021/02/19 Python
如何在网站上添加谷歌定位信息
2016/04/16 HTML / CSS
介绍Java的内部类
2012/10/27 面试题
财务分析个人的自荐书范文
2013/11/24 职场文书
大学生学年自我鉴定
2014/02/10 职场文书
责任心演讲稿
2014/05/14 职场文书
电力培训心得体会
2014/09/02 职场文书
房屋产权共有协议书范本
2014/11/03 职场文书
入党个人总结范文
2015/03/02 职场文书
Python写情书? 10行代码展示如何把情书写在她的照片里
2022/04/21 Python