我读过https://developer.mozilla.org/en/DOM/element.addEventListener上的文章,但无法理解useCapture属性。定义如下:

如果为true, useCapture表示用户希望发起捕获。在启动捕获之后,指定类型的所有事件将被分派到已注册侦听器,然后再分派到DOM树中它下面的任何EventTargets。在树中向上冒泡的事件不会触发指定使用capture的侦听器。

在这段代码中,父事件在子事件之前触发,所以我无法理解它 的行为。文档对象的usecapcapture设置为true,子div的usecapcapture设置为false,文档usecapcapture紧随其后。为什么document property优先于child。

函数load() { 文档。addEventListener("click", function() { 警报(“父事件”); },真正的); . getelementbyid(“div1”)。addEventListener("click", function() { 警报(“孩子事件”); },假); } <身体onload = " load ()" > <div id="div1">点击我</div> 身体< / >


当前回答

给定事件传递的三个阶段:

捕获阶段:事件被分派到目标的祖先,从树的根到目标的直接父 节点。 目标阶段:事件被分派到目标节点。 冒泡阶段:将事件从目标节点的直接父节点分派到目标节点的根节点 树。

useCapture指示事件旅行将在哪个阶段:

如果为true, useCapture表示用户希望添加事件 监听器仅用于捕获阶段,即此事件监听器不会 在目标和冒泡阶段触发。如果为false,则 事件监听器只会在目标和冒泡期间被触发 阶段

来源与第二个最佳答案相同:https://www.w3.org/TR/2003/NOTE-DOM-Level-3-Events-20031107/events.html#Events-phases

其他回答

事件可以在两种情况下被激活:在开始(“捕获”)和在结束(“气泡”)。 事件按照它们的定义顺序执行。比如,你定义了4个事件监听器:

窗口。addEventListener("点击",function(){console.log(1)}, false); 窗口。addEventListener("点击",function(){console.log(2)}, true); 窗口。addEventListener("点击",function(){console.log(3)}, false); 窗口。addEventListener("点击",function(){console.log(4)}, true);

日志消息将按以下顺序显示:

2(首先定义,使用capture=true) 4(使用capture=true定义秒) 1(第一个定义的事件与capture=false) 3(捕获的第二个定义事件=false)

都是关于事件模型的:http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-flow 您可以在冒泡阶段或捕获阶段捕获事件。你的选择。 看看http://www.quirksmode.org/js/events_order.html,你会发现它非常有用。

当你说useCapture = true时,事件在捕获阶段从上到下执行,当为false时,它会从下到上进行冒泡。

给定事件传递的三个阶段:

捕获阶段:事件被分派到目标的祖先,从树的根到目标的直接父 节点。 目标阶段:事件被分派到目标节点。 冒泡阶段:将事件从目标节点的直接父节点分派到目标节点的根节点 树。

useCapture指示事件旅行将在哪个阶段:

如果为true, useCapture表示用户希望添加事件 监听器仅用于捕获阶段,即此事件监听器不会 在目标和冒泡阶段触发。如果为false,则 事件监听器只会在目标和冒泡期间被触发 阶段

来源与第二个最佳答案相同:https://www.w3.org/TR/2003/NOTE-DOM-Level-3-Events-20031107/events.html#Events-phases

简介:

DOM规范描述如下:

https://www.w3.org/TR/2003/NOTE-DOM-Level-3-Events-20031107/events.html#Events-phases

工作方式如下:

事件按照从树的根(文档)到目标节点的路径分派。目标节点是最深的HTML元素,即event.target。事件分派(也称为事件传播)发生在三个阶段,顺序如下:

捕获阶段:将事件从树(文档)的根分发到目标节点的直接父节点。 目标阶段:事件被分派到目标节点。目标阶段始终位于分离事件的最深的html元素上。 冒泡阶段:将事件从目标节点的直接父节点分派到树的根节点。

例子:

// bubbling handlers, third argument (useCapture) false (default) document.getElementById('outerBubble').addEventListener('click', () => { console.log('outerBubble'); }, false) document.getElementById('innerBubble').addEventListener('click', () => { console.log('innerBubble'); }, false) // capturing handlers, third argument (useCapture) true document.getElementById('outerCapture').addEventListener('click', () => { console.log('outerCapture'); }, true) document.getElementById('innerCapture').addEventListener('click', () => { console.log('innerCapture'); }, true) div:hover{ color: red; cursor: pointer; } <!-- event bubbling --> <div id="outerBubble"> <div id="innerBubble">click me to see Bubbling</div> </div> <!-- event capturing --> <div id="outerCapture"> <div id="innerCapture">click me to see Capturing</div> </div>

上面的例子真正说明了事件冒泡和事件捕获之间的区别。当使用addEventListener添加事件监听器时,有第三个元素叫做useCapture。这是一个布尔值,当设置为true时,允许事件监听器使用事件捕获而不是事件冒泡。

在我们的例子中,当我们将useCapture参数设置为false时,我们看到发生了冒泡事件。首先触发目标阶段的事件(记录innerBubble),然后通过事件冒泡触发父元素中的事件(记录outerBubble)。

当我们将useCapture参数设置为true时,我们看到外部<div>中的事件首先被触发。这是因为事件现在是在捕获阶段而不是冒泡阶段触发的。