第三个参数(false)在document.addEventListener中指示了什么("deviceready",OnDeviceReady,false);

iJa*_*ade 82 javascript events javascript-events

第三个参数(false)表示什么

document.addEventListener("deviceready",OnDeviceReady,false);
Run Code Online (Sandbox Code Playgroud)

任何人都可以显示示例脚本来显示差异

lon*_*day 313

这是出于历史原因.当浏览器事件系统首次设计时,有两种相互矛盾的方式来建模它的工作方式.它们被称为事件捕获和事件冒泡.

举个例子,这个HTML:

<html>
    <body>
        <a href="#">Content</a>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

如果a元素上发生了一个事件(例如点击),祖先元素是否应该知道?人们普遍认为他们应该这样做.但问题是应该以什么顺序通知他们.微软和Netscape的开发人员(这应该给你相当的想法如何,我们正在谈论历史!)有不同的意见.

一个模型是事件捕获(由Netscape开发人员提倡).这html首先通知了元素并在树下工作:

  • html
  • body
  • a

另一个模型是事件冒泡(由Microsoft开发人员提倡).这首先通知了目标元素,并在树上向上运行:

  • a
  • body
  • html

最终的妥协是它应该做到这两点.

  • html (捕获阶段)
  • body (捕获阶段)
  • a (捕获阶段)
  • a (冒泡阶段)
  • body (鼓泡阶段)
  • html (冒泡阶段)

因此,事件在树上运行,然后再次备份.

这是一个啰嗦的方式addEventListener.addEventListener侦听捕获阶段和冒泡阶段事件.第三个参数(useCapture在规范中调用)允许程序员指定他们想要使用哪个阶段.

在现代浏览器中,默认为false.您可能永远不会遇到想要使用捕获阶段的情况,尤其是因为Internet Explorer仍然不支持它.但旧浏览器需要false明确,因此通常提供向后兼容性.

  • +1优秀的解释,谢谢! (29认同)
  • 哇!谢谢你,谢谢你,谢谢你.即便是MDN也无法解释这一点. (11认同)
  • 这应该是公认的答案,因为有很好的解释! (10认同)
  • IE 9及以上版本现在支持捕获阶段. (3认同)
  • 这就是为什么我偶尔喜欢Stack Overflow的原因。我从来不知道这琐事。由于很多原因,这是一个有用的信息。谢谢。 (3认同)

lif*_*fus 12

它的useCapture:

如果true,useCapture表示用户希望启动捕获.在启动捕获之后,指定类型的所有事件将被分派到已注册,listener然后被分派到EventTargetDOM树中它下面的任何s.向上冒泡树的事件不会触发指定使用捕获的侦听器.有关 详细说明,请参阅DOM Level 3 Events.