DOM事件阶段以及事件捕获与事件冒泡先后执行顺序(图文详解)

阅读时长 3 分钟读完

在 Web 开发中,事件处理是一个非常重要的部分。DOM 事件流描述了从事件开始到最终处理的整个过程。理解事件阶段和执行顺序对于编写可靠的 JavaScript 代码非常重要。

事件阶段

DOM 事件流被分为三个阶段:

  1. 捕获阶段(Capture Phase):事件从最外层元素向下传递至目标元素,逐级检查是否有注册该事件类型的监听器。如果有,则立即执行该监听器。
  2. 目标阶段(Target Phase):事件达到目标元素并触发该元素上注册的监听器。
  3. 冒泡阶段(Bubble Phase):事件从目标元素开始向上传播至最外层元素,逐级检查是否有注册该事件类型的监听器。如果有,则立即执行该监听器。

注:在捕获和冒泡阶段,事件是按照从最外层元素向内层元素传递的顺序进行的,而不是从父元素到子元素或者从子元素到父元素。

执行顺序

浏览器采用事件委托来提高性能。当事件发生时,从根元素开始,按照捕获顺序依次检查每个元素是否有该事件类型的监听器。一旦找到,就会立即执行该监听器。如果没有找到,则继续向下传递至目标元素。

在目标元素上触发该事件后,执行该元素上注册的监听器。然后,从目标元素开始按照冒泡顺序向上传递,逐级检查每个元素是否有该事件类型的监听器。一旦找到,就会立即执行该监听器。

总之,事件处理程序在捕获阶段和冒泡阶段被调用,但是它们在目标阶段只被调用一次。

示例代码

HTML 代码:

JavaScript 代码:

-- -------------------- ---- -------
----- ----- - ---------------------------------
----- ----- - ---------------------------------

------------------------------- -- -- ------------------ ---------- ------
------------------------------- -- -- ------------------ ---------- ------
------------------------------- -- -- ------------------ --------- -------
------------------------------- -- -- ------------------ --------- -------
------------------------------- -- -- ------------------ ----------
------------------------------- -- -- ------------------ ----------
展开代码

点击 inner 元素时,控制台将输出以下内容:

从输出可以看出,事件按照捕获顺序执行了 outer capture 和 inner capture 监听器,然后在目标元素上执行了 inner target 监听器,最后按照冒泡顺序执行了 outer bubble 监听器。

总结

理解 DOM 事件流的阶段和执行顺序可以帮助我们更好地编写可靠的 JavaScript 代码。在实际开发中,我们可以利用事件委托和 DOM 事件流来提高性能和减少代码量。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/4059

纠错
反馈

纠错反馈