事件冒泡和捕获主要涉及的是事件的传播和处理,出现的场景是在嵌套的DOM元素中。 事件冒泡和事件捕获是 DOM事件流(事件传播)中的两个阶段。他们描述的是,当事件发生时,如何在 DOM 树中传播。
事件冒泡(Event Bubbling)
事件冒泡是事件从最深的节点(或目标节点)开始,然后逐层向上(或"冒泡")到最外层的节点(或根节点)。
事件捕获(Event Capturing)
事件捕获则恰恰相反,事件从最外层的节点(或根节点)开始,“捕获”事件,然后逐层向下(或"下沉")到最深的节点(或目标节点)。以点击按钮为例,首先 document 对象会捕获到事件,然后父元素会捕获到,依次往下,直到到达按钮元素。
事件处理
DOM 在处理事件时使用的顺序是:
- 首先进行事件捕获阶段,从根节点向下捕获。
- 当到达目标元素时,触发目标元素的事件。
- 接着事件开始从目标元素向上冒泡。
在 JavaScript 中,我们可以使用 addEventListener 方法的第三个参数来选择在哪个阶段执行处理函数,即决定事件处理函数执行的阶段是在捕获阶段还是冒泡阶段。如果参数为 false(或不提供),则在冒泡阶段处理。如果参数为 true,则在捕获阶段处理。例如:
// 使用事件冒泡
element.addEventListener('click', function() { /* ... */ }, false);
// 使用事件捕获
element.addEventListener('click', function() { /* ... */ }, true);