泡沫与捕获的最终结论

2025-06-04

泡沫与捕获

最终结论

各位开发者大家好,

事件冒泡和捕获是 HTML DOM API 中事件传播的两种方式。当一个事件发生在另一个元素内部的元素中,并且两个元素都注册了该事件的句柄时,事件就会冒泡。
冒泡时,事件首先被最内层的元素捕获并处理,然后再传播到最外层的元素。

通过捕获,事件首先被最外层元素捕获,然后传播到内部元素。
在本文中,我将尝试解释事件监听器中可用的可选参数以及它们之间的区别。开始吧!

目标.addEventListener(类型,监听器[,useCapture]);

target:一个区分大小写的字符串,表示要监听的事件类型。type
:事件的类型
listener:事件发生时触发的函数。

useCapture(可选):一个布尔值,指示此类事件是否先被派发到已注册的监听器,然后再派发到 DOM 树中位于其下方的任何 EventTarget。在树中向上冒泡的事件不会触发指定使用捕获的监听器。事件冒泡和捕获是当一个元素嵌套在另一个元素中时,传播事件的两种方式,当这两个元素都注册了该事件的句柄时。事件传播模式决定了元素接收事件的顺序。有关详细说明,请参阅 DOM 3 级事件和 JavaScript 事件顺序。如果未指定,useCapture 默认为 false。

在这篇文章中,我将尝试解释第三个可选选项的含义。
因此,我们设置了一个基本布局,将三个框嵌套在一起。

我们将向 box-1、box-2 和 box-3 添加一个带有“click”事件的 eventListener,并在事件触发时调用匿名函数内的控制台日志。

document.querySelector('.box-1').addEventListener('click', e => {
    console.log('Box-1 is clicked');
});

document.querySelector('.box-2').addEventListener('click', e => {
    console.log('Box-1 is clicked');
});

document.querySelector('.box-3').addEventListener('click', e => {
    console.log('Box-1 is clicked');
});

Enter fullscreen mode Exit fullscreen mode

你觉得当我点击方框3时会发生什么?我们来看一下。

冒泡的 gif

示例结论

当我们点击 .box-3 时,事件被触发,并在控制台中打印 Box-3, Box-2, Bob-1 。因此,正如我们在图中看到的那样,事件从被点击的元素开始向上触发。这就是冒泡,首先由最内层的元素捕获并处理,然后传播到最外层的元素。

冒泡图像

现在我们来看一下捕获。要使用捕获事件传播,必须将 addEventListener 中的第三个(可选)参数设置为 true。

document.querySelector('.box-1').addEventListener('click', e => {
    console.log('Box-1 is clicked');
}, true);

document.querySelector('.box-2').addEventListener('click', e => {
    console.log('Box-1 is clicked');
}, true);

document.querySelector('.box-3').addEventListener('click', e => {
    console.log('Box-1 is clicked');
}, true);

Enter fullscreen mode Exit fullscreen mode

让我们再次点击 Box-3 看看会发生什么。

捕捉 gif

示例结论捕获

从上面的例子中可以看出,当我们点击 Box-3 时,它首先触发 Box-1,然后是 Box-2,最后是我们点击的元素。这就是我们所说的从上到下(到触发事件的元素)的捕获。

捕获图像示例

最终结论

默认情况下,JavaScript 将事件传播设置为 Bubble 。如果我们想要使用捕获,则必须将 addEventListener 函数中的第 3 个参数设置为 true 。

Codepen 示例:https://codepen.io/Clickys/pen/LBmwzw? editors=1111

文章来源:https://dev.to/clickys/bubble-vs-capture--3b19
PREV
如何触发浏览器使用 window.print() 将 HTML 转换为 PDF
NEXT
创建二维码生成器