事件参数中JavaScriptstopPropagation 和stopImmediatePropagation 方法及区别

141 阅读2分钟

这篇文章将介绍什么是事件参数中的JavaScriptstopPropagationstopImmediatePropagation 方法以及它们之间的区别。我们还将介绍什么是事件捕获以及它对这些方法的影响:

stopPropagation v stopImmediatePropagation

StopPropagation

最近的一篇文章介绍了事件冒泡。这是一个在一个元素上执行事件处理程序的过程,然后是它的父级,然后是它的父级 ...

stopPropagation方法在一个事件参数对象中可用。当在一个事件处理程序中调用时,它会停止冒泡过程。

例如,如果我们有下面的HTML:

<div class="container">
  <button class="btn">Click me</button>
</div>

...并且我们有以下的事件处理程序:

const container = document.querySelector(
  ".container"
);
container.addEventListener("click", function(e) {
  console.log("container click", e);
});
const btn = document.querySelector(".btn");
btn.addEventListener("click", function(e) {
  e.stopPropagation();
  console.log("btn click", e);
});

......而用户点击了按钮......

btn click

... div容器上的事件处理程序将不会被调用。

stopImmediatePropagation

让我们为按钮添加第二个事件处理程序:

btn.addEventListener("click", function(e) {
  e.stopPropagation();
  console.log("btn click 1", e);
});
btn.addEventListener("click", function(e) {  e.stopImmediatePropagation();  console.log("btn click 2", e);});

当用户点击按钮时,这次两个按钮处理程序都会被调用,而DIV容器的处理程序仍未到达:

stopImmediatePropagation 1

如果我们想阻止按钮上的第二个处理程序被调用呢?那么,这就是 stopImmediatePropagation做的:

btn.addEventListener("click", function(e) {
  e.stopImmediatePropagation();  console.log("btn click 1", e);
});

stopImmediatePropagation 2

所以,stopImmediatePropagation ,阻止元素上的其他事件处理程序被执行,防止事件冒泡。

很好!

事件捕获

事件捕获是发生在冒泡阶段之前的一个事件阶段。在这个过程中,事件沿着DOM树从窗口到目标元素。我们可以使用capture 选项将事件处理程序附加到捕获阶段而不是冒泡阶段:

container.addEventListener(
  "click",
  function(e) {
    console.log("container click", e);
  },
  { capture: true });

如果用户点击了按钮,我们看到现在是容器div首先处理事件:

Capture phase

stopPropagation 在捕获阶段的作用和在冒泡阶段的作用一样--它可以阻止在该阶段后面的其他事件处理程序被执行。

让我们把stopPropagation 添加到容器div的处理程序中:

container.addEventListener(
  "click",
  function(e) {
    e.stopPropagation();    console.log("container click", e);
  },
  { capture: true }
);

如果用户点击了这个按钮,我们看到只有容器div处理程序被执行。

stopPropagation in capture phase 所以,即使其他事件处理程序处于冒泡阶段,它们也不会被执行。这是因为捕获阶段在冒泡阶段之前,而且stopPropagation ,无论它处于哪个阶段,都会阻止后来的处理程序。

🏃玩转代码

包裹起来

stopPropagation 允许同一元素上的其他事件处理程序被执行,而 则阻止了这一点。 和 则阻止了在捕获和冒泡阶段的后期事件处理程序被执行。stopImmediatePropagation stopPropagation stopImmediatePropagation