前端网络协议面试题
目录

请解释浏览器的事件模型。事件捕获和事件冒泡有什么区别?

· 约 4 分钟读完 · 第 55 / 184 章

推荐答案

浏览器的事件模型分为三个阶段:事件捕获阶段、目标阶段和事件冒泡阶段。事件捕获和事件冒泡是事件传播的两个不同阶段。

  • 事件捕获:事件从最外层的祖先元素向下传播到目标元素。在这个过程中,事件会依次触发每个祖先元素上的捕获事件处理程序。
  • 事件冒泡:事件从目标元素向上传播到最外层的祖先元素。在这个过程中,事件会依次触发每个祖先元素上的冒泡事件处理程序。

默认情况下,事件处理程序是在冒泡阶段触发的,但可以通过设置 addEventListener 的第三个参数为 true 来在捕获阶段触发事件处理程序。

本题详细解读

事件捕获阶段

事件捕获阶段是事件传播的第一个阶段。事件从 window 对象开始,沿着 DOM 树向下传播,直到到达目标元素。在这个过程中,事件会依次触发每个祖先元素上的捕获事件处理程序。

例如,假设有以下 HTML 结构:

如果在 outer 和 inner 元素上都注册了捕获事件处理程序,那么在点击 target 按钮时,事件会首先触发 outer 的捕获事件处理程序,然后触发 inner 的捕获事件处理程序,最后到达 target 元素。

目标阶段

目标阶段是事件传播的第二个阶段。在这个阶段,事件到达目标元素,并触发目标元素上的事件处理程序。

事件冒泡阶段

事件冒泡阶段是事件传播的最后一个阶段。事件从目标元素开始,沿着 DOM 树向上传播,直到到达 window 对象。在这个过程中,事件会依次触发每个祖先元素上的冒泡事件处理程序。

继续上面的例子,如果在 outer 和 inner 元素上都注册了冒泡事件处理程序,那么在点击 target 按钮时,事件会首先触发 target 元素上的事件处理程序,然后触发 inner 的冒泡事件处理程序,最后触发 outer 的冒泡事件处理程序。

事件捕获与事件冒泡的区别

  • 传播方向:事件捕获是从外向内传播,而事件冒泡是从内向外传播。
  • 触发顺序:事件捕获阶段先于事件冒泡阶段触发。
  • 默认行为:默认情况下,事件处理程序是在冒泡阶段触发的,但可以通过设置 addEventListener 的第三个参数为 true 来在捕获阶段触发事件处理程序。

示例代码

在这个例子中,点击 target 按钮时,控制台输出的顺序将是: