addEventListener()第三个参数useCapture (Boolean)详细解析

 更新时间:2013年11月07日 08:55:55   作者:  
true的触发顺序总是在false之前;如果多个均为true,则外层的触发先于内层;如果多个均为false,则内层的触发先于外层

举例

<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,则内层的触发先于外层。

相关文章

  • onkeyup,onkeydown和onkeypress的区别介绍

    onkeyup,onkeydown和onkeypress的区别介绍

    三者在事件的响应上还有一点不同,就是onkeydown 、onkeypress事件响应的时候输入的字符并没有被系统接受,而响应onkeyup的时候,输入流已经被系统接受
    2013-10-10
  • JS数组(Array)处理函数整理

    JS数组(Array)处理函数整理

    这篇文章主要整理了一下JS数组(Array)处理函数,常用的都汇总了一下,推荐给大家。
    2014-12-12
  • 浅谈javascript中new操作符的原理

    浅谈javascript中new操作符的原理

    下面小编就为大家带来一篇浅谈javascript中new操作符的原理。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • js Date概念详细介绍

    js Date概念详细介绍

    Date 对象用于处理日期和时间,Date对象会自动把当前日期和时间保存为其初始值,本文整理了一些,喜欢的朋友可以收藏下
    2013-11-11
  • Javascript模块化编程(一)模块的写法最佳实践

    Javascript模块化编程(一)模块的写法最佳实践

    Javascript模块化编程,已经成为一个迫切的需求。理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块但是,Javascript不是一种模块化编程语言,它不支持类class,更遑论模块module了
    2013-01-01
  • 从数据结构分析看:用for each...in 比 for...in 要快些

    从数据结构分析看:用for each...in 比 for...in 要快些

    本篇文章小编将为大家介绍,从数据结构分析看:用for each...in 比 for...in 要快些。需要的朋友可以参考一下
    2013-04-04
  • js中Object.create实例用法详解

    js中Object.create实例用法详解

    在本篇文章里小编给大家整理的是一篇关于js中Object.create实例用法及相关基础内容,有兴趣的朋友们可以学习下。
    2021-10-10
  • javascript操作css属性

    javascript操作css属性

    今天因需要用到js获取css属性,网上搜了半天都不合适的。有一下几种方法
    2013-12-12
  • 深入探讨JavaScript String对象

    深入探讨JavaScript String对象

    本文向大家详细的介绍了javascript中的String对象的简介、定义方式、实例属性和实例方法,非常的细致全面,这里推荐给大家,希望对大家能够有所帮助。
    2015-03-03

最新评论