stopPropgation会阻止事件在捕获阶段传播吗?

yic*_*yic 15 javascript javascript-events event-bubbling event-propagation

我正在查看http://www.quirksmode.org/js/events_order.html,这部分内容不明确:

在Microsoft模型中,您必须将事件的cancelBubble属性设置为true.

window.event.cancelBubble = true
Run Code Online (Sandbox Code Playgroud)

在W3C模型中,您必须调用事件的stopPropagation()方法.

e.stopPropagation()
Run Code Online (Sandbox Code Playgroud)

这会阻止事件在冒泡阶段的所有传播.

所以我的问题是:

  • 当事件侦听器设置为在捕获阶段侦听时,它是否会自动不继续传播到内部元素?
  • 或者,如果它继续传播,是否会e.stopPropagation()停止传播,或者这只适用于泡沫阶段?

LeO*_* Li 25

简答:订单是:

  1. 捕获(下)
  2. 目标
  3. 冒泡).

如果调用e.stopPropagation()在捕获阶段(通过设置addEventListener()第三个参数true),它停在1,SO 2和3不能接收.

如果调用e.stopPropagation()在泡沫阶段(通过设置addEventListener()第三个参数false或只是没有给它分配),1&2已经完成,所以它只是阻止事件,在那里您拨打水平冒泡stopPropagation().

  • 我认为这个问题更具体。`event.stopPropagation()` 是否会阻止事件通过剩余的 `event.target` 祖先继续传播?或者它只是阻止阶段 2 和阶段 3,而阶段 1 无论如何都会完成? (3认同)
  • 这是一个比目前接受的答案更好的答案。 (2认同)

Eli*_*gem 5

不,事件侦听器不会阻止任何事件的传播,除非您明确告知。您所指的部分专门涉及泡沫阶段。IE的模型不支持事件捕获-句号停止。捕获阶段是冒泡阶段之前的阶段:

Top of the DOM --->event--->traverses--->to--->[target]+[event]-| (capture phase)
      /\                                                       \/
      |------------------------to--------back up-----------------  (bubble up)
Run Code Online (Sandbox Code Playgroud)

  • 我的问题是e.stopPropagation()仅停止冒泡的传播,还是停止捕获和冒泡的传播?答案可能与浏览器有关。 (8认同)
  • 简短的答案:stopPropagation在两种情况下都将停止事件。如(可怕的)ASCII图所示,事件集来自“文档”,并在DOM中向下下降,直至触发事件的元素。之后,它会冒泡回到文档。无论在捕获阶段还是气泡阶段,此过程的每一步都可以停止。 (4认同)
  • 令人难以置信的是,这个答案*仍然*没有真正回答问题(*调用 e.stopPropagation() 会阻止它吗?*),我们需要阅读评论。[Leon li 的回答](/sf/answers/2334492611/) 好多了。 (2认同)