MST

星途 面试题库

面试题:JavaScript 事件冒泡与捕获中的阻止操作

在 JavaScript 事件处理中,我们可以使用 `event.stopPropagation()` 来阻止事件冒泡,那么在捕获阶段如何阻止事件继续向下传递呢?如果在一个复杂的 DOM 结构中,既有事件冒泡又有捕获,且存在多个事件监听器,当使用 `event.stopPropagation()` 后,后续的事件监听器(包括捕获和冒泡阶段的)会受到怎样的影响?请结合代码示例说明。
32.9万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
  1. 在捕获阶段阻止事件继续向下传递
    • 在捕获阶段,可以使用 event.stopImmediatePropagation() 来阻止事件继续向下传递。event.stopImmediatePropagation() 不仅会阻止事件继续在捕获或冒泡阶段传播,还会阻止同一元素上的其他事件监听器被调用。
  2. event.stopPropagation() 对后续事件监听器的影响
    • 当在事件处理函数中使用 event.stopPropagation() 时,它只会阻止事件的冒泡,即事件不会再向上传递到父元素的事件监听器(冒泡阶段)。但对于捕获阶段的事件监听器,如果事件已经到达了当前元素的捕获阶段处理函数,event.stopPropagation() 不会影响之前已经在捕获阶段注册的事件监听器的执行。
    • 以下是代码示例:
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
</head>

<body>
    <div id="parent">
        <div id="child">点击我</div>
    </div>
    <script>
        const parent = document.getElementById('parent');
        const child = document.getElementById('child');

        // 父元素捕获阶段监听器
        parent.addEventListener('click', function (event) {
            console.log('父元素捕获阶段监听器');
        }, true);

        // 子元素捕获阶段监听器
        child.addEventListener('click', function (event) {
            console.log('子元素捕获阶段监听器');
            event.stopPropagation();
        }, true);

        // 子元素冒泡阶段监听器
        child.addEventListener('click', function (event) {
            console.log('子元素冒泡阶段监听器');
        });

        // 父元素冒泡阶段监听器
        parent.addEventListener('click', function (event) {
            console.log('父元素冒泡阶段监听器');
        });
    </script>
</body>

</html>
  • 在上述代码中,点击 child 元素时,会依次输出:
    • “子元素捕获阶段监听器”,因为在子元素捕获阶段监听器中调用了 event.stopPropagation(),所以事件不会再冒泡到父元素的冒泡阶段监听器,也就不会输出“父元素冒泡阶段监听器”。
    • “子元素冒泡阶段监听器”,因为它在 event.stopPropagation() 调用之后。
    • 而父元素捕获阶段监听器会在子元素捕获阶段监听器之前执行,所以也会输出“父元素捕获阶段监听器”。