DOM事件架构

207 阅读3分钟

前言

本文主要是阅读了w3c之DOM事件架构的一些总结与笔记😁
原文链接如下~
www.w3.org/TR/DOM-Leve…

事件分发

事件分发机制

触发一个事件后,事件对象被派发(dispatchTvent方法)到事件目标,在派发之前,需确定事件对象的传播途径,一旦确定了传播途径,事件对象就会经过一个或多个事件阶段,事件分为三个阶段:捕获阶段,目标阶段和冒泡阶段。如果不支持该阶段,或者事件对象的传播已停止,则将跳过改阶段。


传播途径:当前事件目标的有序列表,也就是说,从窗口到事件目标将事件依次传递,传播途径中的每个事件目标依次设置为currentTarget,传播途径最初由事件类型定义的一个或多个事件阶段组成,但可以中断,也称为事件目标链;

事件阶段:在事件的上下文中,一个阶段是沿着DOM树从节点到节点的逻辑遍历集合,从窗口到Document对象,根元素,再到事件目标(捕获阶段),到事件目标本身(目标阶段),并备份相同的链(冒泡阶段);

捕获阶段:通过从窗口到目标的祖先传播事件对象;

目标阶段:事件到达目标对象,如果事件类型指示事件不会冒泡,则事件对象将在此阶段完成后停止;

冒泡阶段:通过以相反的顺序,从目标祖先到窗口的传播事件对象;



事件标志

  • stop propagation flag
  • stop immediate propagation flag
  • canceled flag
  • in passive listener flag
  • composed flag
  • initialized flag
  • dispatch flag

Evevt事件

👉stop propagation

不再派发事件
终止事件在传播过程的捕获、目标处理或起泡阶段进一步传播。调用该方法后,该节点上处理该事件的处理程序将被调用,事件不再被分派到其他节点。

event.stopPropagation()


👉stop immediate propagation

阻止剩下的事件处理程序被执行

event.stopImmediatePropagation()


👀 stop propagation与stop immediate propagation区别

stop propagation 停止后续节点的事件派发
stop immediate propagation 停止当前节点以及后续节点事件的派发

区别就是stop immediate propagatio不会执行完当前节点的其他事件


👉preventDefault

取消事件的默认动作。

event.preventDefault() 



EventTarget.addEventListener()

说明

EventTarget.addEventListener() 方法将指定的监听器注册到 EventTarget 上,当该对象触发指定的事件时,指定的回调函数就会被执行。 事件目标可以是一个文档上的元素 Element,Document和Window或者任何其他支持事件的对象 (比如 XMLHttpRequest)。 addEventListener()的工作原理是将实现EventListener的函数或对象添加到调用它的EventTarget上的指定事件类型的事件侦听器列表中。

语法

target.addEventListener(type, listener, options);
target.addEventListener(type, listener, useCapture);

type:表示监听事件类型的字符串

listener: 函数

options :
     capture:是否捕获阶段触发
     once:是否调用一次
     passive:是否不会触发preventDefault()

useCapture:是否是捕获阶段触发listener