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 相关文章推荐
鼠标移动到一张图片时变为另一张图片
Dec 05 Javascript
JavaScript 高级篇之闭包、模拟类,继承(五)
Apr 07 Javascript
jQuery中parents()和parent()的区别分析
Oct 28 Javascript
SuperSlide标签切换、焦点图多种组合插件
Mar 14 Javascript
jquery预加载图片的方法
May 27 Javascript
javascript实现鼠标移到Image上方时显示文字效果的方法
Aug 07 Javascript
Angularjs 制作购物车功能实例代码
Sep 14 Javascript
简单实现jquery焦点图
Dec 12 Javascript
微信小程序 在线支付功能的实现
Mar 14 Javascript
element-ui组件table实现自定义筛选功能的示例代码
Mar 15 Javascript
vue指令之表单控件绑定v-model v-model与v-bind结合使用
Apr 17 Javascript
Vue实现计算器计算效果
Aug 17 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
默默简单的写了一个模板引擎
2007/01/02 PHP
PHP--用万网的接口实现域名查询功能
2012/12/13 PHP
PHP的PDO常用类库实例分析
2016/04/07 PHP
JavaScript RegExp方法获取地址栏参数(面向对象)
2009/03/10 Javascript
jQuery 相关控件的事件操作分解
2009/08/03 Javascript
起点页面传值js,有空研究学习下
2010/01/25 Javascript
jquery 选择器引擎sizzle浅析
2013/02/06 Javascript
javascript模拟map输出与去除重复项的方法
2015/02/09 Javascript
JS动态创建DOM元素的方法
2015/06/09 Javascript
jQuery 选择器(61种)整理总结
2016/09/26 Javascript
利用jQuery插件imgAreaSelect实现图片上传裁剪(同步显示图像位置信息)
2016/12/02 Javascript
vue实现ajax滚动下拉加载,同时具有loading效果(推荐)
2017/01/11 Javascript
javascript常用的设计模式
2017/02/09 Javascript
jQuery表格(Table)基本操作实例分析
2017/03/10 Javascript
JS获取子、父、兄节点方法小结
2017/08/14 Javascript
vue+element实现批量删除功能的示例
2018/02/28 Javascript
解决vue单页路由跳转后scrollTop的问题
2018/09/03 Javascript
使用rollup打包JS的方法步骤
2018/12/05 Javascript
jquery实现商品sku多属性选择功能(商品详情页)
2019/12/20 jQuery
VueCli4项目配置反向代理proxy的方法步骤
2020/05/17 Javascript
python 中的list和array的不同之处及转换问题
2018/03/13 Python
Python实现重建二叉树的三种方法详解
2018/06/23 Python
在ubuntu16.04中将python3设置为默认的命令写法
2018/10/31 Python
Python Unittest根据不同测试环境跳过用例的方法
2018/12/16 Python
python tkinter图形界面代码统计工具
2019/09/18 Python
python3中rank函数的用法
2019/11/27 Python
python颜色随机生成器的实例代码
2020/01/10 Python
Python打印特殊符号及对应编码解析
2020/05/07 Python
详解python tkinter包获取本地绝对路径(以获取图片并展示)
2020/09/04 Python
python 多进程和协程配合使用写入数据
2020/10/30 Python
H5最强接口之canvas实现动态图形功能
2019/05/31 HTML / CSS
日本高端护肤品牌:Tatcha
2016/08/29 全球购物
来自圣地亚哥的实惠太阳镜:Knockaround
2018/08/27 全球购物
经管应届生求职信范文
2014/05/18 职场文书
化妆品活动策划方案
2014/05/23 职场文书
公司领导班子对照检查存在问题整改措施
2014/10/02 职场文书