返回
从Chrome 89触发的事件说起:揭秘为什么99%文章都会错
前端
2023-10-28 18:15:21
在计算机编程的世界中,事件监听器是一种重要的工具,它允许程序对某些事件做出反应,例如鼠标点击或键盘输入。在网页开发中,事件监听器被广泛用于处理用户交互和更新网页内容。
然而,在最近一次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中事件触发顺序的改变对前端开发人员来说是一个重要的变化。我们需要在注册事件监听器时指定事件的触发阶段,以便确保我们的代码能够正确执行。