面试题答案
一键面试- 事件流执行顺序:
- 事件捕获阶段:从最外层的祖先元素(
document
)开始,依次向内层元素传播,直到目标元素。即document -> outer -> middle -> inner
。 - 目标阶段:事件到达目标元素
inner
,此时inner
元素上绑定的捕获和冒泡处理函数都会执行。 - 事件冒泡阶段:从目标元素
inner
开始,依次向外层元素传播,直到最外层的祖先元素(document
)。即inner -> middle -> outer -> document
。
- 事件捕获阶段:从最外层的祖先元素(
event.stopPropagation()
对事件流的控制:- 在捕获阶段:如果在捕获阶段的某个元素处理函数中调用
event.stopPropagation()
,事件将不再继续向目标元素传播,后续捕获阶段的处理函数将不会执行。例如,在outer
元素的捕获处理函数中调用event.stopPropagation()
,那么middle
和inner
元素捕获阶段的处理函数都不会执行。 - 在冒泡阶段:如果在冒泡阶段的某个元素处理函数中调用
event.stopPropagation()
,事件将不再继续向上冒泡,后续冒泡阶段的处理函数将不会执行。例如,在middle
元素的冒泡处理函数中调用event.stopPropagation()
,那么outer
和document
元素冒泡阶段的处理函数都不会执行。
- 在捕获阶段:如果在捕获阶段的某个元素处理函数中调用
event.preventDefault()
对事件流的控制:event.preventDefault()
并不会影响事件的传播(捕获和冒泡),它的作用是阻止元素的默认行为。例如,对于一个<a href="https://example.com">
链接,点击时默认会跳转到指定的URL,若在点击事件处理函数中调用event.preventDefault()
,则不会发生跳转,但事件依然会按照正常的捕获和冒泡顺序传播。
- 两个方法在事件冒泡和捕获阶段的不同表现:
event.stopPropagation()
:在捕获阶段阻止事件继续向目标元素传播,在冒泡阶段阻止事件继续向上冒泡,重点在于控制事件的传播路径。event.preventDefault()
:无论在捕获还是冒泡阶段调用,都只是阻止元素的默认行为,不影响事件的传播流程。