jtwang7 / JavaScript-Note

JavaScript学习笔记
10 stars 2 forks source link

JS 事件篇 - 事件冒泡 & 捕获机制 #38

Open jtwang7 opened 3 years ago

jtwang7 commented 3 years ago

事件冒泡

概念:事件触发时,从最具体的触发元素(文档树中最深的节点)开始触发,然后向上传播至没有那么具体的元素。

最具体的元素:文档树中触发本次事件的最深节点 没那么具体的元素:文档树中的顶层对象 - document 对象,在现代浏览器中,事件会一直冒泡到 window 对象

触发流程:target element => ... => body => html => document => window

事件捕获

概念:事件触发时,从最不具体的节点收到事件,然后向下传播至最具体的触发元素。 触发流程:window => document => html => body => ... => target element

现代浏览器都是从 window 对象开始捕获事件的,而 DOM2 Events 规范规定的是从 document 开始。

DOM 事件流

事件流描述了页面接收到事件的顺序,DOM2 Events 规范规定事件流分为 3 个阶段:

  1. 事件捕获
  2. 到达目标
  3. 事件冒泡

在 DOM 事件流中,实际触发事件的目标元素在捕获阶段不会接收到事件。这是因为规范规定事件捕获阶段从 document 传播到 body 就结束了,后续事件处理阶段在到达目标和事件冒泡阶段执行。通常事件处理被认为是冒泡阶段的一部分。

虽然 DOM2 Events 规范明确捕获阶段不会命中事件目标,但现代浏览器都会在捕获阶段在事件目标上触发事件,这也就意味着在事件目标上有两次机会执行事件处理程序。

尽管现代浏览器中实现了捕获阶段执行事件处理程序,但我们仍要尽量遵循在事件捕获阶段仅执行事件拦截的逻辑,将事件响应放在到达目标和事件冒泡阶段执行。