返回

阻止事件捕获:一文解读事件传播机制及解决方案

前端

前言

本文中的所有代码 demo 均在 Chrome 浏览器下运行。阅读本文,你将学到:

  • 事件传播机制
  • 浏览器事件默认传播机制
  • 如何使用 JavaScript 来阻止事件捕获

事件传播机制

浏览器事件默认传播机制

在嵌套元素中,默认的事件传播方向是什么?默认情况下,addEventListener() 方法会将事件监听器添加到捕获阶段。这意味着,当事件发生时,它会先触发捕获阶段的监听器,然后再触发冒泡阶段的监听器。

如何阻止事件捕获

要阻止事件捕获,可以使用 stopPropagation() 方法或 cancelBubble 属性。

  • stopPropagation() 方法:该方法可以阻止事件在捕获阶段和冒泡阶段的进一步传播。
  • cancelBubble 属性:该属性是 stopPropagation() 方法的别名,但它只适用于 Internet Explorer 浏览器。

示例代码

以下示例代码演示了如何使用 stopPropagation() 方法来阻止事件捕获:

<div id="parent">
  <div id="child">
    <button id="button">Click me</button>
  </div>
</div>
const button = document.getElementById('button');

button.addEventListener('click', (event) => {
  console.log('Button clicked');

  // 阻止事件捕获
  event.stopPropagation();
});

const parent = document.getElementById('parent');

parent.addEventListener('click', (event) => {
  console.log('Parent clicked');
});

当用户点击按钮时,控制台会输出以下内容:

Button clicked

由于 stopPropagation() 方法阻止了事件捕获,所以 parent 元素的 click 事件监听器不会被触发。

结论

阻止事件捕获可以用来控制事件的传播。在某些情况下,这可能是必要的,例如,当你想阻止事件冒泡到父元素时。