返回

从Chrome 89触发的事件说起:揭秘为什么99%文章都会错

前端

在计算机编程的世界中,事件监听器是一种重要的工具,它允许程序对某些事件做出反应,例如鼠标点击或键盘输入。在网页开发中,事件监听器被广泛用于处理用户交互和更新网页内容。

然而,在最近一次Chrome更新中,事件监听器的触发顺序发生了改变,这导致了99%的文章都出现了错误,包括MDN官方文档。

Chrome 89中事件触发顺序的改变

在Chrome 89.0.4363.0以及之后版本中,目标元素的触发事件顺序不再按照注册顺序触发,而是按照先捕获冒泡 的形式依次执行。

这意味着,如果在一个元素上注册了多个事件监听器,并且这些监听器处理的事件类型相同,那么捕获阶段 的监听器将在冒泡阶段 的监听器之前执行。

为什么99%的文章都会出错

在过去的几年中,网上出现了大量关于事件监听器的文章,其中大多数文章都假设事件监听器是按照注册顺序触发的。这导致了99%的文章都出现了错误。

例如,一些文章中提到了以下代码:

element.addEventListener('click', function() {
  // 捕获阶段的代码
});

element.addEventListener('click', function() {
  // 冒泡阶段的代码
});

在这段代码中,第一个监听器处理的是捕获阶段 的点击事件,第二个监听器处理的是冒泡阶段 的点击事件。

在Chrome 89之前,这两个监听器是按照注册顺序触发的,即捕获阶段 的监听器先执行,然后冒泡阶段 的监听器执行。

但在Chrome 89之后,这两个监听器是按照先捕获冒泡 的形式执行的,即捕获阶段 的监听器先执行,然后冒泡阶段 的监听器执行。

解决方案

为了解决这个问题,我们需要在注册事件监听器时指定事件的触发阶段。

在Chrome 89中,我们可以使用以下代码来注册捕获阶段 的事件监听器:

element.addEventListener('click', function() {
  // 捕获阶段的代码
}, true);

我们可以使用以下代码来注册冒泡阶段 的事件监听器:

element.addEventListener('click', function() {
  // 冒泡阶段的代码
}, false);

总结

Chrome 89中事件触发顺序的改变对前端开发人员来说是一个重要的变化。我们需要在注册事件监听器时指定事件的触发阶段,以便确保我们的代码能够正确执行。