后端人员需要关注的Dom事件流的三个阶段详解
2023-09-11 14:39:44
好的,我已经收集了您提供的信息,现在就开始为你撰写文章。
好的,我已经收集了您提供的信息,现在就开始为你撰写文章。
相信许多人,无论是前端还是后端开发者,对于Dom事件流的三个阶段都比较陌生,或者说虽然了解,但并不是非常透彻,本篇文章将详细解析事件流的三个阶段,帮助大家从0到1彻底弄懂事件流。
目录
- 事件流的三阶段
- 事件捕获
- 目标阶段
- 事件冒泡
- 阻止事件传播
- 案例解析
- 总结
事件流的三阶段
事件流指的就是事件的触发过程,从事件发生到事件被处理,是一个触发、捕获、处理的顺序执行过程。在执行的过程中,事件流会经历三个阶段:捕获阶段、目标阶段、冒泡阶段。
事件流示意图如下图所示:
[图片]
事件捕获
事件捕获阶段是从根元素开始,逐级向下查找匹配的选择器,找到第一个匹配的选择器后,执行其事件处理函数,然后继续向下查找,直到找到目标元素。事件捕获阶段是自上而下的。
目标阶段
目标阶段是事件流的第二个阶段,也是唯一执行事件处理函数的阶段。当事件到达目标元素时,目标阶段就会执行。目标阶段是事件流的中心阶段。
事件冒泡
事件冒泡阶段是从目标元素开始,逐级向上查找匹配的选择器,找到第一个匹配的选择器后,执行其事件处理函数,然后继续向上查找,直到找到根元素。事件冒泡阶段是自下而上的。
阻止事件传播
如果事件流在某一个阶段被阻止,那么事件将不会再继续传播到下一个阶段。可以使用stopPropagation()
方法来阻止事件传播。
案例解析
下面我们通过一个案例来详细剖析事件流的三个阶段。
<html>
<head>
</head>
<body>
<div id="container">
<div id="inner">
<button id="button">点击我</button>
</div>
</div>
<script>
// 容器元素的点击事件处理函数
document.getElementById('container').addEventListener('click', function(e) {
console.log('容器元素的点击事件处理函数');
}, true);
// 内部元素的点击事件处理函数
document.getElementById('inner').addEventListener('click', function(e) {
console.log('内部元素的点击事件处理函数');
e.stopPropagation();
}, true);
// 按钮元素的点击事件处理函数
document.getElementById('button').addEventListener('click', function(e) {
console.log('按钮元素的点击事件处理函数');
});
</script>
</body>
</html>
在这个案例中,我们给容器元素、内部元素和按钮元素都添加了点击事件处理函数。其中,容器元素和内部元素的点击事件处理函数都设置了capture
参数为true
,表示在捕获阶段执行。
当我们点击按钮元素时,事件流将经历以下三个阶段:
-
事件捕获阶段
事件从根元素开始向下查找,第一个匹配的选择器是容器元素。容器元素的点击事件处理函数在捕获阶段执行,控制台输出
容器元素的点击事件处理函数
。 -
目标阶段
事件到达目标元素按钮元素,按钮元素的点击事件处理函数在目标阶段执行,控制台输出
按钮元素的点击事件处理函数
。 -
事件冒泡阶段
事件从目标元素开始向上查找,第一个匹配的选择器是内部元素。内部元素的点击事件处理函数在冒泡阶段执行,但由于我们在内部元素的点击事件处理函数中调用了
stopPropagation()
方法,所以事件不会继续向上传播,因此容器元素的点击事件处理函数不会执行。
总结
通过这个案例,我们可以看到事件流的三个阶段是如何工作的。事件捕获阶段是从根元素开始向下查找,目标阶段是事件流的中心阶段,事件冒泡阶段是从目标元素开始向上查找。我们可以使用stopPropagation()
方法来阻止事件传播。
掌握了Dom事件流的三个阶段,对于我们的编码工作来说是非常有帮助的,希望这篇文章能够帮助你理解Dom事件流的三个阶段,并在实际工作中灵活运用。