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:Div层拖动效果实例代码
Aug 06 Javascript
动态加载jquery库的方法
Feb 12 Javascript
js实现获取焦点后光标在字符串后
Sep 17 Javascript
12306 刷票脚本及稳固刷票脚本(防挂)
Jan 04 Javascript
Bootstrap表单简单实现代码
Mar 06 Javascript
vue-router 中router-view不能渲染的解决方法
May 23 Javascript
webpack进阶——缓存与独立打包的用法
Aug 02 Javascript
封装运动框架实战左右与上下滑动的焦点轮播图(实例)
Oct 17 Javascript
详解vscode中vue代码颜色插件
Oct 11 Javascript
详解在Node.js中发起HTTP请求的5种方法
Jan 10 Javascript
基于vue-cli搭建多模块且各模块独立打包的项目
Jun 12 Javascript
详解element-ui 表单校验 Rules 配置 常用黑科技
Jul 11 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
很温暖很温暖的Lester Young
2021/03/03 冲泡冲煮
PHP以及MYSQL日期比较方法
2012/11/29 PHP
php中的curl_multi系列函数使用例子
2014/07/29 PHP
php解析json数据实例
2014/08/19 PHP
PHP6新特性分析
2016/03/03 PHP
浅谈PHP表单提交(POST&amp;GET&amp;URL编/解码)
2017/04/03 PHP
showModalDialog 和 showModelessDialog
2007/01/22 Javascript
JavaScript Event学习第十一章 按键的检测
2010/02/10 Javascript
[原创]js获取数组任意个不重复的随机数组元素
2010/03/15 Javascript
js调用打印机打印网页字体总是缩小一号的解决方法
2014/01/24 Javascript
JQuery调用WebServices的方法和4个实例
2014/05/06 Javascript
Node.js中创建和管理外部进程详解
2014/08/16 Javascript
JavaScript学习笔记之内置对象
2015/01/22 Javascript
jQuery中 attr() 方法使用小结
2015/05/03 Javascript
JavaScript获取URL汇总
2015/06/08 Javascript
基于jquery animate操作css样式属性小结
2015/11/27 Javascript
用jQuery实现优酷首页轮播图
2017/01/09 Javascript
jquery将标签元素的高设为屏幕的百分比
2017/04/19 jQuery
ES6学习教程之Map的常用方法总结
2017/08/03 Javascript
Echarts基本用法_动力节点Java学院整理
2017/08/11 Javascript
让Vue也可以使用Redux的方法
2018/05/23 Javascript
基于vue实现移动端圆形旋钮插件效果
2018/11/28 Javascript
jQuery实现的五星点评功能【案例】
2019/02/18 jQuery
js this 绑定机制深入详解
2020/04/30 Javascript
ssm+vue前后端分离框架整合实现(附源码)
2020/07/08 Javascript
如何利用 JS 脚本实现网页全自动秒杀抢购功能
2020/10/12 Javascript
python批量修改图片后缀的方法(png到jpg)
2018/10/25 Python
对pytorch网络层结构的数组化详解
2018/12/08 Python
PyQt5多线程刷新界面防假死示例
2019/12/13 Python
解决python中import文件夹下面py文件报错问题
2020/06/01 Python
Django Model层F,Q对象和聚合函数原理解析
2020/11/12 Python
Love, Bonito国际官网:新加坡女装品牌
2021/03/13 全球购物
remote接口和home接口主要作用
2013/05/15 面试题
省级青年文明号申报材料
2014/05/23 职场文书
天河观后感
2015/06/11 职场文书
Ruby处理YAML和json数据
2022/04/18 Ruby