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 setTimeout()传递函数参数(包括传递对象参数)
Apr 07 Javascript
Node.js和PHP根据ip获取地理位置的方法
Mar 14 Javascript
用JavaScript实现用一个DIV来包装文本元素节点
Sep 09 Javascript
js判断浏览器版本以及浏览器内核的方法
Jan 20 Javascript
利用JavaScript的AngularJS库制作电子名片的方法
Jun 18 Javascript
纯js代码生成可搜索选择下拉列表的实例
Jan 11 Javascript
jquery判断滚动条距离顶部的距离方法
Sep 05 jQuery
require.js 加载过程与使用方法介绍
Oct 30 Javascript
详解基于webpack&amp;gettext的前端多语言方案
Jan 29 Javascript
Vue使用watch监听一个对象中的属性的实现方法
May 10 Javascript
vue使用video.js进行视频播放功能
Jul 18 Javascript
如何在Node和浏览器控制台中打印彩色文字
Jan 09 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
php使用iconv中文截断问题的解决方法
2015/02/11 PHP
PHP SPL标准库之数据结构栈(SplStack)介绍
2015/05/12 PHP
PHP数组函数知识汇总
2016/05/12 PHP
PHP使用PDO实现mysql防注入功能详解
2019/12/20 PHP
JavaScript实现统计文本框Textarea字数增强用户体验
2012/12/21 Javascript
JQueryEasyUI datagrid框架的进阶使用
2013/04/08 Javascript
js清除input中type等于file的值域(示例代码)
2013/12/24 Javascript
移动节点的jquery代码
2014/01/13 Javascript
基于javascript实现彩票随机数生成(简单版)
2020/04/17 Javascript
详解AngularJS过滤器的使用
2016/03/11 Javascript
JavaScript实现翻页功能(附效果图)
2017/02/16 Javascript
扩展bootstrap的modal模态框-动态添加modal框-弹出多个modal框
2017/02/21 Javascript
JS得到当前时间的方法示例
2017/03/24 Javascript
JS实现的加减乘除四则运算计算器示例
2017/08/09 Javascript
详解如何用babel转换es6的class语法
2018/04/03 Javascript
解决layer.msg 不居中 ifram中的问题
2019/09/05 Javascript
webpack 动态批量加载文件的实现方法
2020/03/19 Javascript
Python利用turtle库绘制彩虹代码示例
2017/12/20 Python
Python内置模块ConfigParser实现配置读写功能的方法
2018/02/12 Python
python爬取各类文档方法归类汇总
2018/03/22 Python
Python打开文件,将list、numpy数组内容写入txt文件中的方法
2018/10/26 Python
Python 判断奇数偶数的方法
2018/12/20 Python
python Dijkstra算法实现最短路径问题的方法
2019/09/19 Python
Python开发之身份证验证库id_validator验证身份证号合法性及根据身份证号返回住址年龄等信息
2020/03/20 Python
教你如何用python操作摄像头以及对视频流的处理
2020/10/12 Python
CSS实现定位元素居中的方法
2015/06/23 HTML / CSS
美国高档帽子网上商店:Hats.com
2018/08/09 全球购物
工艺工程师岗位职责
2014/03/04 职场文书
学校三八妇女节活动情况总结
2014/03/09 职场文书
市委常委会班子党的群众路线教育实践活动整改方案
2014/10/25 职场文书
大足石刻导游词
2015/02/02 职场文书
风雨哈佛路观后感
2015/06/03 职场文书
博物馆观后感
2015/06/05 职场文书
中秋节主题班会
2015/08/14 职场文书
几款流行的HTML5 UI框架比较(小结)
2021/04/08 HTML / CSS
mysql sock文件存储了什么信息
2022/07/15 MySQL