1. 基础设施
本规范依赖于现行标准的基础设施标准。[INFRA]
本规范中使用的一些术语定义于 编码、 选择器、受信任类型、Web IDL、XML、 XML 中的命名空间 和 将样式表与 XML 文档关联。 [ENCODING] [SELECTORS4] [TRUSTED-TYPES] [WEBIDL] [XML] [XML-NAMES] [XML-STYLESHEET]
当需要扩展时,可以相应地更新 DOM 标准,或者可以编写一个新标准,该标准可以利用为 适用的规范 提供的可扩展性钩子。
1.1. 树
树 是一个有限的层次树结构。树的顺序是对树的先序、深度优先遍历。
参与树的对象有一个父节点,它要么是 null,要么是一个对象,并且有子节点,它是一个对象的有序集合。对象A的父节点是对象B,则A是B的子节点。
对象的根是它自己,如果它的父为null,否则它的根是它的父的根。树的根是参与该树的任意对象,而该对象的父为null。
如果对象A是对象B的子,或者对象A是对象C的子,而C是B的后代,则对象A被称为对象B的后代。
包含后代是指一个对象或其后代之一。
当且仅当B是A的后代时,称对象A为对象B的祖先。
包含祖先是指一个对象或其祖先之一。
当且仅当B和A共享相同的非空父节点时,称对象A为对象B的同胞。
包含同胞是指一个对象或其同胞之一。
如果A和B在同一个树中,并且A在树的顺序中位于B之前,则称对象A先于对象B。
如果A和B在同一个树中,并且A在树的顺序中位于B之后,则称对象A继于对象B。
一个对象的第一个子节点是其第一个子节点,如果它没有子节点,则为 null。
一个对象的最后一个子节点是其最后一个子节点,如果它没有子节点,则为 null。
一个对象的前一个同胞是指其第一个先于的同胞,如果没有,则为 null。
一个对象的下一个同胞是指其第一个继于的同胞,如果没有,则为 null。
1.2. 有序集合
有序集合解析器接受一个字符串input,然后执行以下步骤:
-
令inputTokens为在 ASCII 空白字符处分割input的结果。
-
令tokens为一个新的有序集合。
- 返回tokens。
有序集合序列化器接受一个set,并返回使用U+0020 SPACE连接的set的串联结果。
1.3. 选择器
给定字符串 selectors 和 节点 node,作用域匹配选择器字符串 的步骤如下:
-
令 selector 为 解析选择器 selectors 的结果。 [SELECTORS4]
-
如果 selector 返回失败,则 抛出一个 "
SyntaxError"DOMException。 -
返回 selector 与 node 的 根节点 通过 作用域根 node 进行 在树中匹配选择器 的结果。[SELECTORS4]。
不打算支持在选择器中使用命名空间,也不会添加此功能。
1.4. 名称验证
当一个字符串name满足下列步骤返回 true 时,称为有效的元素本地名:
此概念用于在通过 DOM API 构建时验证元素的本地名称。其意图是允许任何可以使用 HTML 解析器构造的名称(第一个码点是ASCII 字母的分支),以及一些额外的可能性。对于那些额外的可能性,出于历史原因,ASCII 范围受到限制,但超出 ASCII 的任何内容都是允许的。
以下与 JavaScript 兼容的正则表达式是有效元素本地名称的实现:
/^(?:[A-Za-z][^\0\t\n\f\r\u0020/>]*|[:_\u0080-\u{10FFFF}][A-Za-z0-9-.:_\u0080-\u{10FFFF}]*)$/u
一个字符串,如果它不包含ASCII 空白字符、 U+0000 NULL 或 U+003E (>),则它是一个有效的文档类型名称。
空字符串是一个有效的文档类型名称。
要验证并提取一个 namespace 和 qualifiedName,给定一个 context:
-
如果 namespace 是空字符串,则将其设置为 null。
-
将 prefix 设置为 null。
-
将 localName 设置为 qualifiedName。
-
如果 qualifiedName 包含 U+003A (:):
-
将 prefix 设置为 qualifiedName 第一个 U+003A (:) 之前的部分。
-
将 localName 设置为 qualifiedName 第一个 U+003A (:) 之后的部分。
-
如果 prefix 不是一个 有效的命名空间前缀,则 抛出 "
InvalidCharacterError"DOMException。
-
-
如果 context 是 "
attribute" 并且 localName 不是 有效的属性本地名称,则 抛出一个 "InvalidCharacterError"DOMException。 -
如果 context 是 "
element" 并且 localName 不是 有效的元素本地名称,则 抛出一个 "InvalidCharacterError"DOMException。 -
如果 prefix 不为 null 且 namespace 为 null,则 抛出一个 "
NamespaceError"DOMException。 -
如果 prefix 是 "
xml" 且 namespace 不是 XML 命名空间,则 抛出一个 "NamespaceError"DOMException。 -
如果 qualifiedName 或 prefix 是 "
xmlns" 并且 namespace 不是 XMLNS 命名空间,则 抛出一个 "NamespaceError"DOMException。 -
如果 namespace 是 XMLNS 命名空间 并且 qualifiedName 和 prefix 均不是 "
xmlns",则 抛出一个 "NamespaceError"DOMException。 -
返回 (namespace, prefix, localName)。
本规范中的各种 API 过去对命名空间前缀、属性本地名称、元素本地名称和文档类型名称的验证更为严格。这样做的方式与各种 XML 相关规范保持一致。(尽管并非所有这些规范中的规则都被强制执行。)
这被发现对 Web 开发人员来说很烦人,特别是因为这意味着有些名称可以通过 HTML 解析器创建,但不能通过 DOM API 创建。因此,验证已放宽到仅限于上述描述的那些。
2. 事件
2.1. “DOM 事件”简介
在整个 Web 平台中,事件被派发到对象,以标识发生的事件,例如网络活动或用户交互。这些对象实现了EventTarget接口,因此可以通过调用addEventListener()来添加事件监听器以观察事件:
obj. addEventListener( "load" , imgFetched) function imgFetched( ev) { // great success …}
事件监听器可以通过使用removeEventListener()方法删除,传递相同的参数。
或者,也可以通过将AbortSignal传递给addEventListener(),然后调用控制器上持有信号的abort()来删除事件监听器。
事件也是对象,并实现了Event接口(或派生接口)。在上面的例子中,ev是事件。ev作为参数传递给事件监听器的回调(通常是如上所示的JavaScript函数)。事件监听器通过事件的type属性值(上例中的"load")来区分事件。事件的target属性值返回事件被派发到的对象(如上例中的obj)。
虽然事件通常由用户代理在用户交互或某些任务完成时派发,但应用程序可以通过使用通常称为合成事件的方式派发事件。
// add an appropriate event listener obj. addEventListener( "cat" , function ( e) { process( e. detail) }) // create and dispatch the event var event= new CustomEvent( "cat" , { "detail" : { "hazcheeseburger" : true }}) obj. dispatchEvent( event)
除了用于传递信号外,事件有时也用于让应用程序控制操作中的后续步骤。例如,作为表单提交的一部分,type属性值为"submit"的事件被派发。如果调用了该事件的preventDefault()方法,则表单提交将被终止。希望通过应用程序事件(合成事件)派发该功能的应用程序,可以使用dispatchEvent()方法的返回值。
if ( obj. dispatchEvent( event)) { // event was not canceled, time for some magic …}
当一个事件被派发到一个参与树(例如,一个元素)的对象时,它也可以到达该对象的祖先上的事件监听器。实际上,该对象的所有包含祖先中捕获为true的事件监听器都将按照树的顺序被调用。然后,如果事件的bubbles为true,则该对象的所有包含祖先中捕获为false的事件监听器将按照相反的树的顺序被调用。
<!doctype html> < html > < head > < title > Boring example</ title > </ head > < body > < p > Hello< span id = x > world</ span > !</ p > < script > function test( e) { debug( e. target, e. currentTarget, e. eventPhase) } document. addEventListener( "hey" , test, { capture: true }) document. body. addEventListener( "hey" , test) var ev= new Event( "hey" , { bubbles: true }) document. getElementById( "x" ). dispatchEvent( ev) </ script > </ body > </ html >
debug函数将被调用两次。每次事件的target属性值将是span元素。第一次currentTarget属性值将是document,第二次将是body元素。eventPhase属性值将从CAPTURING_PHASE切换到BUBBLING_PHASE。如果为span元素注册了一个事件监听器,eventPhase属性值将是AT_TARGET。
2.2. 接口 Event
[Exposed=*]interface {Event (constructor DOMString ,type optional EventInit = {});eventInitDict readonly attribute DOMString type ;readonly attribute EventTarget ?target ;readonly attribute EventTarget ?srcElement ; // legacyreadonly attribute EventTarget ?currentTarget ;sequence <EventTarget >composedPath ();const unsigned short NONE = 0;const unsigned short CAPTURING_PHASE = 1;const unsigned short AT_TARGET = 2;const unsigned short BUBBLING_PHASE = 3;readonly attribute unsigned short eventPhase ;undefined stopPropagation ();attribute boolean cancelBubble ; // legacy alias of .stopPropagation()undefined stopImmediatePropagation ();readonly attribute boolean bubbles ;readonly attribute boolean cancelable ;attribute boolean returnValue ; // legacyundefined preventDefault ();readonly attribute boolean defaultPrevented ;readonly attribute boolean composed ; [LegacyUnforgeable ]readonly attribute boolean isTrusted ;readonly attribute DOMHighResTimeStamp timeStamp ;undefined initEvent (DOMString ,type optional boolean =bubbles false ,optional boolean =cancelable false ); // legacy };dictionary {EventInit boolean =bubbles false ;boolean =cancelable false ;boolean =composed false ; };
一个Event对象通常被称为一个事件。它用于标识某些事情已经发生,例如,一个图像已经完成下载。
一个潜在事件目标是 null
或一个EventTarget对象。
一个事件有一个关联的目标(一个潜在事件目标)。除非另有说明,否则它为 null。
一个事件有一个关联的相关目标(一个潜在事件目标)。除非另有说明,否则它为 null。
其他规范使用相关目标来定义一个relatedTarget属性。[UIEVENTS]
一个事件有一个关联的触摸目标列表(一个列表,包含零个或多个潜在事件目标)。除非另有说明,否则它为空列表。
触摸目标列表专门用于定义TouchEvent接口和相关接口。[TOUCH-EVENTS]
一个 事件具有关联的
路径。一个
路径是一个
列表,由事件路径项组成。一个 事件路径项是一个结构体,
由一个 调用目标
(一个 EventTarget
对象)、一个
调用目标在影子树中
(一个布尔值)、一个
影子调整目标(一个
潜在事件
目标)、一个
relatedTarget(一个
潜在事件
目标)、一个
触摸目标列表(一个
列表,由潜在事件
目标组成)、一个
闭合树的根(一个布尔值),
以及一个 闭合树中的插槽(一个
布尔值)组成。一个 路径最初是
空列表。
event = new Event(type [, eventInitDict])- 返回一个新的event,其
type属性值设置为type。eventInitDict参数允许通过同名对象成员设置bubbles和cancelable属性。 event .type- 返回event的类型,例如"
click"、"hashchange"或"submit"。 event .target- 返回event被分派的对象(其目标)。
event .currentTarget- 返回当前正在调用其事件侦听器的回调函数的对象。
event .composedPath()- 返回event的调用目标对象(将在其上调用侦听器的对象),但不包括任何节点,这些节点在shadow 树中,其shadow root的模式为"
closed"且无法从event的currentTarget到达。 event .eventPhase- 返回事件的阶段,它是以下之一:
NONE、CAPTURING_PHASE、AT_TARGET和BUBBLING_PHASE。 event . stopPropagation()- 当在树中分派时,调用此方法会阻止event到达当前对象以外的任何对象。
event . stopImmediatePropagation()- 调用此方法会阻止event在当前侦听器运行结束后到达任何注册的事件侦听器,并且当在树中分派时,也会阻止event到达任何其他对象。
event .bubbles- 根据event的初始化方式返回 true 或 false。如果event通过其目标的祖先按相反的树顺序传播,则为 true;否则为 false。
event .cancelable- 根据event的初始化方式返回 true 或 false。其返回值并不总是有意义,但 true 可以表示在分派event的过程中,部分操作可以通过调用
preventDefault()方法来取消。 event . preventDefault()- 如果在
cancelable属性值为 true 时调用,并且在执行带有passive设置为 false 的侦听器时,通知导致分派event的操作需要取消。 event .defaultPrevented- 如果成功调用
preventDefault()表示取消,则返回 true;否则返回 false。 event .composed- 根据event的初始化情况返回 true 或 false。如果event调用了超过作为其目标的根的
ShadowRoot节点的监听器,则返回 true;否则返回 false。 event .isTrusted- 如果event由用户代理分派,则返回 true,否则返回 false。
event .timeStamp- 以毫秒为单位返回event的时间戳,相对于发生时间。
type属性必须返回初始化时的值。当创建一个事件时,必须将该属性初始化为空字符串。
currentTarget属性必须返回初始化时的值。当创建一个事件时,必须将该属性初始化为 null。
composedPath() 方法步骤是:
-
令 composedPath 为空列表。
-
如果 path 为空,则返回 composedPath。
-
令 currentTarget 为 this 的
currentTarget属性值。 -
断言:currentTarget 是一个
EventTarget对象。 -
将 currentTarget 追加到 composedPath。
-
令 currentTargetIndex 为 0。
-
令 currentTargetHiddenSubtreeLevel 为 0。
-
令 index 为 path 的大小 − 1。
-
当 index 大于或等于 0 时:
-
令 currentHiddenLevel 和 maxHiddenLevel 为 currentTargetHiddenSubtreeLevel。
-
将 index 设为 currentTargetIndex − 1。
-
当 index 大于或等于 0 时:
-
将 currentHiddenLevel 和 maxHiddenLevel 设为 currentTargetHiddenSubtreeLevel。
-
将 index 设为 currentTargetIndex + 1。
-
当 index 小于 path 的大小时:
-
返回 composedPath。
eventPhase属性必须返回初始化时的值,该值必须是以下之一:
NONE(数值 0)- 事件当前未被分派时处于此阶段。
CAPTURING_PHASE(数值 1)- 当一个事件被分派到一个参与树的对象时,它将在到达其目标之前处于此阶段。
AT_TARGET(数值 2)- 当一个事件被分派时,它将在其目标上处于此阶段。
BUBBLING_PHASE(数值 3)- 当一个事件被分派到一个参与树的对象时,它将在到达其目标后处于此阶段。
最初该属性必须初始化为NONE。
每个事件都具有以下关联标志,最初都未设置:
- 停止传播标志
- 立即停止传播标志
- 取消标志
- 在被动侦听器中的标志
- 合成标志
- 初始化标志
- 分派标志
stopPropagation()方法的步骤是设置this的停止传播标志。
cancelBubble获取步骤是如果this的停止传播标志已设置,则返回 true;否则返回 false。
cancelBubble设置步骤是如果给定值为
true,则设置this的停止传播标志;否则不执行任何操作。
stopImmediatePropagation()方法的步骤是设置this的停止传播标志和this的立即停止传播标志。
bubbles和cancelable属性必须返回初始化时的值。
要设置取消标志,给定一个事件event,如果event的cancelable属性值为
true 并且event的在被动侦听器中的标志未设置,则设置event的取消标志,否则不执行任何操作。
returnValue获取步骤是如果this的取消标志已设置,则返回 false;否则返回 true。
returnValue设置步骤是如果给定值为
false,则设置取消标志,并将this作为参数;否则不执行任何操作。
preventDefault()方法的步骤是将取消标志设置为this。
在某些情况下,调用preventDefault()无效。建议用户代理在开发者控制台中记录具体原因,以帮助调试。
defaultPrevented获取步骤是如果this的取消标志已设置,则返回 true;否则返回 false。
composed获取步骤是如果this的合成标志已设置,则返回 true;否则返回 false。
isTrusted属性必须返回初始化时的值。当创建一个事件时,必须将该属性初始化为 false。
isTrusted是一个方便的属性,指示一个事件是否由用户代理分派(而不是使用dispatchEvent())。唯一的传统例外是click(),它导致用户代理分派一个isTrusted属性初始化为
false 的事件。
timeStamp属性必须返回初始化时的值。
要初始化一个event,使用type、bubbles和cancelable,运行以下步骤:
initEvent()与事件构造函数是多余的,并且无法设置composed。它必须为了遗留内容而支持。
2.3.
对 Window
接口的传统扩展
partial interface Window { [Replaceable ]readonly attribute (Event or undefined )event ; // legacy };
每个 Window
对象都有一个关联的 当前事件(未定义或一个 Event
对象)。除非另有说明,否则它是未定义的。
event 的 getter 步骤是返回 this 的 当前事件。
强烈建议 Web 开发者依赖传递给事件监听器的 Event
对象,因为这将产生更具可移植性的代码。此属性在 workers 或 worklets 中不可用,并且对于在 shadow trees 中分派的事件是不准确的。
2.4. 接口 CustomEvent
[Exposed=*]interface :CustomEvent Event {(constructor DOMString ,type optional CustomEventInit = {});eventInitDict readonly attribute any detail ;undefined initCustomEvent (DOMString ,type optional boolean =bubbles false ,optional boolean =cancelable false ,optional any =detail null ); // legacy };dictionary :CustomEventInit EventInit {any =detail null ; };
事件 使用 CustomEvent
接口可以用于携带自定义数据。
event = new CustomEvent(type [, eventInitDict])- 其工作方式类似于
Event的构造函数,但 eventInitDict 参数现在还允许设置detail属性。 event .detail- 返回创建 event 时的任何自定义数据。 通常用于合成事件。
detail 属性必须返回它初始化时的值。
initCustomEvent(type, bubbles, cancelable, detail)
方法的步骤如下:
2.5. 构造事件
规范可能会为所有或某些事件定义事件构造步骤。该算法接收一个事件event和一个EventIniteventInitDict,如内部事件创建步骤中所示。
这个构造方式可用于Event子类,它们具有比简单的初始化字典成员和IDL属性之间一对一映射更复杂的结构。
要使用eventInterface 创建事件,该接口必须是Event或继承自它的接口,并且可选地提供realm
realm,运行以下步骤:
-
如果未提供realm,则将其设置为null。
-
将dictionary设置为将JavaScript值undefined转换为eventInterface构造函数所接受的字典类型的结果。(此字典类型将是
EventInit或继承自它的字典类型。)如果需要成员,这种方法不起作用;请参见whatwg/dom#600。
-
运行内部事件创建步骤,以eventInterface、realm、该事件信号发生的时间和dictionary为参数,得到event。
-
将event的
isTrusted属性初始化为true。 -
返回event。
创建事件用于需要分别创建和分发事件的其他规范,而不是简单地触发事件。它确保事件的属性初始化为正确的默认值。
内部事件创建步骤,给定eventInterface、realm、time和dictionary,如下所示:
-
使用eventInterface创建一个新对象作为event的结果。如果realm非空,则使用该realm;否则,使用Web IDL中定义的默认行为。
截至本文撰写时,Web IDL 尚未定义任何默认行为;请参见whatwg/webidl#135。
-
设置event的初始化标志。
-
将event的
timeStamp属性初始化为给定time和event的相关全局对象的相对高分辨率粗略时间。 -
对于 dictionary 中的每个 member → value: 如果 event 具有 标识符为 member 的属性,则将该属性初始化为 value。
-
运行事件构造步骤,参数为event和dictionary。
-
返回event。
2.6. 定义事件接口
通常,在定义一个继承自Event的新接口时,请务必征求WHATWG或W3C WebApps
WG社区的反馈。
CustomEvent接口可以作为起点。然而,不要引入任何init*Event()方法,因为它们与构造函数是冗余的。继承自Event接口的接口中如果包含此类方法,也只是出于历史原因。
2.7. 接口 EventTarget
[Exposed=*]interface {EventTarget constructor ();undefined addEventListener (DOMString ,type EventListener ?,callback optional (AddEventListenerOptions or boolean )= {});options undefined removeEventListener (DOMString ,type EventListener ?,callback optional (EventListenerOptions or boolean )= {});options boolean dispatchEvent (Event ); };event callback interface {EventListener undefined (handleEvent Event ); };event dictionary {EventListenerOptions boolean =capture false ; };dictionary :AddEventListenerOptions EventListenerOptions {boolean ;passive boolean =once false ;AbortSignal ; };signal
一个 EventTarget
对象表示一个目标,当某些事情发生时,一个事件可以被派发到该目标。
每个 EventTarget
对象都有一个相关的事件监听器列表(一个由零个或多个事件监听器组成的列表)。它最初是空的列表。
一个事件监听器 可以用于观察特定的事件,它由以下部分组成:
- 类型(一个字符串)
- 回调(null或一个
EventListener对象) - 捕获(一个布尔值,初始值为false)
- 被动(null或一个布尔值,初始值为null)
- 一次性(一个布尔值,初始值为false)
- 信号(null或一个
AbortSignal对象) - 已移除(用于记录的布尔值,初始值为false)
虽然回调是一个 EventListener
对象,事件监听器
是一个更广泛的概念,如上所述。
每个 EventTarget
对象还有一个相关的获取父级算法,
该算法接收一个事件
event,并返回一个EventTarget
对象。除非另有说明,它返回null。
每个 EventTarget
对象可以有一个相关的激活行为算法。该激活行为算法接收一个事件,如
派发
算法中所示。
这是因为用户代理在某些EventTarget
对象上执行某些操作,例如
area
元素,以响应其MouseEvent
的type
属性为click的合成事件。由于Web兼容性问题,它未能被移除,并且现在成为定义激活某些内容的固定方式。[HTML]
每个 EventTarget
对象如果具有激活行为,还可以同时(而非单独)具有遗留预激活行为算法
和遗留取消激活行为
算法。
这些算法仅存在于复选框和单选框的
input
元素中,
不适用于其他任何内容。[HTML]
target = new EventTarget();-
创建一个新的
EventTarget对象,开发者可以使用它来派发并 监听事件。 target . addEventListener(type, callback [, options])-
为
type属性值为type的事件附加一个事件侦听器。callback参数设置将在事件分派时调用的回调函数。当options为true时,监听器在捕获阶段触发;当为false或未设置时,监听器在冒泡阶段触发。无论设置如何,若事件处于目标阶段,监听器均会被触发。
当options设置为true时,表示监听器为被动模式,不会调用
preventDefault()来取消事件。当options设置为true时,表示监听器仅触发一次,触发后将被移除。
若为options指定了
AbortSignal,当信号被中止时,监听器将被移除。若已存在相同type、callback和capture的事件监听器,则不会再次添加。
target . removeEventListener(type, callback [, options])-
移除target中与type、callback和options匹配的事件监听器。
target . dispatchEvent(event)-
派发event事件,并返回true,若事件的
cancelable属性为false或未调用preventDefault(),否则返回false。
要展开 options,请执行以下步骤:
-
如果options是布尔值,则返回options。
-
返回options["
capture"]。
要进一步展开 options,请执行以下步骤:
new EventTarget()构造函数步骤不执行任何操作。
由于其他地方声明的默认值,返回的EventTarget的
获取父级算法将返回null,并且它没有激活行为、遗留预激活行为,
或遗留取消激活行为。
将来我们可以允许自定义的 获取父级 算法。如果这会有用,
请支持 issue #583。目前,所有
由作者创建的 EventTarget
都不参与树结构。
默认被动值,给定一个事件类型type和一个EventTarget
eventTarget,由下列步骤决定:
要添加事件监听器,给定一个EventTarget
对象eventTarget和一个事件监听器listener,请执行以下步骤:
-
若eventTarget是一个
ServiceWorkerGlobalScope对象,其service worker的脚本资源的曾经评估过的标志被设置,且listener的类型与任何service worker 事件的类型属性值匹配,则向控制台报告一个警告,提示这可能不会产生预期结果。[SERVICE-WORKERS] -
若listener的回调为null,则返回。
-
若listener的被动为null,则将其设置为listener的默认被动值,根据listener的类型 和eventTarget。
-
若eventTarget的事件监听器列表不包含一个事件监听器,其类型是listener的类型,回调是listener的回调,且捕获是listener的捕获,则追加 listener到eventTarget的事件监听器列表中。
-
- 移除事件监听器,使用eventTarget和listener。
添加事件监听器的概念是为了确保事件处理器使用相同的代码路径。[HTML]
addEventListener(type, callback, options)
方法步骤为:
要移除事件监听器,给定一个EventTarget
对象eventTarget和一个事件监听器 listener,请执行以下步骤:
-
如果eventTarget是
ServiceWorkerGlobalScope对象,并且它的Service Worker的要处理的事件类型集合包含listener的类型,那么报告一个警告到控制台,表明这可能不会产生预期的结果。[SERVICE-WORKERS]
HTML 需要这个来定义事件处理器。[HTML]
要移除所有事件监听器,给定一个EventTarget
对象eventTarget: 对其每个
listener的事件监听器列表项: 移除事件监听器,使用eventTarget和listener。
HTML 需要这个来定义document.open()。[HTML]
removeEventListener(type, callback, options)
方法步骤为:
-
令capture为展开options的结果。
-
如果this的事件 监听器列表 包含一个事件监听器, 其类型是type,回调是 callback,且捕获是capture,则移除事件监听器,使用this和该事件监听器。
事件侦听器列表不会包含具有相同type、callback和capture的多个事件侦听器,因为添加事件侦听器会防止这种情况发生。
dispatchEvent(event)方法步骤为:
-
若event的派发标志已设置,或其初始化标志未设置,则抛出一个“
InvalidStateError”DOMException。 -
将event的
isTrusted属性初始化为false。
2.8. 观察事件监听器
一般来说,开发者不会期望事件监听器的存在是可观察的。 事件监听器的影响由其回调决定。也就是说, 开发者添加一个无操作的事件监听器时不会期望它有任何副作用。
不幸的是,一些事件API的设计使得要高效实现它们就需要观察事件侦听器。这使得侦听器的存在是可观察的,即使是空的侦听器也可能对应用程序的行为产生显著的性能影响。例如,可以用于阻止异步滚动的触摸和滚轮事件。在某些情况下,可以通过仅在存在至少一个非被动侦听器时将事件指定为可取消来缓解这一问题。例如,非被动触摸事件侦听器必须阻止滚动,但如果所有侦听器都是被动的,则可以通过使触摸事件不可取消(从而忽略对preventDefault()的调用)来允许滚动并行开始。因此,分派事件的代码能够观察到非被动侦听器的缺失,并使用该信息来清除正在分派的事件的可取消属性。
理想情况下,任何新的事件API都应定义为不需要此属性。(请使用whatwg/dom进行讨论。)
要获取遗留的Service
Worker获取事件侦听器回调,给定一个ServiceWorkerGlobalScopeglobal,请运行以下步骤。这些步骤将返回一个EventListener对象的列表。
2.9. 分发事件
要将一个
事件 event 分派给一个
EventTarget
对象 target,并带有可选的 legacy target override flag 和
可选的 legacyOutputDidListenersThrowFlag:
-
设置 event 的 dispatch flag。
-
令 targetOverride 为 target,如果未给定 legacy target override flag; 否则为 target 的关联的
Document。 [HTML]legacy target override flag 仅由 HTML 使用,并且仅在 target 是一个
Window对象时使用。 -
令 activationTarget 为 null。
-
令 relatedTarget 为将 event 的 relatedTarget 相对于 target 进行重定向的结果。
-
令 clearTargets 为 false。
-
如果 target 不是 relatedTarget,或 target 是 event 的 relatedTarget:
-
令 touchTargets 为一个新的 列表。
-
对于 event 的 触摸目标列表中的每个 touchTarget:将 touchTarget 相对于 target 进行重定向的结果 追加到 touchTargets。
-
使用 event、target、 targetOverride、relatedTarget、touchTargets 和 false 追加到事件路径。
-
令 isActivationEvent 为 true,如果 event 是一个
MouseEvent对象 且 event 的type属性是 "click";否则为 false。 -
如果 isActivationEvent 为 true 且 target 具有 激活行为,则将 activationTarget 设置为 target。
-
令 slotInClosedTree 为 false。
-
令 parent 为调用 target 的获取父级 并传入 event 的结果。
-
当 parent 非 null 时:
-
如果 slottable 非 null:
-
令 relatedTarget 为将 event 的 relatedTarget 相对于 parent 进行重定向的结果。
-
令 touchTargets 为一个新的 列表。
-
对于 event 的 触摸目标列表中的每个 touchTarget:将 touchTarget 相对于 parent 进行重定向的结果 追加到 touchTargets。
-
如果 parent 是一个
Window对象,或 parent 是一个 节点 且 target 的根是 parent 的 包含影子的 包含祖先: -
否则,如果 parent 是 relatedTarget,则将 parent 设置为 null。
-
否则:
-
如果 parent 非 null,则将 parent 设置为调用 parent 的获取父级并传入 event 的结果。
-
将 slotInClosedTree 设置为 false。
-
-
令 clearTargetsItem 为 event 的 路径中最后一个 事件路径项, 且其影子调整后的目标 非 null。
-
如果 clearTargetsItem 的影子调整后的目标、 clearTargetsItem 的relatedTarget,或 clearTargetsItem 的触摸 目标列表中的一个
EventTarget对象是一个 节点, 且其根是一个 影子根:将 clearTargets 设置为 true。 -
如果 activationTarget 非 null 且 activationTarget 具有 旧式预激活 行为,则运行 activationTarget 的 旧式预激活 行为。
-
按逆序,对于 event 的 路径中的每个 item:
-
如果 item 的影子调整后的目标 非 null,则 将 event 的
eventPhase属性设置为AT_TARGET。 -
否则,将 event 的
eventPhase属性设置为CAPTURING_PHASE。 -
使用 item、event、"
capturing",以及 给定时的 legacyOutputDidListenersThrowFlag 进行调用。
-
-
对于 event 的 路径中的每个 item:
-
如果 item 的影子调整后的目标 非 null,则 将 event 的
eventPhase属性设置为AT_TARGET。 -
否则:
-
将 event 的
eventPhase属性设置为BUBBLING_PHASE。
-
使用 item、event、"
bubbling",以及 给定时的 legacyOutputDidListenersThrowFlag 进行调用。
-
-
-
将 event 的
eventPhase属性设置为NONE。 -
将 event 的
currentTarget属性设置为 null。 -
将 event 的路径设置为空列表。
-
取消设置 event 的 dispatch flag、stop propagation flag 和 stop immediate propagation flag。
-
如果 clearTargets 为 true:
-
将 event 的 target 设置为 null。
-
将 event 的 relatedTarget 设置为 null。
-
将 event 的 触摸目标列表设置为空列表。
-
-
如果 activationTarget 非 null:
-
如果 event 的 canceled flag 未设置,则运行 activationTarget 的 激活行为并传入 event。
-
否则,如果 activationTarget 具有 旧式取消激活 行为,则运行 activationTarget 的 旧式取消激活 行为。
-
-
如果 event 的 canceled flag 已设置,则返回 false;否则返回 true。
要追加到
事件路径,给定一个
事件 event、
一个 EventTarget
对象 invocationTarget、一个
潜在
事件目标 shadowAdjustedTarget、一个 潜在事件目标
relatedTarget、一个由 潜在事件目标组成的
列表
touchTargets,以及一个布尔值 slotInClosedTree:
-
令 invocationTargetInShadowTree 为 false。
-
如果 invocationTarget 是一个 节点且其 根是一个 影子 根,则将 invocationTargetInShadowTree 设置为 true。
-
令 rootOfClosedTree 为 false。
-
如果 invocationTarget 是一个 影子根,且其 模式 为 "
closed",则将 rootOfClosedTree 设置为 true。 -
向 event 的 路径 追加一个新的 事件路径项,其 调用目标为 invocationTarget, invocation-target-in-shadow-tree 为 invocationTargetInShadowTree, 影子调整后的目标为 shadowAdjustedTarget, relatedTarget 为 relatedTarget, 触摸目标列表为 touchTargets, root-of-closed-tree 为 rootOfClosedTree,并且 slot-in-closed-tree 为 slotInClosedTree。
要进行调用,给定一个 事件路径项 pathItem、一个事件 event、一个字符串 phase,以及一个可选的 legacyOutputDidListenersThrowFlag:
-
令 targetItem 为 pathItem。
-
当 targetItem 的 影子调整后的目标为 null 时:将 targetItem 设置为 event 的 路径中 位于 targetItem 之前的 事件路径项。
-
将 event 的 relatedTarget 设置为 pathItem 的 relatedTarget。
-
如果 event 的 stop propagation flag 已设置,则返回。
-
将 event 的
currentTarget属性初始化为 pathItem 的 调用目标。 -
令 listeners 为 event 的
currentTarget属性值的事件监听器列表的一个 克隆。 -
令 invocationTargetInShadowTree 为 pathItem 的 invocation-target-in-shadow-tree。
-
令 found 为使用 event、 listeners、phase、invocationTargetInShadowTree, 以及给定时的 legacyOutputDidListenersThrowFlag 运行 内部调用的结果。
-
如果 found 为 false 且 event 的
isTrusted属性为 true:-
令 originalEventType 为 event 的
type属性值。 -
如果 event 的
type属性值与下表第一列中的任意字符串匹配,则将 event 的type属性值设置为 与匹配字符串同一行的第二列中的字符串;否则返回。事件类型 旧式事件类型 " animationend"" webkitAnimationEnd"" animationiteration"" webkitAnimationIteration"" animationstart"" webkitAnimationStart"" transitionend"" webkitTransitionEnd" -
使用 event、listeners、phase、 invocationTargetInShadowTree,以及给定时的 legacyOutputDidListenersThrowFlag 进行内部调用。
-
将 event 的
type属性值设置为 originalEventType。
-
要进行内部调用,给定一个 事件 event、 一个由 事件 监听器组成的 列表 listeners、一个 字符串 phase、一个布尔值 invocationTargetInShadowTree,以及一个可选的 legacyOutputDidListenersThrowFlag:
-
令 found 为 false。
-
对于 listeners 中每个 removed 为 false 的 listener:
-
将 found 设置为 true。
-
如果 phase 是 "
capturing" 且 listener 的 capture 为 false,则 continue。 -
如果 phase 是 "
bubbling" 且 listener 的 capture 为 true,则 continue。 -
如果 listener 的 once 为 true,则 移除事件监听器,给定 event 的
currentTarget属性值 和 listener。 -
令 currentEvent 为 undefined。
-
如果 global 是一个
Window对象: -
如果 listener 的 passive 为 true,则设置 event 的 in passive listener flag。
-
如果 global 是一个
Window对象,则给定 event 和 listener 记录事件 监听器的计时信息。 -
使用 listener 的 回调、"
handleEvent"、« event »,以及 event 的currentTarget属性值来 调用用户对象的操作。如果这抛出异常 exception:-
为 listener 的 回调对应的 JavaScript 对象的 关联 Realm的 全局对象 报告 exception。
-
如果给定,则设置 legacyOutputDidListenersThrowFlag。
legacyOutputDidListenersThrowFlag 仅由 Indexed Database API 使用。[INDEXEDDB]
-
-
取消设置 event 的 in passive listener flag。
-
如果 event 的 stop immediate propagation flag 已设置,则 break。
-
返回 found。
2.10. 触发事件
要在target上触发事件,事件名为e,可选地使用eventConstructor,并描述如何初始化IDL属性,以及legacy target override flag,请执行以下步骤:
在 DOM 的语境中,Fire 是 创建、 初始化以及分派一个事件的简称。 触发事件使 该过程更容易被写下来。
如果该事件需要初始化其
bubbles
或 cancelable
属性,
可以写成“在 target 上触发事件,其名称为 submit,
并将其
cancelable
属性初始化为 true”。
或者,当需要自定义构造函数时,“在
target 上触发事件,其名称为 click,并使用 MouseEvent,
将其 detail
属性初始化为 1”。
有时返回值很重要:
-
令 doAction 为在 target 上触发事件,其名称为
like的结果。 -
如果 doAction 为 true,则 …
2.11. 行为与发生
一个事件表示一次
发生,而不是一个动作。换句话说,它
表示来自算法的通知,并可用于影响该算法未来的执行路径
(例如,通过调用 preventDefault())。
事件不得被
用作会导致某个算法开始运行的动作或发起者。那不是
它们的用途。
这里特别指出这一点,是因为 DOM 以前的 迭代版本中有一个与事件关联的“默认动作”概念, 这让人们产生了完全错误的想法。事件不表示或导致动作,它们 只能用于影响一个正在进行的动作。
3. 中止正在进行的活动
尽管 promise 没有内置的中止机制,但许多使用它们的 API 都需要中止语义。AbortController
旨在通过提供一个 abort()
方法来支持这些要求,该方法可以切换相应 AbortSignal
对象的状态。希望支持中止的 API 可以接受一个 AbortSignal
对象,并使用其状态来确定如何继续。
鼓励依赖 AbortController
的 API 通过使用 AbortSignal
的中止原因来拒绝任何未解决的 promise,从而响应 abort()。
一个假设的doAmazingness({ ... })方法可以通过接受AbortSignal对象来支持中止,类似如下:
const controller = new AbortController();
const signal = controller. signal;
startSpinner();
doAmazingness({ ..., signal })
. then( result => ...)
. catch ( err => {
if ( err. name == 'AbortError' ) return ;
showUserErrorMessage();
})
. then(() => stopSpinner());
// …
controller. abort();
doAmazingness could be implemented as follows:
function doAmazingness({ signal}) {
return new Promise(( resolve, reject) => {
signal. throwIfAborted();
// Begin doing amazingness, and call resolve(result) when done.
// But also, watch for signals:
signal. addEventListener( 'abort' , () => {
// Stop doing amazingness, and:
reject( signal. reason);
});
});
}
不返回promise的API可以选择以类似的方式做出反应,或者选择完全不展示AbortSignal的中止原因。addEventListener()就是一个适合后者的API例子。
需要更精细控制的API可以根据需要扩展AbortController和AbortSignal对象。
3.1.
接口 AbortController
[Exposed=*]interface {AbortController constructor (); [SameObject ]readonly attribute AbortSignal signal ;undefined abort (optional any ); };reason
controller = new AbortController()- 返回一个新的controller,其
signal被设置为新创建的AbortSignal对象。 controller . signal- 返回与此对象关联的
AbortSignal对象。 controller . abort(reason)- 调用此方法将把reason存储在此对象的
AbortSignal的中止原因中,并向任何观察者发出信号,表示相关活动将被中止。如果reason未定义,则会存储一个"AbortError"DOMException。
一个AbortController对象有一个关联的信号(一个AbortSignal对象)。
new AbortController()构造函数步骤如下:
-
让signal成为一个新的
AbortSignal对象。
signal的getter步骤是返回this的signal。
abort(reason)方法步骤是在signal abort上执行,带有reason如果给定。
在AbortController的controller上带有可选的reason执行signal abort,如果reason被提供。
3.2. 接口AbortSignal
[Exposed=*]interface :AbortSignal EventTarget { [NewObject ]static AbortSignal abort (optional any ); [reason Exposed =(Window ,Worker ),NewObject ]static AbortSignal timeout ([EnforceRange ]unsigned long long ); [milliseconds NewObject ]static AbortSignal _any (sequence <AbortSignal >);signals readonly attribute boolean aborted ;readonly attribute any reason ;undefined throwIfAborted ();attribute EventHandler onabort ; };
AbortSignal . abort(reason)- 返回一个
AbortSignal实例,其中止原因设置为reason(如果未定义则为"AbortError"DOMException)。 AbortSignal . any(signals)- 返回一个
AbortSignal实例,该实例将在任一signals中止时中止。其中止原因将被设置为导致中止的signals中的某一个。 AbortSignal . timeout(milliseconds)- 返回一个
AbortSignal实例,该实例将在milliseconds毫秒后中止。其中止原因将被设置为"TimeoutError"DOMException。 signal . aborted- 如果signal的
AbortController已发出中止信号,则返回true;否则返回false。 signal . reason- 返回signal的中止原因。
signal . throwIfAborted()- 如果signal的
AbortController已发出中止信号,则抛出signal的中止原因;否则不执行任何操作。
一个AbortSignal对象有一个关联的中止原因(一个JavaScript值),其初始状态为未定义。
一个AbortSignal对象有一个关联的中止算法(一组将在中止时执行的算法),其初始状态为空。
中止算法使得具有复杂要求的API能够合理地响应abort()。例如,给定API的中止原因可能需要传播到跨线程环境,例如service worker。
一个AbortSignal对象有一个依赖项(一个布尔值),其初始状态为false。
一个AbortSignal对象有一个关联的源信号(一组AbortSignal对象),其初始状态为空。
一个AbortSignal对象有一个关联的依赖信号(一组依赖于对象的AbortSignal对象),其初始状态为空。
静态方法abort(reason)的步骤如下:
-
让signal成为一个新的
AbortSignal对象。 -
将signal的中止原因设置为reason,如果给定;否则设置为新的"
AbortError"DOMException。 - 返回signal。
静态方法timeout(milliseconds)的步骤如下:
-
让signal成为一个新的
AbortSignal对象。 -
让global成为signal的相关全局对象。
-
在超时后运行步骤,给定global、"
AbortSignal-timeout"、milliseconds,以及以下步骤:-
在全局任务队列中排队,在global上,基于signal和新的"
TimeoutError"DOMException执行signal abort。
在此超时时间内,如果signal已为其
abort事件注册了任何事件监听器,则必须从global到signal保持一个强引用。 -
-
返回signal。
静态方法any(signals)的步骤是返回创建一个依赖的中止信号的结果,使用signals、AbortSignal和当前领域。
abortedgetter步骤是返回true如果this已中止;否则返回false。
throwIfAborted()方法步骤是抛出this的中止原因,如果this已中止。
此方法主要用于当接受AbortSignal的函数希望在特定检查点抛出(或返回一个被拒绝的promise),而不是将AbortSignal传递给其他方法时。例如,以下函数允许在每次尝试轮询条件之间中止。这为中止轮询过程提供了机会,即使实际的异步操作(即)不接受AbortSignal。
async function waitForCondition( func, targetValue, { signal} = {}) { while ( true ) { signal? . throwIfAborted(); const result= await func(); if ( result=== targetValue) { return ; } } }
属性 onabort 是一个 事件处理程序 IDL 属性,用于 onabort 事件处理程序,其 事件处理程序事件类型 是 abort。
对 AbortSignal
对象的更改代表了相应的 AbortController
对象的意图,但观察 AbortSignal
对象的 API 可以选择忽略这些更改。例如,如果操作已经完成。
当 AbortSignal
对象的 中止原因 不为未定义时,
该对象被认为是 已中止。
要向 AbortSignal
对象 signal 中 添加
一个算法 algorithm:
要从 AbortSignal
signal 中移除一个算法 algorithm,请从 signal 的中止算法中移除
algorithm。
要 发出中止信号,
给定一个 AbortSignal
对象 signal 和一个可选的 reason:
-
如果 signal 已经 中止,则返回。
-
将 signal 的 中止原因 设为 reason(如果提供);否则设为一个新的 "
AbortError"DOMException。 -
将 dependentSignalsToAbort 设为一个新的 列表。
-
运行中止步骤 对于 signal。
-
对于每个 dependentSignal 在 dependentSignalsToAbort 中,运行中止步骤 对于 dependentSignal。
要 运行中止步骤 对于一个
AbortSignal
signal:
要从 AbortSignal
对象列表 signals 创建一个依赖中止信号,使用 signalInterface(它必须是 AbortSignal
或继承自它的接口)和一个 realm:
3.2.1. 垃圾回收
一个未中止的依赖的
AbortSignal
对象,当其源信号列表非空并且它已为其 abort
事件注册了事件监听器或者其中止算法列表非空时,不能被垃圾回收。
3.3.
在 API 中使用 AbortController
和 AbortSignal
对象
任何使用 promises 表示可以中止操作的 Web 平台 API 必须遵循以下规则:
- 通过
signal字典成员接受AbortSignal对象。 - 通过使用
AbortSignal对象的中止原因来拒绝 promise,从而传达操作已中止。 - 如果
AbortSignal已经中止,则立即拒绝,否则: - 使用中止算法机制来观察
AbortSignal对象的更改,并以不导致与其他观察者冲突的方式执行此操作。
不使用 promises 的 API 仍应尽可能遵循上述规则。
4. 节点
4.1. “DOM”简介
在其原始意义上,“DOM”是一个用于访问和操作文档(特别是HTML和XML文档)的API。在本规范中,术语“文档”用于任何基于标记的资源,从简短的静态文档到包含丰富多媒体的长篇文章或报告,以及功能齐全的交互式应用程序。
每个这样的文档都表示为一个节点树。树中的一些节点可以有子节点,而其他的总是叶子节点。
为了说明这一点,考虑以下HTML文档:
<!DOCTYPE html> < html class = e > < head >< title > Aliens?</ title ></ head > < body > Why yes.</ body > </ html >
它表示如下:
请注意,由于HTML解析的神奇之处,并非所有ASCII空白字符都被转化为文本节点,但总体概念是清晰的。标记进入,树形节点输出。
可以使用非常棒的Live DOM Viewer来更详细地探索这个问题。
4.2. 节点树
节点是实现了实现Node的对象。节点参与一个称为节点树的树。
实际上,你会处理更具体的对象。
实现
Node 的对象还会实现
一个继承接口:Document、
DocumentType、
DocumentFragment、
Element、
CharacterData
或 Attr。
实现 DocumentFragment
的对象有时会实现 ShadowRoot。
实现 Element 的对象
通常还会实现一个继承接口,例如
HTMLAnchorElement。
实现 CharacterData
的对象还会实现一个继承接口:Text、
ProcessingInstruction
或 Comment。
实现 Text 的对象有时会实现
CDATASection。
因此,每个 节点的 主接口是以下之一:Document、
DocumentType、
DocumentFragment、
ShadowRoot、
Element 或
Element
的继承接口、
Attr、Text、CDATASection、
ProcessingInstruction
或 Comment。
为简洁起见,本规范将实现 Node 和一个
继承接口 NodeInterface 的对象,称为
NodeInterface 节点。
节点树受到如下约束, 表示为一个 节点与其潜在子节点之间的关系:
Document-
按树序:
-
零个或多个
ProcessingInstruction或Comment节点。 -
可选的一个
DocumentType节点。 -
零个或多个
ProcessingInstruction或Comment节点。 -
零个或多个
ProcessingInstruction或Comment节点。
-
DocumentFragmentElement-
零个或多个
Element或CharacterData节点。 DocumentTypeCharacterDataAttr-
没有子节点。
Attr 节点出于历史原因参与一棵树;它们永远没有(非 null 的)父节点或任何子节点,因此在一棵树中独自存在。
要确定一个节点 node 的 长度,运行以下步骤:
-
如果 node 是一个
DocumentType或Attr节点,则返回 0。 -
如果 node 是一个
CharacterData节点,则返回 node 的 数据的长度。 -
返回 node 的子节点的数量。
4.2.1. 文档树
一个文档的文档元素是 其父节点为 该文档的元素,如果它 存在的话;否则为 null。
如果一个节点在文档树中,则它在文档中。 术语在 文档中不应再被使用。它表明 使用该术语的标准尚未更新,以考虑影子树。
4.2.2. 影子树
影子根总是通过其宿主附加到另一个节点树。因此,影子树永远不会是孤立的。影子根的宿主的节点树有时被称为光树。
当一个节点的包含影子的根是一个文档时,该节点被认为是已连接的。
4.2.2.1. 插槽
一个插槽有一个关联的名称(一个字符串)。除非另有说明,否则它是空字符串。
-
如果element是一个插槽,localName是
name,且namespace为空:
一个插槽是一个影子树中的第一个,在树顺序中,其名称为空字符串的插槽,有时被称为“默认插槽”。
一个插槽有一个关联的分配的节点(一个可插槽对象的列表)。除非另有说明,否则它是空的。
4.2.2.2. 可插槽对象
一个可插槽对象有一个关联的名称(一个字符串)。除非另有说明,否则它是空字符串。
-
如果localName是
slot且namespace为空:
字母A 可插槽元素有一个关联的已分配插槽(null或插槽)。 除非另有说明,否则它为null。字母A 可插槽元素是已分配的,如果它的已分配插槽非null。
一个可插槽对象有一个关联的手动插槽分配(null或插槽)。除非另有说明,否则它是null。
一个可插槽对象的手动插槽分配可以使用对插槽的弱引用来实现,因为这个变量不能直接从脚本访问。
4.2.2.3. 查找插槽和可插槽对象
要查找插槽,对于给定的可插入对象 slottable 和一个可选的布尔值 open(默认为 false):
要查找可插入对象,对于给定的插槽 slot:
要查找扁平化可插入对象,对于给定的插槽 slot:
-
设 result 为 « »。
-
设 slottables 为给定 slot 查找可插入对象的结果。
-
对于 slottables 中的每个 node:
-
-
设 temporaryResult 为给定 node 查找扁平化可插入对象的结果。
-
将 temporaryResult 中的每个可插入对象按顺序追加到 result。
-
-
否则,将 node 追加到 result。
-
-
返回 result。
4.2.2.4. 分配可插槽对象和插槽
要为插槽 slot 分配可插入对象:
4.2.2.5. 发出插槽变更信号
每个相同来源窗口代理都有一个信号插槽(集合中的一部分插槽),其初始值为空。[HTML]
要为一个插槽 slot 发出插槽更改信号:
4.2.3. 变异算法
给定一个 节点 node、一个 节点 parent、 null 或一个 节点 child,以及一个由 节点组成的 列表 childrenToExclude,要确保预插入有效性:
-
如果 parent 不是
Document、DocumentFragment或Element节点,则抛出一个“HierarchyRequestError”DOMException。 -
如果 node 是 parent 的包含宿主的含自身祖先,则 抛出一个“
HierarchyRequestError”DOMException。 -
如果 child 非 null,且其父节点不是 parent, 则抛出一个“
NotFoundError”DOMException。 -
如果 node 不是
DocumentFragment、DocumentType、Element或CharacterData节点,则抛出一个 “HierarchyRequestError”DOMException。 -
如果 parent 不是文档:
-
如果 node 是文档类型,则抛出 一个 “
HierarchyRequestError”DOMException。 -
返回。
-
-
如果 node 是一个
Text节点,则抛出一个 “HierarchyRequestError”DOMException。 -
如果 node 是一个
CharacterData节点,则返回。 -
如果 node 是一个
DocumentFragment节点:-
如果 node 有多个元素子节点,或者有一个
Text节点子节点,则抛出 一个 “HierarchyRequestError”DOMException。
-
-
如果 node 是一个
DocumentFragment或Element节点:-
如果以下任一条件为真:
-
返回。
-
-
如果以下任一条件为真:
规范可以为全部或部分节点定义 插入步骤。 如下方插入算法所示,该算法会接收 insertedNode。这些步骤不得修改 insertedNode 所参与的节点树、创建浏览上下文、 触发事件, 或以其他方式执行 JavaScript。不过,这些步骤可以排入任务,以异步执行这些操作。
尽管插入步骤不能执行 JavaScript(以及其他操作), 但它们确实会产生脚本可观察到的后果。请考虑以下示例:
const h1 = document. querySelector( 'h1' );
const fragment = new DocumentFragment();
const script = fragment. appendChild( document. createElement( 'script' ));
const style = fragment. appendChild( document. createElement( 'style' ));
script. innerText= 'console.log(getComputedStyle(h1).color)' ; // 输出 'rgb(255, 0, 0)'
style. innerText = 'h1 {color: rgb(255, 0, 0);}' ;
document. body. append( fragment);
上述示例中的脚本会输出 ,因为以下操作按顺序发生:
规范也可以为全部或部分 节点定义 连接后步骤。如下方 插入 算法所示,该算法会接收 connectedNode。
连接后步骤的目的是为 节点提供一个机会, 使其能够执行任何与连接有关的操作,包括修改 connectedNode 所参与的节点树、 创建浏览上下文, 或以其他方式执行 JavaScript。这些步骤允许相对于脚本原子地插入一批节点, 所有主要副作用都在整批节点插入节点树完成之后发生。这可确保所有待处理的节点树 插入都完全结束后,才会发生更多插入。
要将一个节点 node 插入一个 节点 parent 中,并使其位于 null 或一个节点 child 之前,可带有一个可选布尔值 suppressObservers(默认为 false):
-
如果 node 是一个
DocumentFragment节点,则令 nodes 为 node 的子节点;否则为 « node »。 -
令 count 为 nodes 的大小。
-
如果 count 为 0,则返回。
-
如果 node 是一个
DocumentFragment节点:-
在 suppressObservers 设置为 true 的情况下,移除其子节点。
-
为 node 使用 « »、nodes、null 和 null 排入一个树突变记录。
此步骤有意不考虑 suppressObservers。
-
-
如果 child 非 null:
-
如果 child 非 null,则令 previousSibling 为 child 的上一个同级 节点;否则令其为 parent 的最后一个子节点。
-
对于 nodes 中按树顺序排列的每个 node:
-
如果 parent 是一个影子宿主,其影子根的 槽位分配为“
named”, 且 node 是一个 可分配槽位对象,则为 node 分配槽位。 -
如果 parent 的根是一个影子根,且 parent 是一个槽位,其已分配节点为空列表, 则为 parent 运行发出槽位变更信号。
-
使用 node 的根运行为树分配可分配槽位对象。
-
对于 node 的每个包含影子的含自身后代 inclusiveDescendant,按包含影子的树顺序:
-
使用 inclusiveDescendant 运行插入步骤。
-
如果 inclusiveDescendant 是一个元素,且 inclusiveDescendant 的自定义元素注册表非 null:
-
如果 inclusiveDescendant 的自定义元素注册表的 是否限定作用域为 true,则将 inclusiveDescendant 的节点文档追加到 inclusiveDescendant 的自定义元素注册表的 限定作用域文档集中。
-
如果 inclusiveDescendant 是自定义的,则使用 inclusiveDescendant、回调名称 “
connectedCallback”和 « » 排入一个自定义元素回调反应。 -
否则,尝试升级 inclusiveDescendant。
如果这成功升级了 inclusiveDescendant,则在升级元素 算法期间,会自动排入其
connectedCallback。
-
-
否则,如果 inclusiveDescendant 是一个影子根, inclusiveDescendant 的自定义元素注册表 非 null,且 inclusiveDescendant 的自定义元素注册表的 是否限定作用域为 true,则将 inclusiveDescendant 的节点文档 追加到 inclusiveDescendant 的自定义元素注册表的 限定作用域文档集中。
-
-
如果 suppressObservers 为 false,则为 parent 使用 nodes、« »、previousSibling 和 child 排入一个树突变记录。
-
为 parent 运行子节点变更步骤。
-
令 staticNodeList 为一个节点列表,初始为 « »。
我们会在对任何节点调用连接后步骤之前,收集所有 节点,而不是在遍历节点树的同时调用 连接后步骤。这是因为 连接后步骤可以修改树的结构, 从而使实时遍历变得不安全,并可能导致对同一个 节点多次调用 连接后步骤。
-
对于 nodes 中按树顺序排列的每个 node:
-
对于 node 的每个包含影子的含自身后代 inclusiveDescendant,按包含影子的树顺序: 将 inclusiveDescendant 追加到 staticNodeList。
-
规范可以为全部或部分节点定义 移动步骤。 如下方移动算法所示,该算法会接收一个 节点 movedNode、一个布尔值 isSubtreeRoot,以及一个节点 oldAncestor。 与插入步骤类似,这些步骤不得修改 movedNode 所参与的节点树、创建浏览上下文、 触发事件, 或以其他方式执行 JavaScript。不过,这些步骤可以排入任务,以异步执行这些操作。
要将一个节点 node 移动到一个节点 newParent 中,并使其位于 null 或一个节点 child 之前:
-
如果 newParent 的包含影子的根与 node 的包含影子的根不同,则抛出一个 “
HierarchyRequestError”DOMException。 -
如果 node 是 newParent 的包含宿主的含自身祖先, 则抛出一个“
HierarchyRequestError”DOMException。 -
如果 child 非 null,且其父节点不是 newParent, 则抛出一个“
NotFoundError”DOMException。 -
如果 node 不是
Element或CharacterData节点,则 抛出一个“HierarchyRequestError”DOMException。 -
如果 node 是一个
Text节点,且 newParent 是一个 文档, 则抛出一个“HierarchyRequestError”DOMException。 -
如果 newParent 是一个文档,node 是一个
Element节点,并且 newParent 已有一个元素 子节点、 child 是一个文档类型,或者 child 非 null 且在 child 之后存在一个文档类型,则抛出一个 “HierarchyRequestError”DOMException。 -
令 oldParent 为 node 的父节点。
-
断言:oldParent 非 null。
-
给定 node,运行实时范围预移除步骤。
-
对于每个
NodeIterator对象 iterator,如果其 根的节点文档是 node 的 节点文档:给定 node 和 iterator,运行NodeIterator预移除步骤。 -
令 oldPreviousSibling 为 node 的上一个同级节点。
-
令 oldNextSibling 为 node 的下一个同级节点。
-
如果 oldParent 的根是一个影子根,且 oldParent 是一个槽位,其已分配节点 为空,则为 oldParent 运行发出槽位变更信号。
-
-
使用 oldParent 的根运行为树分配可分配槽位对象。
-
使用 node 运行为树分配可分配槽位对象。
-
-
如果 child 非 null:
-
如果 child 非 null,则令 newPreviousSibling 为 child 的上一个同级节点;否则令其为 newParent 的最后一个子节点。
-
如果 newParent 是一个影子宿主,其影子根的 槽位分配为“
named”,且 node 是一个 可分配槽位对象, 则为 node 分配槽位。 -
如果 newParent 的根是一个影子根,且 newParent 是一个槽位,其已分配节点 为空,则为 newParent 运行发出槽位变更信号。
-
使用 node 的根运行为树分配可分配槽位对象。
-
对于 node 的每个包含影子的含自身后代 inclusiveDescendant,按包含影子的树顺序:
-
如果 inclusiveDescendant 是 node,则令 isSubtreeRoot 为 true;否则为 false。
-
使用 inclusiveDescendant、isSubtreeRoot 和 oldParent 运行移动步骤。
由于移动算法是一个独立于 插入和移除的原语, 因此它不会为 inclusiveDescendant 调用插入步骤 或移除步骤。
-
如果 inclusiveDescendant 是自定义的,且 newParent 已连接,则使用 inclusiveDescendant、回调名称 “
connectedMoveCallback”和 « » 排入一个自定义元素回调反应。
-
-
为 oldParent 使用 « »、« node »、 oldPreviousSibling 和 oldNextSibling 排入一个树突变记录。
-
为 newParent 使用 « node »、« »、 newPreviousSibling 和 child 排入一个树突变记录。
要在一个节点 parent 中,使用一个节点 node 替换一个节点 child:
-
给定 node、parent、 child 和 « child »,确保预插入有效性。
-
令 referenceChild 为 child 的下一个同级节点。
-
如果 referenceChild 是 node,则将 referenceChild 设置为 node 的下一个同级节点。
-
令 previousSibling 为 child 的上一个同级节点。
-
令 removedNodes 为空集。
-
如果 child 的父节点非 null:
-
将 removedNodes 设置为 « child »。
-
在 suppressObservers 设置 为 true 的情况下,移除 child。
只有当 child 是 node 时,上述条件才可能为 false。
-
-
如果 node 是一个
DocumentFragment节点,则令 nodes 为 node 的子节点;否则为 « node »。 -
在 suppressObservers 设置为 true 的情况下,将 node 插入 parent 中,并使其位于 referenceChild 之前。
-
为 parent 使用 nodes、 removedNodes、previousSibling 和 referenceChild 排入一个树突变记录。
-
返回 child。
要在一个节点 parent 中,使用一个节点或 null node 替换全部:
-
令 removedNodes 为 parent 的子节点。
-
令 addedNodes 为空集。
-
如果 node 是一个
DocumentFragment节点,则将 addedNodes 设置为 node 的子节点。 -
否则,如果 node 非 null,则将 addedNodes 设置为 « node »。
-
按树顺序移除 parent 的所有子节点,并将 suppressObservers 设置为 true。
-
如果 node 非 null,则在 suppressObservers 设置为 true 的情况下,将 node 插入 parent 中,并使其位于 null 之前。
-
如果 addedNodes 或 removedNodes 中任一个非空, 则为 parent 使用 addedNodes、 removedNodes、null 和 null 排入一个树突变记录。
此算法不会对 节点树约束进行任何检查。规范作者需要谨慎使用它。
-
如果 child 的父节点不是 parent,则抛出一个 “
NotFoundError”DOMException。 -
移除 child。
-
返回 child。
要移除一个节点 node,可带有一个可选布尔值 suppressObservers(默认为 false):
-
令 parent 为 node 的父节点。
-
断言:parent 非 null。
-
给定 node,运行实时范围预移除步骤。
-
对于每个
NodeIterator对象 iterator,如果其 根的节点文档是 node 的 节点文档:给定 node 和 iterator,运行NodeIterator预移除步骤。 -
令 oldPreviousSibling 为 node 的上一个同级节点。
-
令 oldNextSibling 为 node 的下一个同级节点。
-
如果 parent 的根是一个影子根,且 parent 是一个槽位,其已分配节点为空列表, 则为 parent 运行发出槽位变更信号。
-
-
使用 parent 的根运行为树分配可分配槽位对象。
-
使用 node 运行为树分配可分配槽位对象。
-
-
使用 node、true 和 parent 运行移除步骤。
-
令 isParentConnected 为 parent 的连接状态。
-
如果 node 是自定义的,且 isParentConnected 为 true,则使用 node、回调名称 “
disconnectedCallback”和 « » 排入一个自定义元素回调反应。 -
对于 node 的每个包含影子的后代 descendant,按 包含影子的树顺序:
-
使用 descendant、false 和 parent 运行移除步骤。
-
如果 descendant 是自定义的,且 isParentConnected 为 true,则使用 descendant、 回调名称“
disconnectedCallback”和 « » 排入一个自定义元素回调反应。
-
-
对于 parent 的每个含自身祖先 inclusiveAncestor,然后对于 inclusiveAncestor 的已注册观察器列表中的每个 registered,如果 registered 的 选项["
subtree"] 为 true,则向 node 的 已注册观察器列表中追加一个新的临时已注册观察器,其 观察器为 registered 的 观察器,选项为 registered 的选项,且 来源为 registered。 -
如果 suppressObservers 为 false,则为 parent 使用 « »、« node »、oldPreviousSibling 和 oldNextSibling 排入一个树突变记录。
-
为 parent 运行子节点变更步骤。
4.2.4.
混入 NonElementParentNode
Web 兼容性阻止 getElementById()
方法暴露在元素上(因此也不能暴露在 ParentNode 上)。
interface mixin {NonElementParentNode Element ?getElementById (DOMString ); };elementId Document includes NonElementParentNode ;DocumentFragment includes NonElementParentNode ;
要在给定一个节点 node 和一个 字符串 elementId 的情况下按 ID 获取元素,返回 node 的后代中,按树序排列的 第一个其 ID 为 elementId 的元素; 否则,如果没有这样的元素,则返回 null。
4.2.5.
Mixin DocumentOrShadowRoot
interface mixin {DocumentOrShadowRoot readonly attribute CustomElementRegistry ?customElementRegistry ; };Document includes DocumentOrShadowRoot ;ShadowRoot includes DocumentOrShadowRoot ;
registry = documentOrShadowRoot .customElementRegistry-
返回 documentOrShadowRoot 的
CustomElementRegistry对象(如果有); 否则返回 null。
customElementRegistry getter
步骤
为:
DocumentOrShadowRoot
mixin 也预期会被其他
想要定义在文档和
影子根之间共享的 API
的标准使用。
4.2.6. Mixin ParentNode
interface mixin { [ParentNode SameObject ]readonly attribute HTMLCollection children ;readonly attribute Element ?firstElementChild ;readonly attribute Element ?lastElementChild ;readonly attribute unsigned long childElementCount ; [CEReactions ,Unscopable ]undefined prepend ((Node or DOMString )...); [nodes CEReactions ,Unscopable ]undefined append ((Node or DOMString )...); [nodes CEReactions ,Unscopable ]undefined replaceChildren ((Node or DOMString )...); [nodes CEReactions ]undefined moveBefore (Node ,node Node ?);child Element ?querySelector (DOMString ); [selectors NewObject ]NodeList querySelectorAll (DOMString ); };selectors Document includes ParentNode ;DocumentFragment includes ParentNode ;Element includes ParentNode ;
collection = node .children- 返回子元素。
element = node .firstElementChild- 返回第一个属于元素的子节点;否则返回 null。
element = node .lastElementChild- 返回最后一个属于元素的子节点;否则返回 null。
node . prepend(nodes)-
将 nodes 插入到 node 的第一个子节点之前,同时将 nodes 中的字符串替换为等效的
Text节点。如果违反了节点树的约束,则抛出一个“
HierarchyRequestError”DOMException。 node . append(nodes)-
将 nodes 插入到 node 的最后一个子节点之后,同时将 nodes 中的字符串替换为等效的
Text节点。如果违反了节点树的约束,则抛出一个“
HierarchyRequestError”DOMException。 node . replaceChildren(nodes)-
用 nodes 替换 node 的所有子节点,同时将 nodes 中的字符串替换为等效的
Text节点。如果违反了节点树的约束,则抛出一个“
HierarchyRequestError”DOMException。 node . moveBefore(movedNode, child)-
在不先移除 movedNode 的情况下,将其移动到 node 中;如果 child 非 null,则移动到 child 之后;否则移动到 node 的最后一个子节点之后。此 方法会保留与 movedNode 关联的状态。
如果违反了节点树的约束,或者无法保留与被移动节点关联的状态,则抛出一个“
HierarchyRequestError”DOMException。 node . querySelector(selectors)node . querySelectorAll(selectors)
children 获取器步骤是返回一个以
this
为根、仅匹配作为元素的
子节点的
HTMLCollection
集合。
prepend(nodes) 方法步骤如下:
append(nodes) 方法步骤如下:
-
令 node 为在给定 nodes 和 this 的节点文档的情况下,将节点转换为一个节点的结果。
replaceChildren(nodes) 方法
步骤
如下:
moveBefore(node, child)
方法步骤如下:
querySelector(selectors) 方法
步骤是在对 this
运行对选择器字符串进行作用域匹配
selectors 的结果不是空列表时,返回第一个结果;否则返回 null。
querySelectorAll(selectors)
方法
步骤是返回对 this
运行
对选择器字符串进行作用域匹配 selectors 的静态结果。
4.2.7. 混入 NonDocumentTypeChildNode
Web 兼容性阻止 previousElementSibling
和
nextElementSibling
属性暴露在 doctype 上(因此也不能暴露在
ChildNode 上)。
interface mixin {NonDocumentTypeChildNode readonly attribute Element ?previousElementSibling ;readonly attribute Element ?nextElementSibling ; };Element includes NonDocumentTypeChildNode ;CharacterData includes NonDocumentTypeChildNode ;
element = node .previousElementSibling- 返回第一个先于它的、且为元素的兄弟节点; 否则返回 null。
element = node .nextElementSibling- 返回第一个跟随于它的、且为元素的兄弟节点; 否则返回 null。
4.2.8.
混入 ChildNode
interface mixin { [ChildNode CEReactions ,Unscopable ]undefined before ((Node or DOMString )...); [nodes CEReactions ,Unscopable ]undefined after ((Node or DOMString )...); [nodes CEReactions ,Unscopable ]undefined replaceWith ((Node or DOMString )...); [nodes CEReactions ,Unscopable ]undefined remove (); };DocumentType includes ChildNode ;Element includes ChildNode ;CharacterData includes ChildNode ;
node .before(...nodes)-
将 nodes 紧接着插入到 node 之前,同时将 nodes 中的字符串替换为等效的
Text节点。如果违反了 节点树 的约束,则抛出一个“
HierarchyRequestError”DOMException。 node .after(...nodes)-
将 nodes 紧接着插入到 node 之后,同时将 nodes 中的字符串替换为等效的
Text节点。如果违反了 节点树 的约束,则抛出一个“
HierarchyRequestError”DOMException。 node .replaceWith(...nodes)-
用 nodes 替换 node,同时将 nodes 中的字符串替换为等效的
Text节点。如果违反了 节点树 的约束,则抛出一个“
HierarchyRequestError”DOMException。 node .remove()- 移除 node。
before(nodes) 方法步骤如下:
after(nodes) 方法步骤如下:
replaceWith(nodes) 方法步骤如下:
4.2.9. 混入 Slottable
interface mixin {Slottable readonly attribute HTMLSlotElement ?assignedSlot ; };Element includes Slottable ;Text includes Slottable ;
4.2.10.
旧式集合:NodeList
和 HTMLCollection
集合(collection) 是一个表示 节点列表的对象。 集合可以是 实时(live) 或 静态(static)。 除非另有说明,集合必须是实时的。
如果集合是实时的, 那么该对象上的属性和方法必须针对实际底层数据操作,而不是数据快照。
当集合创建时,会与其关联一个筛选器和一个根节点。
然后集合 代表 一个以集合根节点为根的子树视图,仅包含与指定筛选器匹配的节点。该视图是线性的。如果没有特殊要求,集合内的节点必须按树顺序排列。
4.2.10.1.
接口 NodeList
[Exposed =Window ]interface {NodeList getter Node ?item (unsigned long );index readonly attribute unsigned long length ;iterable <Node >; };
- collection .
length - 返回集合中节点的数量。
- element = collection .
item(index)- element = collection[index]
- 返回集合中索引为 index 的节点。这些 节点按树顺序排序。
该对象的受支持的属性索引是从零到 由集合表示的节点数量减一范围内的数字。如果不存在此类 元素,则不存在受支持的属性索引。
length 属性必须返回
由集合表示的节点数量。
item(index) 方法必须返回集合中的第
index个节点。如果集合中不存在第
index个节点,则该方法必须
返回 null。
4.2.10.2.
接口HTMLCollection
[Exposed =Window ,LegacyUnenumerableNamedProperties ]interface {HTMLCollection readonly attribute unsigned long length ;getter Element ?item (unsigned long );index getter Element ?(namedItem DOMString ); };name
一个 HTMLCollection
对象是一个由元素组成的集合。
HTMLCollection
是一个我们无法从 Web 中摆脱的历史遗留产物。
虽然开发者当然可以继续使用它,但新的 API 标准设计者不应使用
它(应改用 IDL 中的 sequence<T>)。
- collection .
length - 返回 集合中元素的数量。
- element = collection .
item(index)- element = collection[index]
- 返回集合中索引为 index 的元素。 这些元素按树 序排序。
- element = collection .
namedItem(name)- element = collection[name]
- 返回 collection 中第一个 ID 或 name 为 name 的元素。
对象的支持的属性索引是范围从 零到由集合表示的元素数量减一的数字。如果没有这样的 元素,则不存在支持的属性索引。
length getter 步骤是返回
由集合表示的节点数量。
item(index) 方法步骤是
返回集合中的第
indexth 个元素。如果集合中
没有第 indexth 个元素,则该方法
必须返回 null。
支持的属性名称是这些步骤返回的列表中的值:
-
令 result 为空列表。
-
返回 result。
namedItem(key) 方法步骤为:
-
如果 key 是空字符串,则返回 null。
-
如果没有这样的元素,则返回 null。
4.3. Mutation observers
每个相同来源窗口代理都有一个突变观察者微任务排队(布尔值),其初始值为false。[HTML]
每个相同来源窗口代理还具有待处理的突变观察者(一个包含零个或多个MutationObserver对象的集合),其初始状态为空。
要 排队一个突变观察者微任务:
-
如果外围代理的突变观察者微任务已排队为 true,则返回。
-
将外围代理的突变观察者微任务已排队设为 true。
要通知突变观察者:
每个节点都有一个已注册观察者 列表(一个包含零个或多个列表的 已注册 观察者),其初始为空。
一个已注册
观察者由一个
观察者(一个 MutationObserver
对象)和
选项(一个 MutationObserverInit
字典)组成。
一个临时 已注册观察者是一个 已注册 观察者,它还由一个 来源(一个已注册观察者)组成。
临时已注册观察者用于在给定
节点被移除后,跟踪其后代中的突变,以便当 subtree
在该节点的
父节点上设为 true 时,
这些突变不会丢失。
4.3.1.
接口 MutationObserver
[Exposed =Window ]interface {MutationObserver constructor (MutationCallback );callback undefined observe (Node ,target optional MutationObserverInit = {});options undefined disconnect ();sequence <MutationRecord >takeRecords (); };callback =MutationCallback undefined (sequence <MutationRecord >,mutations MutationObserver );observer dictionary {MutationObserverInit boolean =childList false ;boolean ;attributes boolean ;characterData boolean =subtree false ;boolean ;attributeOldValue boolean ;characterDataOldValue sequence <DOMString >; };attributeFilter
一个 MutationObserver
对象可用于观察节点的树的突变。
每个 MutationObserver
对象都有以下关联概念:
- 创建时设置的回调。
- 一个节点列表(一个由指向节点的弱引用组成的列表),其初始为空。
- 一个记录队列(一个包含零个或多个
MutationRecord对象的队列),其初始为空。
observer = newMutationObserver(callback)- 构造一个
MutationObserver对象,并将其回调设置为 callback。调用 callback 时,以一个MutationRecord对象列表 作为第一个参数,并以构造的MutationObserver对象作为第二个参数。通过observe()方法注册的节点 发生突变后,将调用该回调。 observer .observe(target, options)-
指示用户代理观察给定的 target
(一个节点),并根据
options(一个对象)给出的条件报告任何突变。
options 参数允许通过对象成员设置突变 观察选项。可以使用以下对象成员:
childList- 如果要观察 target 的子节点的突变, 则设置为 true。
attributes- 如果要观察 target 的
属性
的突变,则设置为 true。如果指定了
attributeOldValue或attributeFilter, 则可以省略。 characterData- 如果要观察 target 的
数据的突变,
则设置为 true。如果指定了
characterDataOldValue, 则可以省略。 subtree- 如果不仅要观察 target 的突变,还要 观察 target 的 后代的突变, 则设置为 true。
attributeOldValue- 如果
attributes为 true 或被省略,并且需要记录突变前 target 的 属性 值, 则设置为 true。 characterDataOldValue- 如果
characterData被设置为 true 或被省略,并且需要记录突变前 target 的 数据, 则设置为 true。 attributeFilter- 如果不需要观察所有
属性
突变,并且
attributes为 true 或被省略,则将其设置为一个由属性 局部名称(不含命名空间) 组成的列表。
observer .disconnect()- 使 observer 停止观察任何突变。在再次使用
observe()方法之前,不会调用 observer 的回调。 observer .takeRecords()- 清空记录 队列并返回其中原有的内容。
observe(target, options)
方法步骤如下:
-
如果 options["
attributeOldValue"] 或 options["attributeFilter"] 中任一个存在,且 options["attributes"] 不存在,则将 options["attributes"] 设置为 true。 -
如果 options["
characterDataOldValue"] 存在,且 options["characterData"] 不存在,则将 options["characterData"] 设置为 true。 -
如果 options["
childList"]、 options["attributes"] 和 options["characterData"] 均不为 true,则抛出一个TypeError。 -
如果 options["
attributeOldValue"] 为 true,且 options["attributes"] 为 false,则抛出一个TypeError。 -
如果 options["
attributeFilter"] 存在,且 options["attributes"] 为 false,则抛出一个TypeError。 -
如果 options["
characterDataOldValue"] 为 true,且 options["characterData"] 为 false,则抛出一个TypeError。 -
对于 target 的 已注册观察器列表中的每个 registered:如果 registered 的 观察器是 this:
-
否则:
disconnect() 方法步骤如下:
4.3.2. 排队突变记录
要为 target 的 type 排队一个 突变记录, 带 name、namespace、oldValue、addedNodes、 removedNodes、previousSibling 和 nextSibling:
-
令 interestedObservers 为空映射。
-
令 nodes 为 target 的包含自身的祖先。
-
对于 nodes 中的每个 node,然后对于 node 的 每个 registered,该 node 的已注册观察器 列表:
-
令 options 为 registered 的 options。
-
如果以下各项均不为真
- node 不是 target 且
options["
subtree"] 为 false - type 为 "
attributes",且 options["attributes"] 要么不存在 要么为 false - type 为 "
attributes", options["attributeFilter"] 存在,且 options["attributeFilter"] 不包含 name,或 namespace 为非 null - type 为 "
characterData",且 options["characterData"] 要么不 存在,要么为 false - type 为 "
childList",且 options["childList"] 为 false
则:
-
令 mo 为 registered 的observer。
-
如果 interestedObservers[mo] 不存在,则 设置 interestedObservers[mo] 为 null。
-
如果 type 为 "
attributes" 且 options["attributeOldValue"] 为 true,或者 type 为 "characterData" 且 options["characterDataOldValue"] 为 true,则 设置 interestedObservers[mo] 为 oldValue。
- node 不是 target 且
options["
-
-
对于 interestedObservers 中的每个 observer → mappedOldValue:
-
令 record 为一个新的
MutationRecord对象,其type设置为 type,target设置为 target,attributeName设置为 name,attributeNamespace设置为 namespace,oldValue设置为 mappedOldValue,addedNodes设置为 addedNodes,removedNodes设置为 removedNodes,previousSibling设置为 previousSibling,并且nextSibling设置为 nextSibling。 -
将 observer 追加到周围代理的 待处理 mutation observers。
-
要为 target,带 addedNodes、removedNodes、previousSibling 和 nextSibling 排队一个树突变记录:
4.3.3.
接口 MutationRecord
[Exposed =Window ]interface {MutationRecord readonly attribute DOMString type ; [SameObject ]readonly attribute Node target ; [SameObject ]readonly attribute NodeList addedNodes ; [SameObject ]readonly attribute NodeList removedNodes ;readonly attribute Node ?previousSibling ;readonly attribute Node ?nextSibling ;readonly attribute DOMString ?attributeName ;readonly attribute DOMString ?attributeNamespace ;readonly attribute DOMString ?oldValue ; };
record .type- 如果是
属性
突变,则返回“
attributes”。 如果是对CharacterData节点的突变,则返回 “characterData”。如果是对 节点的 树的突变,则返回 “childList”。 record .target- 根据
type,返回受突变 影响的节点。 对于“attributes”,它是其 属性发生更改的 元素。对于 “characterData”,它是CharacterData节点。对于 “childList”, 它是其子节点发生更改的 节点。 record .addedNodesrecord .removedNodes- 分别返回添加和 移除的节点。
record .previousSiblingrecord .nextSibling- 分别返回所添加或移除节点的前一个同胞和下一个同胞; 否则返回 null。
record .attributeName- 返回发生更改的属性的局部名称;否则返回 null。
record .attributeNamespace- 返回发生更改的属性的命名空间;否则返回 null。
record .oldValue- 返回值取决于
type。 对于 “attributes”,它是发生更改的 属性 在更改前的值。 对于“characterData”,它是发生更改的 节点 在更改前的数据。对于 “childList”,它为 null。
type、target、
addedNodes、
removedNodes、
previousSibling、
nextSibling、
attributeName、
attributeNamespace 和
oldValue 属性必须返回它们被初始化为的值。
4.4. 接口 Node
[Exposed =Window ]interface :Node EventTarget {const unsigned short ELEMENT_NODE = 1;const unsigned short ATTRIBUTE_NODE = 2;const unsigned short TEXT_NODE = 3;const unsigned short CDATA_SECTION_NODE = 4;const unsigned short = 5; // legacyENTITY_REFERENCE_NODE const unsigned short = 6; // legacyENTITY_NODE const unsigned short PROCESSING_INSTRUCTION_NODE = 7;const unsigned short COMMENT_NODE = 8;const unsigned short DOCUMENT_NODE = 9;const unsigned short DOCUMENT_TYPE_NODE = 10;const unsigned short DOCUMENT_FRAGMENT_NODE = 11;const unsigned short = 12; // legacyNOTATION_NODE readonly attribute unsigned short nodeType ;readonly attribute DOMString nodeName ;readonly attribute USVString baseURI ;readonly attribute boolean isConnected ;readonly attribute Document ?ownerDocument ;Node getRootNode (optional GetRootNodeOptions = {});options readonly attribute Node ?parentNode ;readonly attribute Element ?parentElement ;boolean hasChildNodes (); [SameObject ]readonly attribute NodeList childNodes ;readonly attribute Node ?firstChild ;readonly attribute Node ?lastChild ;readonly attribute Node ?previousSibling ;readonly attribute Node ?nextSibling ; [CEReactions ]attribute DOMString ?nodeValue ; [CEReactions ]attribute DOMString ?textContent ; [CEReactions ]undefined normalize (); [CEReactions ,NewObject ]Node cloneNode (optional boolean =subtree false );boolean isEqualNode (Node ?);otherNode boolean isSameNode (Node ?); // legacy alias of ===otherNode const unsigned short DOCUMENT_POSITION_DISCONNECTED = 0x01;const unsigned short DOCUMENT_POSITION_PRECEDING = 0x02;const unsigned short DOCUMENT_POSITION_FOLLOWING = 0x04;const unsigned short DOCUMENT_POSITION_CONTAINS = 0x08;const unsigned short DOCUMENT_POSITION_CONTAINED_BY = 0x10;const unsigned short DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 0x20;unsigned short compareDocumentPosition (Node );other boolean contains (Node ?);other DOMString ?lookupPrefix (DOMString ?);namespace DOMString ?lookupNamespaceURI (DOMString ?);prefix boolean isDefaultNamespace (DOMString ?); [namespace CEReactions ]Node insertBefore (Node ,node Node ?); [child CEReactions ]Node appendChild (Node ); [node CEReactions ]Node replaceChild (Node ,node Node ); [child CEReactions ]Node removeChild (Node ); };child dictionary {GetRootNodeOptions boolean =composed false ; };
Node 是一个供所有节点使用的抽象
接口。你无法
获取它的直接实例。
每个节点都有一个关联的 节点 文档,它在创建时设置,并且是一个 文档。
给定一个 event,节点的获取父节点算法会在该节点已被分配时,返回该 节点的已分配槽;否则返回该 节点的父节点。
给定一个文档 document,要创建节点,使其 实现接口 interface:
node .nodeType-
根据 node 的类型返回相应的数字,如下所示:
Element(1)。Node.ELEMENT_NODEAttr(2)。Node.ATTRIBUTE_NODE- 一个独占
Text节点 (3)。Node.TEXT_NODECDATASection(4)。Node.CDATA_SECTION_NODEProcessingInstruction(7)。Node.PROCESSING_INSTRUCTION_NODEComment(8)。Node.COMMENT_NODEDocument(9)。Node.DOCUMENT_NODEDocumentType(10)。Node.DOCUMENT_TYPE_NODEDocumentFragment(11)。Node.DOCUMENT_FRAGMENT_NODE
node .nodeName-
根据 node 的类型返回相应的字符串,如下所示:
Element- 其HTML 大写限定名称。
Attr- 其限定名称。
- 一个独占
Text节点 - “
#text”。 CDATASection- “
#cdata-section”。 ProcessingInstruction- 其目标。
Comment- “
#comment”。 Document- “
#document”。 DocumentType- 其名称。
DocumentFragment- “
#document-fragment”。
nodeType 获取器步骤是根据 this 实现的接口,返回第一个匹配的
语句:
ElementELEMENT_NODE(1)AttrATTRIBUTE_NODE(2);- 一个独占
Text节点 TEXT_NODE(3);CDATASectionCDATA_SECTION_NODE(4);ProcessingInstructionPROCESSING_INSTRUCTION_NODE(7);CommentCOMMENT_NODE(8);DocumentDOCUMENT_NODE(9);DocumentTypeDOCUMENT_TYPE_NODE(10);DocumentFragmentDOCUMENT_FRAGMENT_NODE(11)。
nodeName 获取器步骤是根据 this 实现的接口,返回第一个匹配的
语句:
Element- 其HTML 大写限定名称。
Attr- 其限定名称。
- 一个独占
Text节点 - “
#text”。 CDATASection- “
#cdata-section”。 ProcessingInstruction- 其目标。
Comment- “
#comment”。 Document- “
#document”。 DocumentType- 其名称。
DocumentFragment- “
#document-fragment”。
node .baseURI- 返回 node 的节点文档的文档基准 URL。
baseURI 获取器步骤是返回 this 的
节点
文档的文档基准 URL,并将其序列化。
node .isConnected-
如果 node 已连接,则返回 true;否则返回 false。
node .ownerDocument- 返回节点文档。 对于文档,返回 null。
node .getRootNode()- 返回 node 的根。
node . getRootNode({ composed:true })- 返回 node 的影子包含根。
node .parentNode- 返回父节点。
node .parentElement- 返回父 元素。
node .hasChildNodes()- 返回 node 是否有 子节点。
node .childNodes- 返回子节点。
node .firstChild- 返回第一个子节点。
node .lastChild- 返回最后一个子节点。
node .previousSibling- 返回 前一个同胞。
node .nextSibling- 返回 下一个 同胞。
isConnected 获取器步骤是:如果
this 已连接,则返回 true;否则返回 false。
ownerDocument 获取器步骤是:如果
this 是一个文档,则返回 null;否则返回
this 的节点
文档。
一个文档的节点文档就是该 文档本身。所有节点在任何时候都有一个节点 文档。
getRootNode(options) 方法步骤是:如果
options["composed"]
为 true,则返回 this
的影子包含根;否则返回 this 的
根。
parentNode 获取器步骤是返回
this 的父节点。
parentElement 获取器步骤是返回
this 的父元素。
hasChildNodes() 方法步骤是:如果
this 有子节点,
则返回 true;否则返回 false。
childNodes 获取器步骤是返回一个以
this 为根、
仅匹配子节点的
NodeList。
firstChild 获取器步骤是返回
this 的第一个
子节点。
lastChild 获取器步骤是返回 this 的
最后一个
子节点。
previousSibling 获取器步骤是返回
this 的前一个同胞。
nextSibling 获取器步骤是返回
this 的下一个
同胞。
nodeValue 获取器步骤是根据 this 实现的接口,返回以下内容:
Attr- this 的值。
CharacterData- this 的数据。
- 否则
- Null。
nodeValue
设置器步骤是:如果给定值为 null,则改为像给定值是
空字符串一样操作;然后根据 this
实现的接口,按下述方式执行:
要使用一个节点 node 获取文本内容,根据 node 实现的接口,返回以下内容:
DocumentFragmentElement- node 的后代文本内容。
Attr- node 的值。
CharacterData- node 的数据。
- 否则
- Null。
textContent 获取器步骤是:
使用 this 运行获取文本内容,并返回其结果。
要在一个节点 parent 中使用字符串 string 字符串全部替换,运行以下步骤:
-
令 node 为 null。
-
如果 string 不是空字符串,则将 node 设置为在给定 parent 的节点文档和 string 的情况下,创建文本 节点的结果。
-
在 parent 中用 node 全部替换。
要使用一个节点 node 和一个字符串 value 设置文本内容, 根据 node 实现的接口, 按如下定义执行:
DocumentFragmentElement-
在 node 中使用 value 字符串全部 替换。
Attr-
使用 node 和 value 设置现有属性值。
CharacterData- 否则
-
不执行任何操作。
textContent
设置器步骤是:如果给定值为 null,则改为像给定值是
空字符串一样操作;然后使用 this 和给定值运行设置文本内容。
node .normalize()- 移除空的独占
Text节点,并将其余连续独占Text节点的 数据串联到它们的第一个节点中。
normalize() 方法步骤是:对于
this
的每个作为后代的独占 Text 节点
node,运行以下步骤:
-
令 length 为 node 的长度。
-
如果 length 为零,则移除 node,并继续处理 下一个独占
Text节点(如果存在)。 -
令 data 为 node 的 连续独占
Text节点(不包括其自身)的数据按树顺序进行的串联。 -
使用 length、0 和 data 替换 node 的数据。
-
令 currentNode 为 node 的下一个同胞。
-
当 currentNode 是一个独占
Text节点时:-
对于每个其起始 节点为 currentNode 的活动范围: 将 length 加到其起始偏移量,并将其 起始节点设置为 node。
-
对于每个其结束节点为 currentNode 的活动范围:将 length 加到其结束偏移量,并将其结束节点设置为 node。
-
对于每个其起始 节点为 currentNode 的 父节点,且其起始 偏移量为 currentNode 的 索引的活动范围: 将其起始 节点设置为 node,并将其 起始偏移量设置为 length。
-
对于每个其结束节点为 currentNode 的 父节点,且其结束 偏移量为 currentNode 的 索引的活动范围: 将其结束节点设置为 node,并将其 结束偏移量设置为 length。
-
将 currentNode 的长度加到 length。
-
将 currentNode 设置为其下一个 同胞。
-
-
按树顺序移除 node 的连续独占
Text节点 (不包括其自身)。
node . cloneNode([subtree = false])- 返回 node 的副本。如果 subtree 为 true,则该副本还包括 node 的后代。
node . isEqualNode(otherNode)- 返回 node 和 otherNode 是否具有相同属性。
HTML 为多个元素定义了克隆步骤,例如
input、
script
和
template。
SVG 也应当为其
script
元素这样做,但它并未这样做。
给定一个节点
node、
一个可选的文档 document
(默认为 node 的节点文档)、布尔值
subtree(默认为 false)、节点或 null
parent(默认为 null),以及 null 或一个
CustomElementRegistry
对象 fallbackRegistry
(默认为 null),要克隆节点:
-
令 copy 为在给定 node、 document 和 fallbackRegistry 的情况下,克隆单个节点的结果。
-
如果 parent 非 null,则将 copy 附加到 parent。
-
如果 subtree 为 true,则对于 node 的 子节点中的每个 child,按树顺序:在给定 child 的情况下克隆 节点,其中 document 设置为 document, subtree 设置为 subtree, parent 设置为 copy,并且 fallbackRegistry 设置为 fallbackRegistry。
-
如果 node 是一个元素,node 是一个 影子 宿主,并且 node 的影子根的 可克隆为 true:
-
如果 shadowRootRegistry 是全局自定义元素 注册表,则将 shadowRootRegistry 设置为 document 的 自定义元素注册表的有效全局自定义 元素注册表。
-
使用 copy、node 的 影子根的模式、true、 node 的 影子根的可序列化、node 的 影子根的委托 焦点、node 的 影子根的槽 分配以及 shadowRootRegistry,附加影子根。
-
将 copy 的影子根的 保持自定义元素 注册表为 null设置为 node 的 影子根的保持自定义元素 注册表为 null。
-
对于 node 的影子根的 子节点中的每个 child,按树顺序:在给定 child 的情况下克隆节点,其中 document 设置为 document, subtree 设置为 true,并且 parent 设置为 copy 的影子根。
这里有意不传递 fallbackRegistry 参数。
-
返回 copy。
给定一个节点 node、
文档
document,以及 null 或一个 CustomElementRegistry
对象
fallbackRegistry,要克隆单个
节点:
-
令 copy 为 null。
-
如果 node 是一个元素:
-
令 registry 为 node 的自定义元素注册表。
-
如果 registry 为 null,则将 registry 设置为 fallbackRegistry。
-
如果 registry 是全局自定义元素 注册表,则将 registry 设置为 document 的自定义元素注册表的 有效全局自定义 元素注册表。
-
将 copy 设置为在给定 document、node 的局部 名称、node 的 命名空间、node 的命名空间前缀、 node 的
is值、false 和 registry 的情况下,创建 元素的结果。
-
-
否则,如果 node 是一个文档,则将 copy 设置为在给定 document 的相关 Realm的情况下,创建 文档的结果,该文档实现与 node 相同的接口。
-
根据 node 实现的接口,满足以下附加要求:
DocumentDocumentTypeAttrTextComment-
将 copy 的数据设置为 node 的数据。
ProcessingInstruction- 否则
-
不执行任何操作。
-
如果 node 是一个文档,则将 document 设置为 copy。
-
将 copy 的节点文档设置为 document。
-
返回 copy。
cloneNode(subtree) 方法步骤如下:
-
如果 this 是一个影子根,则抛出一个 “
NotSupportedError”DOMException。
isSameNode(otherNode) 方法步骤是:
如果 otherNode 是 this,则返回 true;否则返回 false。
node .compareDocumentPosition(other)-
返回一个位掩码,指示 other 相对于 node
的位置。可以设置以下位:
(1)Node.DOCUMENT_POSITION_DISCONNECTED- 当 node 和 other 不在同一 树中时设置。
(2)Node.DOCUMENT_POSITION_PRECEDING- 当 other 位于 node 之前时设置。
(4)Node.DOCUMENT_POSITION_FOLLOWING- 当 other 位于 node 之后时设置。
(8)Node.DOCUMENT_POSITION_CONTAINS- 当 other 是 node 的祖先时设置。
(16,十六进制为 10)Node.DOCUMENT_POSITION_CONTAINED_BY- 当 other 是 node 的后代时设置。
node .contains(other)- 如果 other 是 node 的包含自身的后代,则返回 true; 否则返回 false。
以下是 compareDocumentPosition()
作为掩码返回的常量:
DOCUMENT_POSITION_DISCONNECTED(1);DOCUMENT_POSITION_PRECEDING(2);DOCUMENT_POSITION_FOLLOWING(4);DOCUMENT_POSITION_CONTAINS(8);DOCUMENT_POSITION_CONTAINED_BY(16, 十六进制为 10);DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC(32,十六进制为 20)。
compareDocumentPosition(other)
方法
步骤如下:
-
如果 this 是 other,则返回零。
-
令 node1 为 other,并令 node2 为 this。
-
令 attr1 和 attr2 为 null。
-
如果 node2 是一个属性:
-
将 attr2 设置为 node2,并将 node2 设置为 attr2 的 元素。
-
如果 attr1 和 node1 非 null,并且 node2 是 node1:
-
-
如果 attr 与 attr1 相等,则返回
DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC与DOCUMENT_POSITION_PRECEDING相加的结果。 -
如果 attr 与 attr2 相等,则返回
DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC与DOCUMENT_POSITION_FOLLOWING相加的结果。
-
-
-
-
如果 node1 或 node2 为 null,或者 node1 的根不是 node2 的根,则返回
DOCUMENT_POSITION_DISCONNECTED、DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC以及DOCUMENT_POSITION_PRECEDING或DOCUMENT_POSITION_FOLLOWING之一相加的结果, 约束条件是这些选择合在一起必须保持一致。返回
DOCUMENT_POSITION_PRECEDING还是DOCUMENT_POSITION_FOLLOWING通常通过指针比较实现。在 JavaScript 实现中,可以使用缓存的Math值。. random() -
如果 node1 是 node2 的祖先且 attr1 为 null,或者 node1 是 node2 且 attr2 非 null,则返回
DOCUMENT_POSITION_CONTAINS与DOCUMENT_POSITION_PRECEDING相加的结果。 -
如果 node1 是 node2 的后代且 attr2 为 null,或者 node1 是 node2 且 attr1 非 null,则返回
DOCUMENT_POSITION_CONTAINED_BY与DOCUMENT_POSITION_FOLLOWING相加的结果。 -
如果 node1 位于 node2 之前,则返回
DOCUMENT_POSITION_PRECEDING。
contains(other) 方法步骤是:
如果 other 是 this 的包含自身的后代,则返回
true;否则返回 false
(包括 other 为 null 的情况)。
要使用 namespace 为一个 element 定位命名空间前缀,运行以下步骤:
要使用 prefix 为一个 node 定位命名空间,根据 node 实现的接口:
ElementDocumentDocumentTypeDocumentFragment-
返回 null。
Attr- 否则
lookupPrefix(namespace) 方法步骤如下:
-
如果 namespace 为 null 或空字符串,则返回 null。
-
ElementDocumentDocumentTypeDocumentFragment-
返回 null。
Attr- 否则
lookupNamespaceURI(prefix) 方法步骤
如下:
isDefaultNamespace(namespace) 方法
步骤
如下:
-
如果 namespace 是空字符串,则将其设置为 null。
-
如果 defaultNamespace 与 namespace 相同,则返回 true;否则 返回 false。
insertBefore(node, child)
方法步骤是返回将 node 预插入到 this
中、位于 child 之前的结果。
appendChild(node) 方法步骤是
返回将 node 附加到 this 的结果。
replaceChild(node, child)
方法步骤是返回在 this
中用
node 替换 child 的结果。
removeChild(child) 方法步骤是
返回从 this 中预移除
child 的结果。
对于一个节点 root,限定名称为
qualifiedName 的元素列表
是由以下算法返回的 HTMLCollection:
-
如果 qualifiedName 是 U+002A (*),则返回一个以 root 为根、其过滤器仅匹配作为后代的元素的
HTMLCollection。 -
否则,如果 root 的节点文档是一个HTML 文档, 则返回一个以 root 为根、其过滤器匹配以下作为 后代的元素的
HTMLCollection: -
否则,返回一个以 root 为根、其过滤器匹配限定名称为 qualifiedName 的作为 后代的元素的
HTMLCollection。
当使用相同参数调用时,只要 root 的
节点
文档的类型未更改,就可以返回与先前调用所返回对象相同的
HTMLCollection
对象。
对于一个节点 root,命名空间为
namespace 且局部名称为 localName 的元素列表
是由以下算法返回的 HTMLCollection:
-
如果 namespace 是空字符串,则将其设置为 null。
-
如果 namespace 和 localName 都是 U+002A (*),则返回一个 以 root 为根、其过滤器匹配作为后代的 元素的
HTMLCollection。 -
如果 namespace 是 U+002A (*),则返回一个以 root 为根、其过滤器匹配局部名称为 localName 的作为后代的元素的
HTMLCollection。 -
如果 localName 是 U+002A (*),则返回一个以 root 为根、其过滤器匹配命名空间为 namespace 的作为后代的元素的
HTMLCollection。 -
返回一个以 root 为根、其过滤器匹配命名空间为 namespace 且局部名称为 localName 的作为 后代的元素的
HTMLCollection。
当使用相同参数调用时,可以返回与先前调用所返回对象相同的 HTMLCollection
对象。
对于一个节点 root,类名为
classNames 的元素列表
是由以下算法返回的 HTMLCollection:
- 令 classes 为对 classNames 运行有序集合解析器的结果。
-
如果 classes 是空集合,则返回一个空的
HTMLCollection。 -
返回一个以 root 为根、其过滤器匹配所有类都包含在 classes 中的作为后代的元素的
HTMLCollection。如果 root 的节点 文档的 模式 是“
quirks”,则对类的比较必须以 ASCII 不区分大小写的方式进行;否则以完全相同的方式进行。
当使用相同参数调用时,可以返回与先前调用所返回对象相同的 HTMLCollection
对象。
4.5. 接口 Document
[Exposed =Window ]interface :Document Node {constructor (); [SameObject ]readonly attribute DOMImplementation implementation ;readonly attribute USVString URL ;readonly attribute USVString documentURI ;readonly attribute DOMString compatMode ;readonly attribute DOMString characterSet ;readonly attribute DOMString charset ; // legacy alias of .characterSetreadonly attribute DOMString inputEncoding ; // legacy alias of .characterSetreadonly attribute DOMString contentType ;readonly attribute DocumentType ?doctype ;readonly attribute Element ?documentElement ;HTMLCollection getElementsByTagName (DOMString );qualifiedName HTMLCollection getElementsByTagNameNS (DOMString ?,namespace DOMString );localName HTMLCollection getElementsByClassName (DOMString ); [classNames CEReactions ,NewObject ]Element createElement (DOMString ,localName optional (DOMString or ElementCreationOptions )= {}); [options CEReactions ,NewObject ]Element createElementNS (DOMString ?,namespace DOMString ,qualifiedName optional (DOMString or ElementCreationOptions )= {}); [options NewObject ]DocumentFragment createDocumentFragment (); [NewObject ]Text createTextNode (DOMString ); [data NewObject ]CDATASection createCDATASection (DOMString ); [data NewObject ]Comment createComment (DOMString ); [data NewObject ]ProcessingInstruction createProcessingInstruction (DOMString ,target DOMString ); [data CEReactions ,NewObject ]Node importNode (Node ,node optional (boolean or ImportNodeOptions )=options false ); [CEReactions ]Node adoptNode (Node ); [node NewObject ]Attr createAttribute (DOMString ); [localName NewObject ]Attr createAttributeNS (DOMString ?,namespace DOMString ); [qualifiedName NewObject ]Event createEvent (DOMString ); // legacy [interface NewObject ]Range createRange (); // NodeFilter.SHOW_ALL = 0xFFFFFFFF [NewObject ]NodeIterator createNodeIterator (Node ,root optional unsigned long = 0xFFFFFFFF,whatToShow optional NodeFilter ?=filter null ); [NewObject ]TreeWalker createTreeWalker (Node ,root optional unsigned long = 0xFFFFFFFF,whatToShow optional NodeFilter ?=filter null ); }; [Exposed =Window ]interface :XMLDocument Document {};dictionary {ElementCreationOptions CustomElementRegistry ?;customElementRegistry DOMString ; };is dictionary {ImportNodeOptions CustomElementRegistry ;customElementRegistry boolean =selfOnly false ; };
每个文档都有一个关联的
编码(一个编码)、
内容类型(一个字符串)、
URL(一个 URL)、
源(一个源)、
类型(“xml”或“html”)、
模式(“no-quirks”、“quirks”或
“limited-quirks”)、
允许声明式影子根(一个布尔值),以及
自定义元素注册表(null 或一个 CustomElementRegistry
对象)。
[ENCODING]
[URL]
[HTML]
除非另有说明,否则文档的编码是
utf-8 编码,内容类型是
“application/xml”,URL 是“about:blank”,
源是
一个不透明源,
类型是
“xml”,模式是
“no-quirks”,允许声明式影子根为 false,并且
自定义元素注册表为 null。
如果一个文档的
类型是
“xml”,则称其为XML
文档;否则称其为HTML 文档。
一个文档是
HTML 文档还是XML 文档,会影响某些 API 的
行为。
如果一个文档的
模式是
“no-quirks”,则称其处于
无怪异
模式;
如果其模式
是“quirks”,则称其处于
怪异模式;
如果其
模式是
“limited-quirks”,则称其处于
有限怪异
模式。
只有由HTML 解析器根据 DOCTYPE 字符串的存在、不存在或值创建的文档,以及由新的浏览上下文创建的文档(初始“about:blank”),其
模式才会从默认值更改。[HTML]
无怪异模式最初称为“标准模式”, 有限怪异模式 曾称为“准标准模式”。由于它们的细节现在由标准定义,因此已对其重命名。(还因为 Ian Hickson 以这些名称毫无意义为由否决了原始名称。)
给定一个 event,文档的获取父节点算法,在
event 的 type
属性值为“load”,或者该文档没有
浏览上下文时返回 null;否则返回该
文档的相关全局对象。
给定一个Realm realm,要创建 文档,使其实现接口 interface:
document = newDocument()- 返回一个新的文档。
document .implementation- 返回 document 的
DOMImplementation对象。 document .URLdocument .documentURI- 返回 document 的URL。
document .compatMode-
如果 document 的模式是
“
quirks”,则返回字符串“BackCompat”;否则返回 “CSS1Compat”。 document .characterSet- 返回 document 的 编码。
document .contentType- 返回 document 的 内容类型。
new Document()
构造器步骤是,将 this
的源设置为
当前全局对象的关联 Document 的
源。[HTML]
与 createDocument()
不同,此构造器不会
返回一个 XMLDocument
对象,而是返回一个文档
(Document
对象)。
implementation 获取器步骤是返回与
this 关联的
DOMImplementation
对象。
URL 和
documentURI 获取器步骤是返回
this 的
URL,并将其序列化。
compatMode 获取器步骤是:如果
this 的模式是“quirks”,则返回
“BackCompat”;否则返回“CSS1Compat”。
characterSet、
charset 和
inputEncoding 获取器步骤是返回
this 的编码的名称。
contentType 获取器步骤是返回
this 的内容类型。
- document .
doctype - 返回文档类型; 如果不存在,则返回 null。
- document .
documentElement - 返回文档 元素。
collection = document . getElementsByTagName(qualifiedName)-
如果 qualifiedName 是“
*”,则返回一个包含所有作为 后代的元素的HTMLCollection。否则,返回一个包含所有限定名称为 qualifiedName 的作为后代的 元素的
HTMLCollection。 (在HTML 文档内, 对HTML 命名空间中的元素进行不区分大小写的匹配。) collection = document . getElementsByTagNameNS(namespace, localName)-
如果 namespace 和 localName 都是“
*”,则返回一个 包含所有作为后代的元素的HTMLCollection。如果只有 namespace 是“
*”,则返回一个 包含所有局部名称为 localName 的作为 后代的元素的HTMLCollection。如果只有 localName 是“
*”,则返回一个 包含所有命名空间为 namespace 的作为 后代的元素的HTMLCollection。否则,返回一个包含所有命名空间为 namespace 且 局部名称为 localName 的作为 后代的 元素的
HTMLCollection。 collection = document . getElementsByClassName(classNames)collection = element . getElementsByClassName(classNames)-
返回一个
HTMLCollection,其中包含调用该方法的对象 (一个文档或一个元素)中具有 classNames 给出的所有类的元素。 classNames 参数被解释为空格分隔的类列表。
doctype 获取器步骤是返回
this 中属于文档类型的子节点;否则返回 null。
documentElement 获取器步骤是返回
this 的文档元素。
getElementsByTagName(qualifiedName)
方法步骤是返回 this
的限定名称为
qualifiedName 的元素列表。
因此,在HTML
文档中,
document
将匹配不在
HTML 命名空间中的 <FOO> 元素,以及位于
HTML 命名空间中的 <foo> 元素,但不会匹配位于
HTML 命名空间中的 <FOO> 元素。
getElementsByTagNameNS(namespace, localName)
方法步骤是返回 this
的命名空间为 namespace 且局部
名称为 localName 的元素列表。
getElementsByClassName(classNames)
方法步骤是返回
this 的类名为 classNames 的元素列表。
< div id = "example" >
< p id = "p1" class = "aaa bbb" />
< p id = "p2" class = "aaa ccc" />
< p id = "p3" class = "bbb ccc" />
</ div >
调用
document
将返回一个 HTMLCollection,
其中包含 p1 和 p2 这两个段落。
而调用
getElementsByClassName
只会返回一个节点,即 p3。调用
document
会返回相同的结果。
调用
getElementsByClassName
不会返回任何节点;上述元素均不属于
aaa,bbb 类。
element = document . createElement(localName [, options])-
返回一个元素,其局部名称为 localName (如果 document 是一个HTML 文档,则 localName 会转换为小写)。 当 document 是一个HTML 文档,或者 document 的 内容类型是 “
application/xhtml+xml”时,该元素的命名空间是 HTML 命名空间;否则为 null。如果提供了 options,则可以使用其中的
customElementRegistry设置CustomElementRegistry。如果提供了 options,则可以使用其中的
is创建一个 自定义内置元素。如果 localName 不是一个有效元素局部名称,则将抛出一个 “
InvalidCharacterError”DOMException。如果同时提供了 options 的
customElementRegistry和 options 的is, 则将抛出一个 “NotSupportedError”DOMException。 element = document . createElementNS(namespace, qualifiedName [, options])-
返回一个命名空间为 namespace 的元素。 其命名空间前缀将是 qualifiedName 中 U+003A (:) 之前的所有内容,如果不存在则为 null。 其局部名称将是 qualifiedName 中 U+003A (:) 之后的所有内容;如果不存在 U+003A (:), 则为 qualifiedName。
如果提供了 options,则可以使用其中的
customElementRegistry设置CustomElementRegistry。如果提供了 options,则可以使用其中的
is创建一个 自定义内置元素。如果 qualifiedName 不是一个(可能带前缀的) 有效元素局部名称,则将抛出一个“
InvalidCharacterError”DOMException。如果以下任一条件为 true,则将抛出一个“
NamespaceError”DOMException:- 命名空间前缀 非 null,并且 namespace 是空字符串。
- 命名空间前缀
是“
xml”,而 namespace 不是 XML 命名空间。 - qualifiedName 或
命名空间前缀
是“
xmlns”,而 namespace 不是 XMLNS 命名空间。 - namespace 是 XMLNS
命名空间,但 qualifiedName 和
命名空间前缀
均不是“
xmlns”。
如果同时提供了 options 的
customElementRegistry和 options 的is, 则将抛出一个 “NotSupportedError”DOMException。 documentFragment = document .createDocumentFragment()- 返回一个
DocumentFragment节点。 text = document .createTextNode(data)- 返回一个数据为
data 的
Text节点。 text = document .createCDATASection(data)- 返回一个数据为
data 的
CDATASection节点。 comment = document .createComment(data)- 返回一个数据为
data 的
Comment节点。 processingInstruction = document .createProcessingInstruction(target, data)-
返回一个
ProcessingInstruction节点,其 目标为 target,并且 数据为 data。 如果 target 不匹配Name产生式,则将抛出一个 “InvalidCharacterError”DOMException。 如果 data 包含“?>”,则将抛出一个 “InvalidCharacterError”DOMException。
除非另有说明,否则任意 name 和
namespace 的元素接口都是 Element。
例如,HTML 标准会定义,对于 html 和
HTML 命名空间,使用 HTMLHtmlElement
接口。[HTML]
createElement(localName, options)
方法步骤如下:
-
如果 localName 不是一个有效元素局部名称,则抛出一个“
InvalidCharacterError”DOMException。 -
如果 this 是一个HTML 文档,则将 localName 设置为 localName 的ASCII 小写形式。
-
如果 this 是一个 HTML 文档,或者 this 的内容 类型是 “
application/xhtml+xml”,则令 namespace 为 HTML 命名空间;否则为 null。 -
返回在给定 this、localName、 namespace、null、is、true 和 registry 的情况下,创建元素的结果。
给定
document、
namespace、qualifiedName 和 options,内部
createElementNS 步骤如下:
createElementNS(namespace, qualifiedName, options)
方法步骤是返回在给定
this、
namespace、
qualifiedName 和 options 的情况下,运行
内部 createElementNS 步骤的结果。
给定一个字符串或 ElementCreationOptions
字典 options,以及一个文档 document,要扁平化元素创建选项:
-
令 registry 为在给定 document 的情况下,查找自定义元素注册表的结果。
-
令 is 为 null。
-
如果 options 是一个字典:
-
如果 options["
customElementRegistry"] 存在:-
如果 is 非 null,则抛出一个“
NotSupportedError”DOMException。 -
将 registry 设置为 options["
customElementRegistry"]。
-
-
如果 registry 非 null,registry 的 具有作用域为 false,并且 registry 不是 document 的自定义元素注册表,则抛出一个 “
NotSupportedError”DOMException。
-
返回 registry 和 is。
为了 Web 兼容性,createElement()
和 createElementNS()
的
options
参数允许为字符串。
createDocumentFragment() 方法步骤是
返回在给定 this
的情况下,创建文档片段的结果。
createTextNode(data) 方法步骤是
返回在给定 this 和
data 的情况下,创建文本节点的结果。
createCDATASection(data) 方法步骤
如下:
-
如果 this 是一个HTML 文档,则抛出一个 “
NotSupportedError”DOMException。 -
如果 data 包含字符串“
]]>”,则抛出一个 “InvalidCharacterError”DOMException。 -
令 node 为在给定 this 的情况下,创建节点的结果,该节点实现
CDATASection。 -
将 node 的数据设置为 data。
-
返回 node。
createComment(data) 方法步骤是
返回在给定 this 和
data 的情况下,创建注释节点的结果。
createProcessingInstruction(target, data)
方法步骤是返回在给定
this、
target 和 data 的情况下,创建处理指令节点的结果。
clone = document . importNode(node [, options = false])-
返回 node 的副本。如果 options 为 true,或者 options 是一个 其
selfOnly为 false 的字典,则该副本还包括 node 的后代。可以使用 options 的
customElementRegistry设置没有自定义元素注册表的元素的CustomElementRegistry。如果 node 是一个文档或一个影子根,则抛出一个 “
NotSupportedError”DOMException。 node = document . adoptNode(node)-
将 node 从另一个文档中移动出来并返回它。
如果 node 是一个文档,则抛出一个“
NotSupportedError”DOMException; 如果 node 是一个影子根,则抛出一个 “HierarchyRequestError”DOMException。
importNode(node, options)
方法步骤如下:
-
如果 node 是一个文档或影子根,则抛出 一个“
NotSupportedError”DOMException。 -
令 subtree 为 false。
-
令 registry 为 null。
-
如果 options 是布尔值,则将 subtree 设置为 options。
-
否则:
-
将 subtree 设置为 options["
selfOnly"] 的否定值。 -
如果 options["
customElementRegistry"] 存在,则将 registry 设置为它。 -
如果 registry 的具有作用域为 false,并且 registry 不是 this 的自定义元素注册表,则 抛出一个“
NotSupportedError”DOMException。
-
-
如果 registry 为 null,则将 registry 设置为在给定 this 的情况下,查找自定义元素注册表的结果。
-
返回在给定 node 的情况下克隆节点的结果,其中 document 设置为 this, subtree 设置为 subtree,并且 fallbackRegistry 设置为 registry。
要将一个节点 node 收养到一个 文档 document 中:
-
令 oldDocument 为 node 的节点文档。
-
如果 document 不是 oldDocument,则对于 node 的 影子包含且包含自身的后代中的每个 inclusiveDescendant,按影子包含树顺序:
-
将 inclusiveDescendant 的节点文档 设置为 document。
-
如果 inclusiveDescendant 是一个影子根,并且以下任一条件为 true:
-
inclusiveDescendant 的自定义元素注册表 为 null,并且 inclusiveDescendant 的保持自定义 元素注册表为 null为 false;或者
-
inclusiveDescendant 的自定义元素注册表 是全局自定义元素 注册表,
则将 inclusiveDescendant 的自定义元素注册表设置为 document 的自定义元素注册表的 有效全局自定义 元素注册表。
-
-
否则,如果 inclusiveDescendant 是一个元素:
-
如果 inclusiveDescendant 的自定义元素注册表为 null,或者 inclusiveDescendant 的自定义元素注册表的 具有作用域为 false:
-
令 registry 为 null。
-
如果 inclusiveDescendant 的自定义元素 注册表非 null、inclusiveDescendant 的父节点为 null,或者 inclusiveDescendant 的父节点是一个 独占
DocumentFragment节点,则将 registry 设置为 document 的自定义元素 注册表。 -
否则,将 registry 设置为在给定 inclusiveDescendant 的 父节点的情况下,查找自定义 元素注册表的结果。
-
将 inclusiveDescendant 的自定义元素 注册表设置为 registry 的有效 全局自定义元素注册表。
-
-
如果 inclusiveDescendant 是自定义的,则使用 inclusiveDescendant、回调名称“
adoptedCallback” 和 « oldDocument, document » 将自定义元素 回调反应加入队列。
-
使用 inclusiveDescendant 和 oldDocument 运行收养步骤。
-
adoptNode(node) 方法步骤如下:
-
如果 node 是一个文档,则抛出一个 “
NotSupportedError”DOMException。 -
如果 node 是一个影子根,则抛出一个 “
HierarchyRequestError”DOMException。 -
返回 node。
如果 null 或一个 CustomElementRegistry
对象 registry 非 null,并且
registry 的具有
作用域为 false,则称 registry 是全局自定义元素注册表。
null 或一个 CustomElementRegistry
对象 registry 的
有效全局自定义元素注册表是:
-
如果 registry 是全局自定义元素注册表,则返回 registry。
-
返回 null。
createAttribute(localName) 方法
步骤如下:
-
如果 localName 不是一个有效属性局部名称,则 抛出一个“
InvalidCharacterError”DOMException。 - 如果 this 是 一个HTML 文档,则将 localName 设置为 localName 的ASCII 小写形式。
createAttributeNS(namespace, qualifiedName)
方法步骤如下:
-
令(namespace、prefix、localName)为在给定 “
attribute”的情况下,对 namespace 和 qualifiedName 进行验证 并提取的结果。
createEvent(interface) 方法步骤
如下:
-
令 constructor 为 null。
-
如果 interface 与下表第一列中的任一字符串 ASCII 不区分大小写地匹配,则将 constructor 设置为匹配字符串所在行第二列中的接口:
字符串 接口 备注 " beforeunloadevent"BeforeUnloadEvent[HTML] " compositionevent"CompositionEvent[UIEVENTS] " customevent"CustomEvent" devicemotionevent"DeviceMotionEvent[DEVICE-ORIENTATION] " deviceorientationevent"DeviceOrientationEvent" dragevent"DragEvent[HTML] " event"Event" events"" focusevent"FocusEvent[UIEVENTS] " hashchangeevent"HashChangeEvent[HTML] " htmlevents"Event" keyboardevent"KeyboardEvent[UIEVENTS] " messageevent"MessageEvent[HTML] " mouseevent"MouseEvent[UIEVENTS] " mouseevents"" storageevent"StorageEvent[HTML] " svgevents"Event" textevent"TextEvent[UIEVENTS] " touchevent"TouchEvent[TOUCH-EVENTS] " uievent"UIEvent[UIEVENTS] " uievents" -
如果 constructor 为 null,则抛出一个“
NotSupportedError”DOMException。 -
如果 constructor 所指示的接口未在 this 的相关全局对象上公开,则抛出一个 “
NotSupportedError”DOMException。用户代理通常会在某些配置中禁用对触摸事件的支持, 在这种情况下,此条款将针对
TouchEvent接口触发。 -
令 event 为在给定 constructor 的情况下,创建事件的结果。
-
将 event 的
type属性初始化为空字符串。 -
将 event 的
isTrusted属性初始化为 false。 -
取消设置 event 的已初始化标志。
-
返回 event。
应当改用事件构造器。
createRange() 方法步骤是返回一个新的
活动范围,其起点和终点均为(this, 0)。
可以改用 Range()
构造器。
createNodeIterator(root, whatToShow, filter)
方法步骤如下:
-
令 iterator 为一个新的
NodeIterator对象。 -
将 iterator 的根设置为 root。
-
将 iterator 的引用设置为(root, true)。
-
将 iterator 的whatToShow设置为 whatToShow。
-
将 iterator 的过滤器设置为 filter。
-
返回 iterator。
createTreeWalker(root, whatToShow, filter)
方法步骤如下:
-
令 walker 为一个新的
TreeWalker对象。 -
将 walker 的whatToShow设置为 whatToShow。
-
将 walker 的过滤器设置为 filter。
- 返回 walker。
4.5.1.接口 DOMImplementation
每当创建一个文档时,用户代理必须创建一个
DOMImplementation
对象,并将其与该文档关联。
[Exposed =Window ]interface { [DOMImplementation NewObject ]DocumentType createDocumentType (DOMString ,name DOMString ,publicId DOMString ); [systemId NewObject ]XMLDocument createDocument (DOMString ?, [namespace LegacyNullToEmptyString ]DOMString ,qualifiedName optional DocumentType ?=doctype null ); [NewObject ]Document createHTMLDocument (optional DOMString );title boolean hasFeature (); // historical; always returns true };
doctype = document .implementation.createDocumentType(name, publicId, systemId)-
返回一个具有给定 name、publicId 和 systemId 的
文档类型。
如果 name 不是一个有效文档类型名称,则抛出一个“
InvalidCharacterError”DOMException。 doc = document .implementation. createDocument(namespace, qualifiedName [, doctype = null])-
返回一个
XMLDocument, 其 文档元素的 局部名称为 qualifiedName,且其 命名空间为 namespace(除非 qualifiedName 是 空字符串);如果提供了 doctype,则将其作为文档的 文档类型。使用 namespace 和 qualifiedName 调用此方法时, 它会抛出与
createElementNS()方法相同的异常。 doc = document .implementation. createHTMLDocument([title])-
返回一个文档,
其中已经构建了一个基本
树,并包含一个
title元素,除非省略了 title 参数。
createDocumentType(name, publicId, systemId)
方法步骤如下:
-
如果 name 不是一个有效文档类型名称,则抛出一个“
InvalidCharacterError”DOMException。
createDocument(namespace, qualifiedName, doctype)
方法步骤如下:
-
令 document 为在给定 this 的相关 Realm的情况下,创建文档的结果,该文档实现
XMLDocument。 -
令 element 为 null。
-
如果 qualifiedName 不是空字符串,则将 element 设置为在给定 document、namespace、qualifiedName 和一个空字典的情况下, 运行内部
createElementNS步骤的结果。 -
如果 doctype 非 null,则将 doctype 附加到 document。
-
如果 element 非 null,则将 element 附加到 document。
-
document 的内容类型由 namespace 决定:
-
返回 document。
createHTMLDocument(title)
方法步骤如下:
hasFeature() 方法步骤是
返回 true。
hasFeature()
最初用于报告用户代理是否声称支持给定的 DOM 功能,但经验表明,它远不如直接检查所需的对象、属性或
方法是否存在那样可靠或精细。因此,不应再使用它,但为了避免旧页面停止工作,它仍然存在
(并且只会返回 true)。
4.6.
接口DocumentType
[Exposed =Window ]interface :DocumentType Node {readonly attribute DOMString name ;readonly attribute DOMString publicId ;readonly attribute DOMString systemId ; };
DocumentType
节点简称为
文档类型。
文档类型有一个关联的 名称(一个字符串)、 公共 ID(一个字符串),以及 系统 ID(一个字符串)。
给定一个文档 document、一个字符串 name,以及可选的字符串 publicId(默认为空字符串)和字符串 systemId(默认为空字符串),要创建文档类型:
-
令 doctype 为在给定 document 的情况下,创建节点的结果,该节点实现
DocumentType。 -
将 doctype 的名称设置为 name,将公共 ID设置为 publicId,并将系统 ID设置为 systemId。
-
返回 doctype。
publicId 获取器步骤是返回
this 的公共
ID。
systemId 获取器步骤是返回
this 的系统
ID。
4.7.
接口DocumentFragment
[Exposed =Window ]interface :DocumentFragment Node {constructor (); };
tree = newDocumentFragment()- 返回一个新的
DocumentFragment节点。
一个独占 DocumentFragment
节点是一个不属于 ShadowRoot
节点的 DocumentFragment
节点。
一个 DocumentFragment
节点有一个关联的
宿主(null 或不同节点树中的一个
元素)。除非另有说明,
其值为 null。
如果对象 A 是对象 B 的包含自身的祖先, 或者 B 的根具有非 null 的宿主,并且 A 是 B 的根的 宿主的 宿主包含且包含自身的祖先, 则对象 A 是对象 B 的宿主包含且包含自身的祖先。
DocumentFragment
节点的宿主
概念对 HTML 的
template
元素和影子根很有用,并会影响
预插入
和替换
算法。
给定一个文档
document,要创建文档片段:返回在给定
document 的情况下,创建节点的结果,该节点实现
DocumentFragment。
new DocumentFragment()
构造器步骤是将 this 的节点文档设置为
当前全局对象的关联 Document。
4.8. 接口 ShadowRoot
[Exposed =Window ]interface :ShadowRoot DocumentFragment {readonly attribute ShadowRootMode mode ;readonly attribute boolean delegatesFocus ;readonly attribute SlotAssignmentMode slotAssignment ;readonly attribute boolean clonable ;readonly attribute boolean serializable ;readonly attribute Element host ;attribute EventHandler onslotchange ; };enum {ShadowRootMode ,"open" };"closed" enum {SlotAssignmentMode ,"manual" };"named"
ShadowRoot
节点简称为
影子根。
影子根有一个关联的
模式(“open”
或“closed”)。
影子根有一个关联的 委托焦点 (一个布尔值)。其初始设置为 false。
影子根有一个关联的 可供元素内部使用(一个布尔值)。其初始设置为 false。
影子根有一个关联的 声明式 (一个布尔值)。其初始设置为 false。
影子根有一个关联的
槽分配
(“manual”或“named”)。
影子根有一个关联的 可克隆(一个布尔值)。 其初始设置为 false。
影子根有一个关联的 可序列化(一个布尔值)。 其初始设置为 false。
影子根有一个关联的
自定义元素注册表
(null 或一个 CustomElementRegistry
对象)。其初始为 null。
影子根有一个关联的 保持自定义元素注册表为 null(一个布尔值)。 其初始为 false。
此值只能与声明式影子根结合时为 true。而且仅在影子根的自定义 元素注册表 为 null 期间才有意义。
给定一个 event,影子根的获取父节点算法,在 event 的组合标志未设置,并且该影子根是 event 的路径中第一个事件路径项的 调用目标的根时返回 null;否则返回该影子根的 宿主。
delegatesFocus 获取器步骤是返回
this 的
委托焦点。
slotAssignment 获取器步骤是返回
this 的
槽分配。
serializable 获取器步骤是返回
this 的
可序列化。
onslotchange 属性是
onslotchange 事件处理程序的一个事件处理程序 IDL 属性,其
事件处理程序事件类型为 slotchange。
影子包含树顺序是对一棵节点树进行的 影子包含前序深度优先遍历。 对一棵节点树 tree 进行影子包含前序深度优先遍历,就是对 tree 进行前序深度优先遍历,并且对于在 tree 中遇到的每个 影子宿主, 在遇到它之后立即对该元素的 影子根的节点树进行 影子包含前序深度优先遍历。
如果一个对象的根是一个影子根,则该对象的 影子包含根是其根的 宿主的影子包含根; 否则是其根。
如果对象 A 是对象 B 的后代,或者 A 的 根是一个影子根,并且 A 的根的 宿主是 B 的影子包含且包含自身的后代, 则对象 A 是对象 B 的影子包含后代。
影子包含且包含自身的后代 是一个对象本身或其影子包含后代之一。
当且仅当 B 是 A 的影子包含后代时,对象 A 才是对象 B 的影子包含祖先。
影子包含且包含自身的祖先 是一个对象本身或其影子包含祖先之一。
如果以下所有条件均为 true,则一个节点 A 对另一个节点 B 是闭合影子隐藏的:
要针对一个对象 B 重定目标一个对象 A,重复以下步骤,直到它们返回一个对象:
重定目标算法由事件分派以及其他规范(例如 全屏)使用。[FULLSCREEN]
4.9. 接口 Element
[Exposed =Window ]interface :Element Node {readonly attribute DOMString ?namespaceURI ;readonly attribute DOMString ?prefix ;readonly attribute DOMString localName ;readonly attribute DOMString tagName ; [CEReactions ]attribute DOMString id ; [CEReactions ]attribute DOMString className ; [SameObject ,PutForwards =value ]readonly attribute DOMTokenList classList ; [CEReactions ,Unscopable ]attribute DOMString slot ;boolean hasAttributes (); [SameObject ]readonly attribute NamedNodeMap attributes ;sequence <DOMString >getAttributeNames ();DOMString ?getAttribute (DOMString );qualifiedName DOMString ?getAttributeNS (DOMString ?,namespace DOMString ); [localName CEReactions ]undefined setAttribute (DOMString , (qualifiedName TrustedType or DOMString )); [value CEReactions ]undefined setAttributeNS (DOMString ?,namespace DOMString , (qualifiedName TrustedType or DOMString )); [value CEReactions ]undefined removeAttribute (DOMString ); [qualifiedName CEReactions ]undefined removeAttributeNS (DOMString ?,namespace DOMString ); [localName CEReactions ]boolean toggleAttribute (DOMString ,qualifiedName optional boolean );force boolean hasAttribute (DOMString );qualifiedName boolean hasAttributeNS (DOMString ?,namespace DOMString );localName Attr ?getAttributeNode (DOMString );qualifiedName Attr ?getAttributeNodeNS (DOMString ?,namespace DOMString ); [localName CEReactions ]Attr ?setAttributeNode (Attr ); [attr CEReactions ]Attr ?setAttributeNodeNS (Attr ); [attr CEReactions ]Attr removeAttributeNode (Attr );attr ShadowRoot attachShadow (ShadowRootInit );init readonly attribute ShadowRoot ?shadowRoot ;readonly attribute CustomElementRegistry ?customElementRegistry ;Element ?closest (DOMString );selectors boolean matches (DOMString );selectors boolean webkitMatchesSelector (DOMString ); // legacy alias of .matchesselectors HTMLCollection getElementsByTagName (DOMString );qualifiedName HTMLCollection getElementsByTagNameNS (DOMString ?,namespace DOMString );localName HTMLCollection getElementsByClassName (DOMString ); [classNames CEReactions ]Element ?insertAdjacentElement (DOMString ,where Element ); // legacyelement undefined insertAdjacentText (DOMString ,where DOMString ); // legacy };data dictionary {ShadowRootInit required ShadowRootMode ;mode boolean =delegatesFocus false ;SlotAssignmentMode = "named";slotAssignment boolean =clonable false ;boolean =serializable false ;CustomElementRegistry ?; };customElementRegistry
ShadowRootInit
有些不同寻常,它允许将 undefined 和
null 都传递给其 customElementRegistry
成员,以便 Web
开发者可以将一个 ShadowRoot
节点而不是字典传递给 attachShadow()。
元素有以下关联项:
- 命名空间
- Null 或一个非空字符串。
- 命名空间前缀
- Null 或一个非空字符串。
- 局部名称
- 一个非空字符串。
- 自定义元素注册表
- Null 或一个
CustomElementRegistry对象。 - 自定义元素状态
- “
undefined”、“failed”、“uncustomized”、 “precustomized”或“custom”。 - 自定义元素定义
- Null 或一个自定义元素定义。
is值- Null 或一个有效自定义元素名称。
如果一个元素的自定义元素状态是
“uncustomized”或“custom”,则称其为
已定义的。如果一个元素的
自定义元素状态是“custom”,则称其为
自定义的。
元素是否已定义,用于确定
:defined
伪类的行为。元素是否自定义,用于
确定突变算法的行为。“failed”和
“precustomized”状态用于确保当一个
自定义元素构造器第一次未能正确执行时,不会再由
升级再次执行。
以下代码展示了处于这四种状态中每一种状态的元素:
<!DOCTYPE html>
< script >
window. customElements. define( "sw-rey" , class extends HTMLElement {})
window. customElements. define( "sw-finn" , class extends HTMLElement {}, { extends : "p" })
window. customElements. define( "sw-kylo" , class extends HTMLElement {
constructor () {
// 此示例有意省略 super()
}
})
</ script >
<!-- "undefined"(未定义,非自定义) -->
< sw-han ></ sw-han >
< p is = "sw-luke" ></ p >
< p is = "asdf" ></ p >
<!-- "failed"(未定义,非自定义) -->
< sw-kylo ></ sw-kylo >
<!-- "uncustomized"(已定义,非自定义) -->
< p ></ p >
< asdf ></ asdf >
<!-- "custom"(已定义,自定义) -->
< sw-rey ></ sw-rey >
< p is = "sw-finn" ></ p >
元素还有一个关联的 影子根(null 或一个 影子根)。除非 另有说明,否则其值为 null。如果一个元素的 影子根非 null,则该元素是 影子宿主。
如果一个元素的
命名空间前缀为 null,则其
限定名称是其
局部
名称;否则是其
命名空间前缀,后跟“:”,
再后跟其
局部
名称。
一个元素的HTML 大写限定名称是以下步骤的返回 值:
用户代理可以通过将限定名称和 HTML 大写限定名称存储 在内部槽中来优化它们。
给定一个文档
document、字符串 localName、字符串或 null namespace,以及
可选的字符串或 null prefix(默认为 null)、字符串或 null is(默认为
null)、布尔值 synchronousCustomElements(默认为 false),以及“default”、
null 或一个 CustomElementRegistry
对象 registry(默认为“default”),要创建一个
元素:
-
令 result 为 null。
-
如果 registry 是“
default”,则将 registry 设置为 在给定 document 的情况下查找自定义元素注册表的结果。 -
令 definition 为在给定 registry、 namespace、localName 和 is 的情况下, 查找自定义元素定义的结果。
-
如果 definition 非 null,并且 definition 的 名称不等于其 局部名称(即 definition 表示一个 自定义内置元素):
-
将 result 设置为在给定 document、interface、localName、HTML 命名空间、 prefix、“
undefined”、is 和 registry 的情况下,在内部 创建元素的结果。 -
如果 synchronousCustomElements 为 true,则在捕获任何异常的同时运行此 步骤:
-
使用 definition 升级 result。
如果此步骤抛出了异常 exception:
-
-
否则,在给定 result 和 definition 的情况下,将自定义元素升级反应加入队列。
-
否则,如果 definition 非 null:
-
如果 synchronousCustomElements 为 true:
-
令 C 为 definition 的 构造器。
-
令 previousRegistry 为周围代理的 活动自定义元素 构造器映射[C],其默认值为 null。
-
将周围代理的 活动自定义元素 构造器映射[C] 设置为 registry。
-
在捕获任何异常的同时运行以下步骤:
-
将 result 设置为无参数构造 C 的结果。
-
断言:以下条件之一为 true:
-
IDL 强制 result 是一个
HTMLElement对象,而它们全部 使用HTML 命名空间。 -
如果 result 的属性列表不为空, 则抛出一个“
NotSupportedError”DOMException。 -
如果 result 有子节点,则抛出一个 “
NotSupportedError”DOMException。 -
如果 result 的父节点非 null,则抛出一个 “
NotSupportedError”DOMException。 -
如果 result 的节点文档不是 document,则 抛出一个“
NotSupportedError”DOMException。 -
如果 result 的局部名称不等于 localName,则抛出一个“
NotSupportedError”DOMException。 -
将 result 的命名空间前缀 设置为 prefix。
-
将 result 的
is值设置为 null。 -
将 result 的自定义元素 注册表设置为 registry。
如果其中任何步骤抛出了异常 exception:
-
-
如果 previousRegistry 为 null,则从 周围代理的 活动自定义元素 构造器映射[C] 中移除该项。
-
否则,将周围代理的 活动自定义元素 构造器映射[C] 设置为 previousRegistry。
-
-
否则:
-
将 result 设置为在给定 document、
HTMLElement、 localName、HTML 命名空间、 prefix、“undefined”、null 和 registry 的 情况下,在内部创建元素的结果。 -
在给定 result 和 definition 的情况下,将自定义元素 升级反应加入队列。
-
-
-
否则:
-
返回 result。
给定一个文档
document、一个
接口 interface、一个字符串 localName、一个字符串或 null
namespace、
一个字符串或 null prefix、一个字符串 state、一个字符串或 null
is,以及 null 或一个 CustomElementRegistry
对象 registry,要在内部创建元素:
元素还有一个关联的
属性列表,它是一个通过 NamedNodeMap
公开的列表。
除非在创建元素时明确给出,否则其
属性
列表为空。
本规范和其他规范可以为 元素定义 属性更改步骤。该算法会接收 element、localName、 oldValue、value 和 namespace。
要使用 element、oldValue 和 newValue 处理属性 更改一个属性 attribute,运行以下步骤:
-
使用 attribute 的局部名称、attribute 的 命名空间、oldValue、« »、« »、null 和 null,为 element 将一个“
attributes”突变记录加入队列。 -
如果 element 是自定义的,则使用 element、回调名称 “
attributeChangedCallback”和 « attribute 的局部名称、 oldValue、newValue、attribute 的命名空间 » 将自定义元素回调反应加入队列。 -
使用 element、attribute 的 局部名称、oldValue、 newValue 和 attribute 的 命名空间运行属性更改步骤。
要将一个属性 attribute 更改为 value:
要移除一个 属性 attribute:
给定一个字符串 qualifiedName 和一个元素 element,要按名称获取属性:
给定 null 或一个字符串 namespace、一个字符串 localName 和一个 元素 element,要 按命名空间和局部名称获取属性:
给定一个元素 element、一个字符串 localName,以及可选的 null 或 字符串 namespace(默认为 null),要获取 属性值:
给定一个属性 attr 和一个元素 element,要设置 属性:
-
令 verifiedValue 为使用 attr 的 局部名称、attr 的 命名空间、element 和 attr 的值调用 获取符合可信类型的属性值的结果。 [TRUSTED-TYPES]
-
如果 attr 的元素既不是 null 也不是 element, 则抛出一个“
InUseAttributeError”DOMException。 -
令 oldAttr 为在给定 attr 的命名空间、attr 的 局部名称和 element 的情况下,获取属性的结果。
-
如果 oldAttr 是 attr,则返回 attr。
-
将 attr 的值设置为 verifiedValue。
-
如果 oldAttr 非 null,则使用 attr 替换 oldAttr。
-
否则,将 attr 附加到 element。
-
返回 oldAttr。
给定一个元素 element、一个字符串 localName、一个字符串 value、 一个可选的 null 或字符串 prefix(默认为 null),以及一个可选的 null 或字符串 namespace(默认为 null),要设置 属性值:
给定一个字符串 qualifiedName 和一个元素 element,要按名称移除属性:
给定 null 或一个字符串 namespace、一个字符串 localName 和一个 元素 element,要 按命名空间和局部名称移除 属性:
一个元素可以有一个关联的 唯一标识符(ID)
过去,元素可以有多个标识符,例如同时使用
HTML id 属性和 DTD。本规范将 ID
定义为 DOM 的一个概念,并且只允许每个元素有一个 ID,该 ID 由
id 属性给出。
-
如果 localName 是
id、namespace 为 null,并且 value 为 null 或空字符串,则取消设置 element 的 ID。 -
否则,如果 localName 是
id,并且 namespace 为 null,则 将 element 的ID 设置为 value。
虽然本规范为任意元素上的 class、
id 和 slot 属性定义了要求,但并不
声明使用它们是否符合规范。
一个节点的类型为
Element 的父节点称为其
父元素。如果该节点具有
不同类型的父节点,则其
父元素为 null。
- namespace = element .
namespaceURI - 返回命名空间。
- prefix = element .
prefix - 返回 命名空间前缀。
- localName = element .
localName - 返回 局部名称。
- qualifiedName = element .
tagName - 返回HTML 大写限定名称。
namespaceURI 获取器步骤是返回
this 的
命名空间。
prefix 获取器步骤是返回
this 的
命名空间前缀。
localName 获取器步骤是返回
this 的
局部名称。
tagName 获取器步骤是返回
this 的
HTML 大写限定名称。
element . id [ = value ]-
返回 element 的
id内容属性的值。可以通过设置它来 更改该值。 element . className [ = value ]-
返回 element 的
class内容属性的值。可以通过设置它 来更改该值。 element . classList-
允许通过一个
DOMTokenList对象,将 element 的class内容属性作为 一组由空格分隔的标记进行操作。 element . slot [ = value ]-
返回 element 的
slot内容属性的值。可以通过设置它来 更改该值。
被定义为反映字符串 name 的 IDL 属性,必须具有以下获取器和设置器步骤:
id 属性必须反映
“id”。
className 属性必须
反映
“class”。
classList 获取器步骤是返回一个
DOMTokenList
对象,其关联的元素是 this,并且其关联的
属性的
局部名称是 class。这个特定
DOMTokenList
对象的标记集合也称为该元素的
类。
slot 属性必须反映
“slot”。
id、class 和 slot 实际上是
超全局属性,因为它们可以出现在任何元素上,而不论该元素的
命名空间为何。
element . hasAttributes()-
如果 element 具有属性,则返回 true;否则返回 false。
element . getAttributeNames()element . getAttribute(qualifiedName)element . getAttributeNS(namespace, localName)-
返回 element 中属性,其命名空间是 namespace,且局部名称是 localName;如果 没有这样的属性,则返回 null。
element . setAttribute(qualifiedName, value)element . setAttributeNS(namespace, localName, value)-
将 element 中属性的 值设置为 value,该属性的 命名空间是 namespace,且 局部名称是 localName。
element . removeAttribute(qualifiedName)element . removeAttributeNS(namespace, localName)element . toggleAttribute(qualifiedName [, force])-
如果未给出 force,则“切换”qualifiedName:存在时将其 移除,不存在时将其添加。如果 force 为 true,则添加 qualifiedName。如果 force 为 false,则移除 qualifiedName。
如果 qualifiedName 现在存在,则返回 true;否则返回 false。
element . hasAttribute(qualifiedName)-
如果 element 具有一个属性,其 限定名称是 qualifiedName, 则返回 true; 否则返回 false。
element . hasAttributeNS(namespace, localName)-
如果 element 具有一个属性,其命名空间 是 namespace,且局部名称是 localName,则返回 true; 否则返回 false。
attributes 获取器步骤是返回关联的 NamedNodeMap。
getAttribute(qualifiedName) 方法
步骤如下:
getAttributeNS(namespace, localName)
方法步骤如下:
setAttribute(qualifiedName, value)
方法步骤如下:
-
如果 qualifiedName 不是一个有效属性局部名称,则抛出一个 “
InvalidCharacterError”DOMException。尽管参数如此命名, 仅当已经存在一个属性,其限定名称为 qualifiedName 时,qualifiedName 才会被用作限定名称。否则,它会被用作新 属性的局部 名称。我们只需针对后一种情况验证它。
-
如果 this 位于HTML 命名空间中,并且其节点文档是一个 HTML 文档, 则将 qualifiedName 设置为 qualifiedName 的 ASCII 小写形式。
-
令 verifiedValue 为使用 qualifiedName、null、this 和 value 调用 获取符合可信类型的 属性值的结果。[TRUSTED-TYPES]
-
令 attribute 为 this 的 属性列表中第一个属性,其 限定名称是 qualifiedName; 否则为 null。
-
如果 attribute 非 null,则将 attribute 更改为 verifiedValue,然后返回。
-
将 attribute 设置为在给定 this 的 节点文档、qualifiedName、null、null 和 verifiedValue 的情况下,创建属性的结果。
setAttributeNS(namespace, qualifiedName, value)
方法步骤如下:
-
令(namespace、prefix、localName)为在给定 “
attribute”的情况下,对 namespace 和 qualifiedName 进行验证并提取的结果。 -
令 verifiedValue 为使用 localName、namespace、 this 和 value 调用 获取符合可信类型的 属性值的结果。[TRUSTED-TYPES]
-
使用 localName、 verifiedValue、prefix 和 namespace,为 this 设置属性值。
removeAttributeNS(namespace, localName)
方法步骤是,在给定 namespace、localName 和 this 的情况下,移除属性,然后返回
undefined。
hasAttribute(qualifiedName) 方法
步骤如下:
toggleAttribute(qualifiedName, force)
方法步骤如下:
-
如果 qualifiedName 不是一个有效属性局部名称,则抛出一个 “
InvalidCharacterError”DOMException。请参阅上面的讨论, 了解为何 我们将其作为局部名称而不是限定名称进行验证。
-
如果 this 位于HTML 命名空间中,并且其节点文档是一个 HTML 文档, 则将 qualifiedName 设置为 qualifiedName 的 ASCII 小写形式。
-
令 attribute 为 this 的 属性列表中第一个属性,其 限定名称是 qualifiedName; 否则为 null。
-
如果 attribute 为 null:
-
如果未给出 force 或其为 false,则在给定 qualifiedName 和 this 的情况下,移除属性,然后返回 false。
-
返回 true。
hasAttributeNS(namespace, localName)
方法步骤如下:
removeAttributeNode(attr) 方法
步骤
如下:
-
如果 this 的属性列表不包含 attr,则抛出一个“
NotFoundError”DOMException。 -
移除 attr。
-
返回 attr。
shadow = element .attachShadow(init)-
为 element 创建一个影子根并返回它。
shadow = element .shadowRoot
有效影子宿主名称是:
- 一个有效自定义元素名称
- “
article”、 “aside”、 “blockquote”、 “body”、 “div”、 “footer”、 “h1”、 “h2”、 “h3”、 “h4”、 “h5”、 “h6”、 “header”、 “main”、 “nav”、 “p”、 “section”或 “span”
此列表有意受到限制,以便内置元素可以随时间推移根据需要获得内部 影子树。
attachShadow(init) 方法步骤如下:
-
如果 init["
customElementRegistry"] 存在,则 将 registry 设置为它。 -
如果 registry 非 null、registry 的 具有作用域为 false,并且 registry 不是 this 的 节点文档的自定义元素注册表,则抛出一个 “
NotSupportedError”DOMException。 -
使用 this、 init["
mode"]、 init["clonable"]、 init["serializable"]、 init["delegatesFocus"]、 init["slotAssignment"] 和 registry,运行附加影子根。
给定一个元素
element、一个字符串 mode、一个布尔值 clonable、
一个布尔值 serializable、一个布尔值 delegatesFocus、一个字符串
slotAssignment,以及 null 或一个 CustomElementRegistry
对象 registry,要附加影子根:
-
如果 element 的命名空间不是HTML 命名空间, 则抛出一个“
NotSupportedError”DOMException。 -
如果 element 的局部名称不是一个 有效影子宿主名称,则抛出一个“
NotSupportedError”DOMException。 -
如果 element 的局部名称是一个有效自定义元素名称,或者 element 的
is值非 null:-
令 definition 为在给定 element 的 自定义元素注册表、其 命名空间、其局部名称和其
is值的情况下,查找自定义元素定义的结果。 -
如果 definition 非 null,并且 definition 的 禁用影子为 true,则抛出一个 “
NotSupportedError”DOMException。
-
-
如果 element 是一个影子宿主:
-
令 currentShadowRoot 为 element 的影子根。
-
如果以下任一项为真:
则抛出一个 "
NotSupportedError"DOMException。 -
将 currentShadowRoot 的声明式设置为 false。
-
返回。
-
-
令 shadow 为在给定 element 的节点文档的情况下,创建节点的结果,该节点实现
ShadowRoot。 -
将 shadow 的宿主设置为 element。
-
将 shadow 的模式设置为 mode。
-
将 shadow 的委托焦点设置为 delegatesFocus。
-
如果 element 的自定义元素状态是 “
precustomized”或“custom”,则将 shadow 的 可供元素内部使用设置为 true。 -
将 shadow 的槽分配设置为 slotAssignment。
-
将 shadow 的声明式设置为 false。
-
将 shadow 的可克隆设置为 clonable。
-
将 shadow 的可序列化设置为 serializable。
-
将 shadow 的自定义元素注册表设置为 registry。
-
将 element 的影子根设置为 shadow。
registry = element .customElementRegistry-
如果有,则返回 element 的
CustomElementRegistry对象;否则返回 null。
element .closest(selectors)- 返回第一个(从 element 开始)与 selectors 匹配的包含自身的祖先;否则返回 null。
element .matches(selectors)- 如果以 element 的根为基准匹配 selectors 得到 element,则返回 true;否则返回 false。
closest(selectors) 方法步骤如下:
-
令 selector 为从 selectors 中解析选择器的结果。 [SELECTORS4]
-
如果 selector 是失败,则抛出一个“
SyntaxError”DOMException。 -
对于 elements 中的每个 element:如果使用 selector、element 和作用域根 this,将选择器与元素进行匹配返回成功, 则返回 element。[SELECTORS4]
-
返回 null。
matches(selectors) 和
webkitMatchesSelector(selectors)
方法步骤
如下:
-
令 selector 为从 selectors 中解析选择器的结果。 [SELECTORS4]
-
如果 selector 是失败,则抛出一个“
SyntaxError”DOMException。 -
如果使用 selector、 this 和作用域 根 this,将选择器与元素进行匹配的结果返回成功, 则返回 true;否则 返回 false。[SELECTORS4]
getElementsByTagName(qualifiedName)
方法步骤是返回 this
的限定名称为
qualifiedName 的元素列表。
getElementsByTagNameNS(namespace, localName)
方法步骤是返回 this
的命名空间为 namespace 且局部
名称为 localName 的元素列表。
getElementsByClassName(classNames)
方法步骤是返回 this 的
类名为 classNames 的元素列表。
给定一个元素 element、字符串 where 和一个节点 node,要相邻插入,运行与第一个和 where ASCII 不区分大小写匹配项关联的步骤:
- “
beforebegin” -
如果 element 的父节点为 null,则返回 null。
- “
afterbegin” - “
beforeend” -
返回将 node 预插入到 element 中、位于 null 之前的结果。
- “
afterend” -
如果 element 的父节点为 null,则返回 null。
- 否则
insertAdjacentElement(where, element)
方法步骤是返回在给定 this、where 和 element 的情况下,运行相邻插入的结果。
insertAdjacentText(where, data)
方法步骤如下:
此方法不返回任何内容,因为在我们有机会设计它之前,它就已经存在了。
4.9.1.
接口 NamedNodeMap
[Exposed =Window ,LegacyUnenumerableNamedProperties ]interface {NamedNodeMap readonly attribute unsigned long length ;getter Attr ?item (unsigned long );index getter Attr ?getNamedItem (DOMString );qualifiedName Attr ?getNamedItemNS (DOMString ?,namespace DOMString ); [localName CEReactions ]Attr ?setNamedItem (Attr ); [attr CEReactions ]Attr ?setNamedItemNS (Attr ); [attr CEReactions ]Attr removeNamedItem (DOMString ); [qualifiedName CEReactions ]Attr removeNamedItemNS (DOMString ?,namespace DOMString ); };localName
一个 NamedNodeMap
有一个关联的
元素(一个
元素)。
一个 NamedNodeMap
对象的
属性列表是其
元素的
属性
列表。
一个 NamedNodeMap
对象的支持的属性索引是从零到其
属性列表的大小 − 1 范围内的数字,除非
该属性列表为空,在这种
情况下不存在
支持的属性索引。
item(index) 方法步骤如下:
一个 NamedNodeMap
对象的支持的属性名称是运行以下
步骤的返回值:
-
令 names 为此
NamedNodeMap对象的属性列表中属性的 限定名称,按顺序排列并省略重复项。 -
如果此
NamedNodeMap对象的元素位于 HTML 命名空间中,并且其节点文档是一个HTML 文档,则 对于 names 中的每个 name:-
令 lowercaseName 为 name 的ASCII 小写形式。
-
如果 lowercaseName 不等于 name,则从 names 中移除 name。
-
-
返回 names。
getNamedItem(qualifiedName)
方法步骤是返回在给定 qualifiedName 和元素的情况下,获取属性的结果。
getNamedItemNS(namespace, localName)
方法步骤是返回在给定
namespace、localName 和元素的情况下,获取属性的结果。
setNamedItem(attr) 和
setNamedItemNS(attr) 方法步骤是
返回在给定 attr 和
元素的情况下,设置属性的结果。
removeNamedItem(qualifiedName)
方法步骤如下:
-
如果 attr 为 null,则抛出一个“
NotFoundError”DOMException。 -
返回 attr。
removeNamedItemNS(namespace, localName)
方法步骤如下:
-
如果 attr 为 null,则抛出一个“
NotFoundError”DOMException。 -
返回 attr。
4.9.2.
接口 Attr
[Exposed =Window ]interface :Attr Node {readonly attribute DOMString ?namespaceURI ;readonly attribute DOMString ?prefix ;readonly attribute DOMString localName ;readonly attribute DOMString name ; [CEReactions ]attribute DOMString value ;readonly attribute Element ?ownerElement ;readonly attribute boolean specified ; // historical; always returns true };
Attr 节点简称为
属性。它们有时称为内容属性,以避免与 IDL 属性混淆。
属性有一个 命名空间(null 或一个非空字符串)、 命名空间前缀(null 或一个非空字符串)、 局部名称(一个非空字符串)、 值(一个字符串),以及 元素(null 或一个 元素)。
如果在今天设计,它们只会有名称和值。☹
一个属性的
限定名称,在其命名空间
前缀为 null 时,是其
局部名称;否则,是其
命名空间前缀,后跟“:”,
再后跟其
局部名称。
用户代理可以将其作为内部槽进行优化。
给定一个文档 document、一个 字符串 localName,以及可选的字符串或 null namespace(默认为 null)、 字符串或 null prefix(默认为 null)和字符串 value(默认为空 字符串),要创建 属性:
一个
A 属性
是一个属性,其
局部名称是
A,并且其
命名空间和
命名空间前缀均为
null。
namespaceURI 获取器步骤是返回
this 的
命名空间。
prefix 获取器步骤是返回 this 的
命名空间前缀。
localName 获取器步骤是返回
this 的
局部名称。
给定一个属性 attribute 和 字符串 value,要设置现有属性值,运行以下步骤:
-
令 element 为 attribute 的元素。
-
令 verifiedValue 为使用 attribute 的 局部名称、attribute 的命名空间、element 和 value 调用 获取符合可信类型的属性 值的结果。[TRUSTED-TYPES]
-
如果 attribute 的元素为 null,则将 attribute 的 值设置为 verifiedValue,然后返回。
-
将 attribute 更改为 verifiedValue。
value
设置器步骤是,使用 this
和给定值设置现有属性值。
ownerElement 获取器步骤是返回
this 的
元素。
specified 获取器步骤是返回 true。
4.10.
接口 CharacterData
[Exposed =Window ]interface :CharacterData Node {attribute [LegacyNullToEmptyString ]DOMString data ;readonly attribute unsigned long length ;DOMString substringData (unsigned long ,offset unsigned long );count undefined appendData (DOMString );data undefined insertData (unsigned long ,offset DOMString );data undefined deleteData (unsigned long ,offset unsigned long );count undefined replaceData (unsigned long ,offset unsigned long ,count DOMString ); };data
CharacterData
是一个抽象接口。无法直接获取它的实例。它
由 Text、ProcessingInstruction
和 Comment 节点使用。
每个继承自
CharacterData
接口的节点都有一个关联的可变
字符串,称为数据。
要使用整数 offset、整数 count、字符串 data 和一个可选的 布尔值 piAttributesAlreadyUpdated(默认为 false)替换数据一个 节点 node:
-
令 length 为 node 的长度。
-
如果 offset 大于 length,则抛出一个 “
IndexSizeError”DOMException。 -
如果 offset + count 大于 length,则将 count 设置为 length − offset。
-
使用 null、null、node 的数据、« »、« »、null 和 null,为 node 将一个 “
characterData”突变记录加入队列。 -
令 deleteOffset 为 offset + data 的 长度。
-
对于每个实时范围,如果其起始节点为 node,且 起始偏移量大于 offset, 但小于或等于 offset + count:将其起始偏移量设置为 offset。
-
对于每个实时范围,如果其结束节点为 node,且 结束偏移量大于 offset, 但小于或等于 offset + count:将其结束偏移量设置为 offset。
-
对于每个实时范围,如果其起始节点为 node,且 起始偏移量大于 offset + count:将其 起始偏移量增加 data 的长度,并将其减少 count。
-
对于每个实时范围,如果其结束节点为 node,且 结束偏移量大于 offset + count:将其 结束偏移量增加 data 的长度,并将其减少 count。
-
如果 node 是一个
ProcessingInstruction节点,并且 piAttributesAlreadyUpdated 为 false,则在给定 node 的情况下从数据更新属性。
要使用整数 offset 和整数 count 截取数据子字符串一个 节点 node:
4.11. 接口 Text
[Exposed =Window ]interface :Text CharacterData {constructor (optional DOMString = ""); [data NewObject ]Text splitText (unsigned long );offset readonly attribute DOMString wholeText ; };
text = new Text([data = ""])- 返回一个新的
Text节点,其 数据为 data。 text .splitText(offset)- 在给定的
offset 处拆分数据,并将剩余部分作为
Text节点返回。 text .wholeText- 返回所有直接的
Text节点 同胞的组合数据。
一个独占 Text 节点
是一个不属于
CDATASection
节点的 Text 节点。
一个节点
node 的连续
Text 节点
是
node、node 的前一个同胞 Text 节点(如果有),以及
它的连续
Text 节点,还有 node 的下一个同胞
Text 节点(如果有),以及它的连续
Text 节点,并避免任何
重复项。
一个节点
node 的连续独占 Text 节点
是 node、node 的前一个同胞
独占
Text 节点(如果有),以及它的
连续独占 Text 节点,还有
node 的
下一个
同胞 独占
Text 节点(如果有),以及它的
连续独占 Text 节点,
并避免任何重复项。
给定一个文档 document 和一个 字符串 data,要创建文本 节点:
要使用整数 offset 拆分一个 Text
节点 node:
-
令 length 为 node 的长度。
-
如果 offset 大于 length,则抛出一个 “
IndexSizeError”DOMException。 -
令 count 为 length − offset。
-
令 newData 为使用 offset 和 count 截取数据子字符串 node 的结果。
-
令 parent 为 node 的父节点。
-
如果 parent 非 null:
-
使用 offset、count 和 空字符串替换 数据 node。
-
返回 newNode。
wholeText 获取器步骤是返回按树顺序排列的 this 的连续
Text 节点的数据的
串联。
4.12. 接口 CDATASection
[Exposed =Window ]interface :CDATASection Text { };
4.13.
接口 ProcessingInstruction
[Exposed =Window ]interface :ProcessingInstruction CharacterData {constructor (DOMString ,target optional DOMString = "");data readonly attribute DOMString target ;boolean hasAttributes ();sequence <DOMString >getAttributeNames ();DOMString ?getAttribute (DOMString );name undefined setAttribute (DOMString ,name DOMString );value undefined removeAttribute (DOMString );name boolean toggleAttribute (DOMString ,name optional boolean );force boolean hasAttribute (DOMString ); };name
pi = new ProcessingInstruction(target [, data = ""])- 返回一个新的
ProcessingInstruction节点,其 目标为 target,且 数据为 data。 pi .target- 返回目标。
pi . hasAttributes()-
如果 pi 具有属性,则返回 true;否则返回 false。
pi . getAttributeNames()-
返回 pi 的所有属性的名称。不能包含重复项。
pi . getAttribute(name)-
返回 pi 中名为 name 的属性的值;如果不存在 此类属性,则返回 null。
pi . setAttribute(name, value)-
将 pi 中名为 name 的属性设置为 value。
pi . removeAttribute(name)-
移除 pi 中名为 name 的属性。
pi . toggleAttribute(name [, force])-
如果未给出 force,则“切换”name:存在时将其 移除,不存在时将其添加。如果 force 为 true,则添加 name。如果 force 为 false,则移除 name。
如果 name 现在存在,则返回 true;否则返回 false。
pi . hasAttribute(name)-
如果 pi 具有名为 name 的属性,则返回 true;否则返回 false。
ProcessingInstruction
节点有一个关联的
目标。
ProcessingInstruction
节点有一个关联的
属性映射,它是一个
映射,
初始为空。
要创建处理指令节点,给定一个文档 document、一个字符串 target 和一个字符串 data:
-
令 pi 为创建节点的结果,该节点实现
ProcessingInstruction, 给定 document。 -
使用 target 和 data 初始化 pi。
-
返回 pi。
要使用 target 和 data 初始化一个 ProcessingInstruction
节点 pi:
-
如果 target 不匹配
Name产生式,则 抛出一个“InvalidCharacterError”DOMException。 -
如果 data 包含字符串“
?>”,则抛出一个 “InvalidCharacterError”DOMException。 -
将 pi 的目标设置为 target。
-
将 pi 的数据设置为 data。
-
给定 pi,从数据更新属性。
要从
数据更新属性,给定一个 ProcessingInstruction
节点
pi:
要从
属性更新数据,给定一个 ProcessingInstruction
节点
pi:
-
令 data 为空字符串。
-
对于 pi 的 属性映射中的每个 name → value:
-
如果 data 不是空字符串,则将 U+0020 SPACE 附加到 data。
-
将 name 附加到 data。
-
将 U+003D (=) 附加到 data。
-
将 U+0022 (") 附加到 data。
-
将 value 中的任何 U+0026 (&) 替换为“
&”。 -
将 value 中的任何 U+003C (<) 替换为“
<”。 -
将 value 中的任何 U+003D (>) 替换为“
>”。 -
将 value 中的任何 U+0022 (") 替换为“
"”。 -
将 value 附加到 data。
-
将 U+0022 (") 附加到 data。
-
要获取处理指令属性,给定一个
ProcessingInstruction
节点 pi 和一个
字符串 name:返回 pi 的
属性映射[name],其默认值为
null。
new ProcessingInstruction(target, data)
构造器步骤如下:
setAttribute(name, value)
方法步骤如下:
-
如果 name 不是一个有效属性局部名称,则抛出一个 “
InvalidCharacterError”DOMException。
toggleAttribute(name, force)
方法步骤如下:
4.14.
接口 注释
[Exposed =Window ]interface :Comment CharacterData {constructor (optional DOMString = ""); };data
comment = new Comment([data = ""])- 返回一个新的
Comment节点,其 数据为 data。
要创建注释 节点,给定一个文档 document 和 一个字符串 data:
5. Ranges
5.1. Introduction to "DOM Ranges"
StaticRange
和 Range 对象(范围)表示
节点树中的一段
内容序列。每个范围都有一个起点和一个终点,它们
是边界点。一个边界点是一个由
元组组成的
节点和一个偏移。换句话说,
一个
范围表示节点
树中两个
边界点之间的一段
内容。
范围经常用于 编辑中的内容选择和复制。
-
Element:p
在上面的节点树
中,可以使用一个
范围来表示
序列
“syndata is awes”。假设将 p 赋值为
p 元素,
并将
em 赋值为 em
元素,可以
按如下方式完成:
var range = new Range(),
firstText = p. childNodes[ 1 ],
secondText = em. firstChild
range. setStart( firstText, 9 ) // 不要忘记前导空格
range. setEnd( secondText, 4 )
// range 现在转换为字符串后就是前述引文
上面节点树中的 src 和 alt 等
属性无法由范围表示。范围仅适用于
节点。
Range 对象与
StaticRange
对象不同,会受到
节点树突变的影响。因此
它们也称为实时范围。此类突变不会
使它们失效,并会尝试确保它仍表示相同的内容片段。
必然地,当例如其所表示内容的一部分发生突变时,作为
节点树突变的一部分,实时
范围本身也可能被修改。
有关详细信息,请参阅插入和移除算法、
normalize()
方法,以及替换
数据和拆分
算法。
为响应节点
树突变而更新实时范围
可能成本高昂。每当
节点树发生更改时,所有
受影响的 Range
对象都需要更新。即使应用程序
对某些实时范围不感兴趣,在发生突变时,它仍须承担使它们
保持最新状态
的成本。
一个 StaticRange
对象是一个轻量级范围,
在
节点树发生突变时不会更新。因此它
不会产生与
实时范围相同的维护成本。
5.2. Boundary points
一个 边界点是一个元组, 由一个 节点(一个节点)和一个 偏移量(一个非负整数)组成。
一个正确的边界点的偏移量将 位于 0 与该边界点的节点的 长度 之间,包括两端。
一个 边界点 (nodeA、offsetA)相对于另一个边界点 (nodeB、offsetB)的 位置是 之前、 相等或 之后,由以下步骤返回:
5.3. 接口 AbstractRange
[Exposed =Window ]interface {AbstractRange readonly attribute Node startContainer ;readonly attribute unsigned long startOffset ;readonly attribute Node endContainer ;readonly attribute unsigned long endOffset ;readonly attribute boolean collapsed ; };
实现 AbstractRange
接口的对象被称为 范围。
为方便起见,一个范围的起始节点是其起始点的节点,其起始偏移量是其起始点的偏移量,其结束节点是其结束点的节点,其结束偏移量是其结束点的偏移量。
node = range . startContainer- 返回 range 的起始节点。
offset = range . startOffset- 返回 range 的起始偏移量。
node = range . endContainer- 返回 range 的结束节点。
offset = range . endOffset- 返回 range 的结束偏移量。
collapsed = range . collapsed- 如果 range 是折叠的,则返回 true;否则返回 false。
5.4. 接口 StaticRange
dictionary {StaticRangeInit required Node ;startContainer required unsigned long ;startOffset required Node ;endContainer required unsigned long ; }; [endOffset Exposed =Window ]interface :StaticRange AbstractRange {constructor (StaticRangeInit ); };init
该
new StaticRange(init)
构造器步骤如下:
-
如果 init["
startContainer"] 或 init["endContainer"] 是一个DocumentType或Attr节点,则抛出一个“InvalidNodeTypeError”DOMException。 -
将 this 的起始位置设置为 (init["
startContainer"], init["startOffset"]) 并将结束位置设置为 (init["endContainer"], init["endOffset"])。
如果以下所有条件均为 true,则一个 StaticRange
是有效的:
5.5. 接口 Range
[Exposed =Window ]interface :Range AbstractRange {constructor ();readonly attribute Node commonAncestorContainer ;undefined setStart (Node ,node unsigned long );offset undefined setEnd (Node ,node unsigned long );offset undefined setStartBefore (Node );node undefined setStartAfter (Node );node undefined setEndBefore (Node );node undefined setEndAfter (Node );node undefined collapse (optional boolean =toStart false );undefined selectNode (Node );node undefined selectNodeContents (Node );node const unsigned short = 0;START_TO_START const unsigned short = 1;START_TO_END const unsigned short = 2;END_TO_END const unsigned short = 3;END_TO_START short compareBoundaryPoints (unsigned short ,how Range ); [sourceRange CEReactions ]undefined deleteContents (); [CEReactions ,NewObject ]DocumentFragment extractContents (); [CEReactions ,NewObject ]DocumentFragment cloneContents (); [CEReactions ]undefined insertNode (Node ); [node CEReactions ]undefined surroundContents (Node ); [newParent NewObject ]Range cloneRange ();undefined detach ();boolean isPointInRange (Node ,node unsigned long );offset short comparePoint (Node ,node unsigned long );offset boolean intersectsNode (Node );node stringifier ; };
实现 Range 接口的对象称为
实时范围。
修改树的算法(尤其是插入、 移除、移动、替换数据和拆分 算法)会修改与该树关联的实时 范围。
如果一个节点 node 的根是 range 的根,并且 (node, 0) 位于 range 的起始位置之后,且 (node, node 的长度) 位于 range 的结束位置之前,则 node 包含 在一个实时范围 range 中。
如果一个节点是一个实时范围的起始节点的 包含自身的祖先,但不是其结束 节点的包含自身的祖先,反之亦然,则该节点部分包含在该实时范围 中。
以下事实有助于更好地理解这些定义:
-
通常认为位于该实时范围内的内容,由所有 包含的节点,以及 起始节点和结束节点的部分内容(如果这些 是
CharacterData节点)组成。 -
第一个包含的节点(如果 存在)始终 位于起始节点之后,而最后一个包含的 节点始终 等于或位于结束节点的最后一个 后代之前。
-
commonAncestorContainer属性值既不被 包含,也不被部分 包含。 -
如果起始节点是 结束 节点的祖先,则公共的包含自身的祖先将是 起始节点。其子节点中恰好有一个被 部分 包含,并且一个子节点被 包含,当且仅当 它位于该 部分 包含的子节点之前。如果 结束 节点是起始节点的祖先,则情况相反。
-
如果起始节点不是 结束 节点的包含自身的祖先,反之亦然,则公共的包含自身的祖先将 与两者都不同。其子节点中恰好有两个被 部分 包含,并且一个子节点被包含,当且 仅当它位于这两个子节点之间。
给定一个节点 node,实时 范围预移除步骤如下:
range = new Range()- 返回一个新的实时 范围。
new Range() 构造器
步骤是
将 this 的起始位置和结束位置设置为
(当前全局对象的关联 Document, 0)。
- container = range .
commonAncestorContainer - 返回同时为 range 的起始节点和 结束 节点的 祖先中, 距离文档最远的节点。
要获取一个实时范围 range 的公共 祖先:
要将 range 的 起始位置或结束位置设置为 一个边界点 (node, offset):
-
如果 node 是一个文档类型,则抛出一个 “
InvalidNodeTypeError”DOMException。 -
如果 offset 大于 node 的长度,则 抛出一个“
IndexSizeError”DOMException。 -
令 boundaryPoint 为边界点 (node, offset)。
setStartBefore(node) 方法步骤如下:
-
令 parent 为 node 的父节点。
-
如果 parent 为 null,则抛出一个 “
InvalidNodeTypeError”DOMException。
setStartAfter(node) 方法步骤如下:
-
令 parent 为 node 的父节点。
-
如果 parent 为 null,则抛出一个 “
InvalidNodeTypeError”DOMException。
setEndBefore(node) 方法步骤如下:
-
令 parent 为 node 的父节点。
-
如果 parent 为 null,则抛出一个 “
InvalidNodeTypeError”DOMException。
setEndAfter(node) 方法步骤如下:
-
令 parent 为 node 的父节点。
-
如果 parent 为 null,则抛出一个 “
InvalidNodeTypeError”DOMException。
-
令 parent 为 node 的父节点。
-
如果 parent 为 null,则抛出一个 “
InvalidNodeTypeError”DOMException。 -
令 index 为 node 的索引。
selectNodeContents(node) 方法
步骤
如下:
-
如果 node 是一个文档类型,则抛出一个 “
InvalidNodeTypeError”DOMException。 -
令 length 为 node 的长度。
compareBoundaryPoints(how, sourceRange)
方法步骤如下:
-
如果 how 不是以下值之一:
-
如果 this 的根不是 sourceRange 的 根, 则抛出一个“
WrongDocumentError”DOMException。 -
令 thisPoint 和 sourcePoint 为 null。
-
根据 how 进行切换:
START_TO_START:-
将 thisPoint 设置为this 的起始位置,并将 sourcePoint 设置为 sourceRange 的起始位置。
START_TO_END:-
将 thisPoint 设置为this 的结束位置,并将 sourcePoint 设置为 sourceRange 的起始位置。
END_TO_END:-
将 thisPoint 设置为this 的结束位置,并将 sourcePoint 设置为 sourceRange 的结束位置。
END_TO_START:-
将 thisPoint 设置为this 的起始位置,并将 sourcePoint 设置为 sourceRange 的结束位置。
-
根据 thisPoint 相对于 sourcePoint 的位置进行切换:
deleteContents() 方法步骤如下:
-
令 originalStartNode、originalStartOffset、 originalEndNode 和 originalEndOffset 分别为this 的 起始节点、起始 偏移量、结束节点和 结束偏移量。
-
如果 originalStartNode 是 originalEndNode,并且它是一个
CharacterData节点:-
使用 originalStartOffset、 originalEndOffset − originalStartOffset 和空字符串替换数据 originalStartNode。
-
返回。
-
-
令 nodesToRemove 为this 中所有被 包含的节点的列表,按树顺序排列,并省略其父节点也被 包含在 this 中的任何 节点。
-
令 newNode 和 newOffset 为 null。
-
如果 originalStartNode 是 originalEndNode 的包含自身的祖先,则将 newNode 设置为 originalStartNode,并将 newOffset 设置为 originalStartOffset。
-
否则:
-
如果 originalStartNode 是一个
CharacterData节点,则 使用 originalStartOffset、 originalStartNode 的长度 − originalStartOffset 和 空字符串替换 数据 originalStartNode。 -
如果 originalEndNode 是一个
CharacterData节点,则 使用 0、originalEndOffset 和 空字符串替换 数据 originalEndNode。
要提取一个实时范围 range:
-
如果 range 已折叠,则返回 fragment。
-
令 originalStartNode、originalStartOffset、 originalEndNode 和 originalEndOffset 分别为 range 的 起始节点、起始 偏移量、结束节点和 结束偏移量。
-
如果 originalStartNode 是 originalEndNode,并且它是一个
CharacterData节点: -
令 commonAncestor 为 range 获取公共 祖先的结果。
-
令 firstPartiallyContainedChild 为 null。
- 如果 originalStartNode 不是 originalEndNode 的包含自身的 祖先,则将 firstPartiallyContainedChild 设置为 commonAncestor 中第一个在 range 中被 部分 包含的子节点。
-
令 lastPartiallyContainedChild 为 null。
-
如果 originalEndNode 不是 originalStartNode 的包含自身的祖先,则将 lastPartiallyContainedChild 设置为 commonAncestor 中最后一个 在 range 中被 部分 包含的子节点。
这些变量赋值实际上始终是有意义的。例如, 如果 originalStartNode 不是 originalEndNode 的包含自身的祖先, originalStartNode 本身就在 range 中被 部分 包含,其所有祖先也都是如此,直到 commonAncestor 的一个子节点为止。 commonAncestor 不可能是 originalStartNode,因为它必须是 originalEndNode 的 包含自身的祖先。另一种情况类似。此外, 请注意,如果两个子节点都有定义,它们永远不会相等。
-
令 containedChildren 为 commonAncestor 中所有 在 range 中被包含的子节点的列表,按 树 顺序排列。
-
如果 containedChildren 的任何成员是一个文档类型,则抛出一个 “
HierarchyRequestError”DOMException。无需担心第一个或最后一个部分 包含的节点,因为文档类型永远不可能被 部分包含。它不能是范围的边界点,也 不可能是任何事物的祖先。
-
令 newNode 和 newOffset 为 null。
-
如果 originalStartNode 是 originalEndNode 的包含自身的祖先,则将 newNode 设置为 originalStartNode,并将 newOffset 设置为 originalStartOffset。
-
否则:
-
如果 firstPartiallyContainedChild 是一个
CharacterData节点:在这种情况下,firstPartiallyContainedChild 是 originalStartNode。
-
否则,如果 firstPartiallyContainedChild 非 null:
-
对于 containedChildren 中的每个 contained child:将 contained child 附加到 fragment。
-
如果 lastPartiallyContainedChild 是一个
CharacterData节点:在这种情况下,lastPartiallyContainedChild 是 originalEndNode。
-
否则,如果 lastPartiallyContainedChild 非 null:
-
返回 fragment。
要 克隆内容 一个实时范围 range:
-
如果 range 已折叠,则返回 fragment。
-
令 originalStartNode、originalStartOffset、 originalEndNode 和 originalEndOffset 分别为 range 的 起始节点、起始 偏移量、结束节点和 结束偏移量。
-
如果 originalStartNode 是 originalEndNode,并且它是一个
CharacterData节点: -
令 commonAncestor 为 range 获取公共 祖先的结果。
-
令 firstPartiallyContainedChild 为 null。
-
如果 originalStartNode 不是 originalEndNode 的包含自身的祖先,则将 firstPartiallyContainedChild 设置为 commonAncestor 中第一个 在 range 中被 部分 包含的子节点。
-
令 lastPartiallyContainedChild 为 null。
-
如果 originalEndNode 不是 originalStartNode 的包含自身的祖先,则将 lastPartiallyContainedChild 设置为 commonAncestor 中最后一个 在 range 中被 部分 包含的子节点。
这些变量赋值实际上始终是有意义的。例如, 如果 originalStartNode 不是 originalEndNode 的包含自身的祖先, originalStartNode 本身就在 range 中被 部分 包含,其所有祖先也都是如此,直到 commonAncestor 的一个子节点为止。 commonAncestor 不可能是 originalStartNode,因为它必须是 originalEndNode 的 包含自身的祖先。另一种情况类似。此外, 请注意,如果两个子节点都有定义,它们永远不会相等。
-
令 containedChildren 为 commonAncestor 中所有 在 range 中被包含的子节点的列表,按 树 顺序排列。
-
如果 containedChildren 的任何成员是一个文档类型,则抛出一个 “
HierarchyRequestError”DOMException。无需担心第一个或最后一个部分 包含的节点,因为文档类型永远不可能被 部分包含。它不能是范围的边界点,也 不可能是任何事物的祖先。
-
如果 firstPartiallyContainedChild 是一个
CharacterData节点:在这种情况下,firstPartiallyContainedChild 是 originalStartNode。
-
否则,如果 firstPartiallyContainedChild 非 null:
-
对于 containedChildren 中的每个 contained child:
-
如果 lastPartiallyContainedChild 是一个
CharacterData节点:在这种情况下,lastPartiallyContainedChild 是 originalEndNode。
-
否则,如果 lastPartiallyContainedChild 非 null:
-
返回 fragment。
要将一个节点 node 插入到一个实时范围 range 中:
-
如果 range 的起始节点是一个
ProcessingInstruction或Comment节点,是一个其父节点为 null 的Text节点,或者是 node,则抛出一个“HierarchyRequestError”DOMException。 -
令 referenceNode 为 null。
-
否则,如果存在一个 range 的 起始节点的子节点,其索引为 range 的 起始偏移量,则将 referenceNode 设置为该子节点; 否则设置为 null。
-
如果 referenceNode 为 null,则令 parent 为 range 的起始节点; 否则为 referenceNode 的父节点。
-
给定 node、parent、 referenceNode 和 « »,确保预插入有效性。
-
如果 range 的起始节点是一个
Text节点,则使用 range 的起始偏移量拆分它,并将 referenceNode 设置为结果。 -
如果 node 是 referenceNode,则将 referenceNode 设置为其 下一个同胞。
-
如果 referenceNode 为 null,则令 newOffset 为 parent 的长度; 否则为 referenceNode 的索引。
-
如果 node 是一个
DocumentFragment节点,则将 newOffset 增加 node 的长度;否则增加 1。 -
将 node 预插入到 parent 中、位于 referenceNode 之前。
surroundContents(newParent) 方法
步骤
如下:
-
如果一个非
Text节点在 this 中被部分包含,则抛出一个 “InvalidStateError”DOMException。 -
如果 newParent 是一个
Document、DocumentType或DocumentFragment节点,则抛出一个“InvalidNodeTypeError”DOMException。由于历史原因,这里不会检查
CharacterData节点, 它们最终会在稍后作为副作用抛出异常。 -
将 fragment 附加到 newParent。
detach() 方法步骤是什么也不做。
其功能(禁用一个 Range 对象)
已被移除,但该方法本身
为了兼容性而保留。
- position = range .
comparePoint(node, offset) - 如果该点位于范围之前,则返回 −1;如果该点 位于范围内,则返回 0;如果该点位于范围之后,则返回 1。
- intersects = range .
intersectsNode(node) - 返回 range 是否与 node 相交。
isPointInRange(node, offset)
方法步骤如下:
-
如果 node 是一个文档类型,则抛出一个 “
InvalidNodeTypeError”DOMException。 -
如果 offset 大于 node 的长度,则 抛出一个“
IndexSizeError”DOMException。 -
返回 true。
comparePoint(node, offset)
方法步骤如下:
-
如果 node 的根不是this 的根, 则抛出一个“
WrongDocumentError”DOMException。 -
如果 node 是一个文档类型,则抛出一个 “
InvalidNodeTypeError”DOMException。 -
如果 offset 大于 node 的长度,则 抛出一个“
IndexSizeError”DOMException。 -
返回 0。
intersectsNode(node) 方法步骤如下:
字符串化行为必须运行 以下步骤:
createContextualFragment()、
getClientRects()
和 getBoundingClientRect()
方法在其他规范中定义。
[DOM-Parsing]
[CSSOM-VIEW]
6. 遍历
NodeIterator
和 TreeWalker
对象可用于筛选和遍历节点
树。
每个 NodeIterator
和 TreeWalker
对象都有一个关联的布尔值
处于活动状态,以避免递归调用。其
初始值为 false。
每个 NodeIterator
和 TreeWalker
对象还有一个关联的
根(一个节点)、一个
whatToShow(一个位掩码),以及一个
筛选器(一个回调)。
要在
一个 NodeIterator
或 TreeWalker
对象 traverser 中筛选一个节点 node:
-
如果 traverser 的处于活动状态为 true,则抛出一个 “
InvalidStateError”DOMException。 -
令 n 为 node 的
nodeType属性值 − 1。 -
如果 traverser 的whatToShow 的第 n位(其中 0 是最低有效位)未设置,则返回
FILTER_SKIP。 -
如果 traverser 的筛选器为 null,则返回
FILTER_ACCEPT。 -
将 traverser 的处于活动状态设置为 true。
-
令 result 为使用 traverser 的筛选器、“
acceptNode”和 « node » 调用用户对象操作的返回值。如果此操作抛出异常,则将 traverser 的 处于活动状态设置为 false,并重新抛出该异常。 -
将 traverser 的处于活动状态设置为 false。
-
返回 result。
6.1. 接口 NodeIterator
[Exposed =Window ]interface { [NodeIterator SameObject ]readonly attribute Node root ;readonly attribute Node referenceNode ;readonly attribute boolean pointerBeforeReferenceNode ;readonly attribute unsigned long whatToShow ;readonly attribute NodeFilter ?filter ;Node ?nextNode ();Node ?previousNode ();undefined detach (); };
NodeIterator
对象可以使用 Document
对象上的
createNodeIterator()
方法创建。
每个 NodeIterator
对象都有一个关联的
迭代器集合,它是一个以该 NodeIterator
对象的根为根的
集合,其
筛选器匹配任何节点。
一个节点指针是一个元组, 由一个 节点(一个节点)和一个 指针在前(一个布尔值)组成。
每个 NodeIterator
对象还有一个关联的引用(一个
节点指针)和候选引用(null 或一个
节点指针,且初始为
null)。
如前所述,NodeIterator
对象还有关联的
处于
活动状态、根、whatToShow 和
筛选器。
给定一个 NodeIterator
对象 nodeIterator 和一个节点
toBeRemovedNode,NodeIterator 预移除步骤
如下:
要在给定一个节点指针
nodePointer、一个 NodeIterator
对象 nodeIterator 和一个节点
toBeRemovedNode 的情况下,调整节点指针,执行以下步骤。它们返回一个节点指针。
whatToShow 获取器步骤是返回
this 的whatToShow。
要遍历,给定一个
NodeIterator
对象 iterator 和值为“next”或“previous”的
type:
-
令 result 为 null。
-
当 true 时:
-
如果 type 是“
next”: -
否则:
-
令 filterResult 为在 iterator 中筛选 node 的结果。如果此操作抛出异常,则将 iterator 的 候选引用设置为 null,并 重新抛出该异常。
-
如果 filterResult 是
FILTER_ACCEPT:
-
-
将 iterator 的候选引用设置为 null。
-
返回 result。
detach() 方法步骤是什么也不做。
其功能(禁用一个 NodeIterator
对象)已被移除,但该方法
本身为了兼容性而保留。
6.2.
接口 TreeWalker
[Exposed =Window ]interface { [TreeWalker SameObject ]readonly attribute Node root ;readonly attribute unsigned long whatToShow ;readonly attribute NodeFilter ?filter ;attribute Node currentNode ;Node ?parentNode ();Node ?firstChild ();Node ?lastChild ();Node ?previousSibling ();Node ?nextSibling ();Node ?previousNode ();Node ?nextNode (); };
TreeWalker
对象可以使用 createTreeWalker()
方法在 Document
对象上创建。
每个 TreeWalker
对象都有一个关联的当前节点(一个
节点)。
如前所述,TreeWalker
对象还有关联的
根、whatToShow 和筛选器。
whatToShow 获取器步骤是返回
this 的whatToShow。
currentNode
设置器步骤是将 this 的
当前节点设置为
给定值。
parentNode() 方法步骤如下:
要遍历子节点,给定一个
TreeWalker
对象 walker 和值为“first”或“last”的
type:
-
令 node 为 walker 的当前节点。
-
如果 type 是 “
first”,则将 node 设置为 node 的第一个子节点;否则设置为 node 的最后一个子节点。 -
当 node 非 null 时:
-
令 result 为在 walker 中筛选 node 的结果。
-
如果 result 是
FILTER_ACCEPT, 则将 walker 的 当前节点设置为 node,并返回 node。 -
如果 result 是
FILTER_SKIP: -
当 node 非 null 时:
-
-
返回 null。
要遍历
同胞,给定一个 TreeWalker
对象 walker 和值为“next”或“previous”的 type:
-
令 node 为 walker 的当前节点。
-
如果 node 是根,则返回 null。
-
当 true 时:
-
当 sibling 非 null 时:
-
将 node 设置为 sibling。
-
令 result 为在 walker 中筛选 node 的结果。
-
如果 result 是
FILTER_ACCEPT, 则将 walker 的 当前节点设置为 node,并返回 node。 -
如果 type 是“
next”,则将 sibling 设置为 node 的第一个子节点;否则设置为 node 的 最后一个子节点。 -
如果 result 是
FILTER_REJECT或 sibling 为 null,则 如果 type 是“next”,将 sibling 设置为 node 的下一个同胞;否则设置为 node 的前一个同胞。
-
-
将 node 设置为 node 的父节点。
-
如果 node 为 null 或为 walker 的根,则返回 null。
-
如果在 walker 中筛选 node 的返回值是
FILTER_ACCEPT, 则返回 null。
previousNode() 方法步骤如下:
nextNode() 方法步骤如下:
-
令 result 为
FILTER_ACCEPT。 -
当 true 时:
-
当 result 不是
FILTER_REJECT且 node 有一个 子节点时: -
令 sibling 为 null。
-
令 temporary 为 node。
-
当 temporary 非 null 时:
-
如果 sibling 为 null,则返回 null。
-
将 node 设置为 sibling。
-
如果 result 是
FILTER_ACCEPT, 则将 this 的 当前节点设置为 node,并返回 node。
-
6.3.
接口 NodeFilter
[Exposed =Window ]callback interface { // Constants for acceptNode()NodeFilter const unsigned short FILTER_ACCEPT = 1;const unsigned short FILTER_REJECT = 2;const unsigned short FILTER_SKIP = 3; // Constants for whatToShowconst unsigned long SHOW_ALL = 0xFFFFFFFF;const unsigned long SHOW_ELEMENT = 0x1;const unsigned long SHOW_ATTRIBUTE = 0x2;const unsigned long SHOW_TEXT = 0x4;const unsigned long SHOW_CDATA_SECTION = 0x8;const unsigned long = 0x10; // legacySHOW_ENTITY_REFERENCE const unsigned long = 0x20; // legacySHOW_ENTITY const unsigned long SHOW_PROCESSING_INSTRUCTION = 0x40;const unsigned long SHOW_COMMENT = 0x80;const unsigned long SHOW_DOCUMENT = 0x100;const unsigned long SHOW_DOCUMENT_TYPE = 0x200;const unsigned long SHOW_DOCUMENT_FRAGMENT = 0x400;const unsigned long = 0x800; // legacySHOW_NOTATION unsigned short (acceptNode Node ); };node
NodeFilter
对象可以用作 filter
用于 NodeIterator
和 TreeWalker
对象,
并且为它们的 whatToShow 位掩码提供常量。
NodeFilter
对象通常实现为 JavaScript 函数。
这些常量可用作 过滤器 的返回值:
FILTER_ACCEPT(1);FILTER_REJECT(2);FILTER_SKIP(3)。
这些常量可用于 whatToShow:
SHOW_ALL(4294967295, 十六进制为 FFFFFFFF);SHOW_ELEMENT(1);SHOW_ATTRIBUTE(2);SHOW_TEXT(4);SHOW_CDATA_SECTION(8);SHOW_PROCESSING_INSTRUCTION(64, 十六进制为 40);SHOW_COMMENT(128, 十六进制为 80);SHOW_DOCUMENT(256, 十六进制为 100);SHOW_DOCUMENT_TYPE(512,十六进制为 200);SHOW_DOCUMENT_FRAGMENT(1024,十六进制为 400)。
7. 集合
是的,DOMTokenList
这个名称确实是遗留问题的不幸产物。
7.1.
接口 DOMTokenList
[Exposed =Window ]interface {DOMTokenList readonly attribute unsigned long length ;getter DOMString ?item (unsigned long );index boolean contains (DOMString ); [token CEReactions ]undefined add (DOMString ...); [tokens CEReactions ]undefined remove (DOMString ...); [tokens CEReactions ]boolean toggle (DOMString ,token optional boolean ); [force CEReactions ]boolean replace (DOMString ,token DOMString );newToken boolean supports (DOMString ); [token CEReactions ]stringifier attribute DOMString value ;iterable <DOMString >; };
一个 DOMTokenList
对象有一个关联的
标记集合(一个集合),其
初始为空。
一个 DOMTokenList
对象还有一个关联的元素
(一个元素)和一个属性名称(一个属性的
本地名称)。
规范可以为一个 DOMTokenList
的
元素和属性名称定义
支持的标记。
一个 DOMTokenList
对象 set 对给定
token 的
验证步骤如下:
一个 DOMTokenList
对象 set 的
更新步骤如下:
一个 DOMTokenList
对象 set 的
序列化步骤是返回在给定 set 的
元素和
set 的属性名称的情况下运行获取属性值的结果。
一个 DOMTokenList
对象 set 对 set 的元素具有以下属性更改步骤:
当一个 DOMTokenList
对象 set 被创建时:
tokenlist .length-
返回标记的数量。
tokenlist .item(index)tokenlist[index]-
返回索引为 index 的标记。
tokenlist .contains(token)-
如果 token 存在,则返回 true;否则返回 false。
tokenlist . add(tokens…)-
添加传入的所有参数,但已存在的参数除外。
如果其中一个参数是空 字符串,则抛出一个“
SyntaxError”DOMException。如果其中一个参数 包含任何ASCII 空白,则抛出一个“
InvalidCharacterError”DOMException。 tokenlist . remove(tokens…)-
如果传入的参数存在,则移除它们。
如果其中一个参数是空 字符串,则抛出一个“
SyntaxError”DOMException。如果其中一个参数 包含任何ASCII 空白,则抛出一个“
InvalidCharacterError”DOMException。 tokenlist . toggle(token [, force])-
如果未给出 force,则“切换”token:存在时将其移除, 不存在时将其添加。如果 force 为 true,则添加 token (与
add()相同)。 如果 force 为 false,则移除 token(与remove()相同)。如果 token 现在存在,则返回 true;否则返回 false。
如果 token 为空,则抛出一个“
SyntaxError”DOMException。如果 token 包含 任何空格,则抛出一个“
InvalidCharacterError”DOMException。 tokenlist . replace(token, newToken)-
用 newToken 替换 token。
如果 token 已被 newToken 替换,则返回 true;否则返回 false。
如果其中一个参数是空 字符串,则抛出一个“
SyntaxError”DOMException。如果其中一个参数 包含任何ASCII 空白,则抛出一个“
InvalidCharacterError”DOMException。 tokenlist . supports(token)-
如果 token 位于关联属性支持的标记中,则返回 true。否则返回 false。
如果关联属性未定义支持的标记,则抛出一个
TypeError。 tokenlist .value-
以字符串形式返回关联的集合。
可以设置该值,以更改关联属性。
该对象的支持的属性索引是从零到该对象的 标记集合的大小 − 1 范围内的数字,除非标记集合 为 空, 在这种情况下,不存在支持的属性索引。
add(tokens…)
方法步骤如下:
-
对于 tokens 中的每个 token:
-
如果 token 是空字符串,则抛出 一个“
SyntaxError”DOMException。 -
如果 token 包含任何ASCII 空白,则抛出 一个 “
InvalidCharacterError”DOMException。
-
-
运行更新 步骤。
remove(tokens…)
方法步骤如下:
-
对于 tokens 中的每个 token:
-
如果 token 是空字符串,则抛出 一个“
SyntaxError”DOMException。 -
如果 token 包含任何ASCII 空白,则抛出 一个 “
InvalidCharacterError”DOMException。
-
-
运行更新步骤。
toggle(token, force)
方法步骤如下:
-
如果 token 是空字符串,则抛出一个 “
SyntaxError”DOMException。 -
如果 token 包含任何ASCII 空白,则抛出一个 “
InvalidCharacterError”DOMException。 -
否则,如果未给出 force 或其为 true,则将 token 附加到 this 的标记集合,运行更新步骤,并返回 true。
-
返回 false。
为了 Web 兼容性,toggle()
并不总是运行更新步骤。
replace(token, newToken)
方法步骤如下:
-
如果 token 或 newToken 中任一个是空字符串,则抛出一个 “
SyntaxError”DOMException。 -
如果 token 或 newToken 中任一个包含任何ASCII 空白,则 抛出一个“
InvalidCharacterError”DOMException。 -
运行更新步骤。
-
返回 true。
为了 Web 兼容性,replace()
并不总是运行更新步骤。
supports(token)
方法步骤如下:
-
令 result 为使用 token 调用验证步骤的返回值。
-
返回 result。
8. XPath
DOM Level 3 XPath 定义了一个用于评估XPath 1.0表达式的 API。 这些 API 被广泛实现,但未得到维护。接口定义在此保留,以便在 Web IDL 发生变化时可以更新。 完整的这些 API 的定义仍然是必要的,此类工作已被跟踪并可以在 whatwg/dom#67 中贡献。 [DOM-Level-3-XPath] [XPath] [WEBIDL]
8.1.
接口 XPathResult
[Exposed =Window ]interface {XPathResult const unsigned short = 0;ANY_TYPE const unsigned short = 1;NUMBER_TYPE const unsigned short = 2;STRING_TYPE const unsigned short = 3;BOOLEAN_TYPE const unsigned short = 4;UNORDERED_NODE_ITERATOR_TYPE const unsigned short = 5;ORDERED_NODE_ITERATOR_TYPE const unsigned short = 6;UNORDERED_NODE_SNAPSHOT_TYPE const unsigned short = 7;ORDERED_NODE_SNAPSHOT_TYPE const unsigned short = 8;ANY_UNORDERED_NODE_TYPE const unsigned short = 9;FIRST_ORDERED_NODE_TYPE readonly attribute unsigned short ;resultType readonly attribute unrestricted double ;numberValue readonly attribute DOMString ;stringValue readonly attribute boolean ;booleanValue readonly attribute Node ?;singleNodeValue readonly attribute boolean ;invalidIteratorState readonly attribute unsigned long ;snapshotLength Node ?();iterateNext Node ?(snapshotItem unsigned long ); };index
8.2.
接口 XPathExpression
[Exposed =Window ]interface { // XPathResult.ANY_TYPE = 0XPathExpression XPathResult (evaluate Node ,contextNode optional unsigned short = 0,type optional XPathResult ?=result null ); };
8.3.
混入 XPathEvaluatorBase
callback interface {XPathNSResolver DOMString ?(lookupNamespaceURI DOMString ?); };prefix interface mixin { [XPathEvaluatorBase NewObject ]XPathExpression (createExpression DOMString ,expression optional XPathNSResolver ?=resolver null );Node createNSResolver (Node ); // legacy // XPathResult.ANY_TYPE = 0nodeResolver XPathResult (evaluate DOMString ,expression Node ,contextNode optional XPathNSResolver ?=resolver null ,optional unsigned short = 0,type optional XPathResult ?=result null ); };Document includes XPathEvaluatorBase ;
The createNSResolver(nodeResolver)
方法步骤是返回 nodeResolver。
此方法仅因历史原因存在。
8.4.
接口 XPathEvaluator
[Exposed =Window ]interface {XPathEvaluator (); };constructor XPathEvaluator includes XPathEvaluatorBase ;
由于历史原因,你既可以构造 XPathEvaluator
,也可以在 Document
上访问相同的
方法。
9. XSLT
XSL Transformations (XSLT) 是一种将 XML 文档转换为其他 XML 文档的语言。 本节定义的 API 已被广泛实现,并在此保留,以便在 Web IDL 发生变化时可以更新。 这些 API 的完整定义仍然是必要的,此类工作已被跟踪并可以在 whatwg/dom#181 中贡献。 [XSLT]
9.1.
接口 XSLTProcessor
[Exposed =Window ]interface {XSLTProcessor ();constructor undefined (importStylesheet Node ); [style CEReactions ]DocumentFragment (transformToFragment Node ,source Document ); [output CEReactions ]Document (transformToDocument Node );source undefined ([setParameter LegacyNullToEmptyString ]DOMString ,namespaceURI DOMString ,localName any );value any ([getParameter LegacyNullToEmptyString ]DOMString ,namespaceURI DOMString );localName undefined ([removeParameter LegacyNullToEmptyString ]DOMString ,namespaceURI DOMString );localName undefined ();clearParameters undefined (); };reset
10. 安全和隐私考虑
此标准没有已知的安全或隐私考虑。
11. 历史
此标准曾包含多个已被移除的接口和接口成员。
这些接口已被移除:
DOMConfigurationDOMErrorDOMErrorHandlerDOMImplementationListDOMImplementationSourceDOMLocatorDOMObjectDOMUserDataEntityEntityReferenceMutationEventMutationNameEventNameListNotationRangeExceptionTypeInfoUserDataHandler
这些接口成员已被移除:
Attr-
schemaTypeInfoisId
Document-
createEntityReference()xmlEncodingxmlStandalonexmlVersionstrictErrorCheckingdomConfignormalizeDocument()renameNode()
DocumentType-
entitiesnotationsinternalSubset
DOMImplementation-
getFeature()
Element-
schemaTypeInfosetIdAttribute()setIdAttributeNS()setIdAttributeNode()
Node-
isSupportedgetFeature()getUserData()setUserData()
NodeIterator-
expandEntityReferences
Text-
isElementContentWhitespacereplaceWholeText()
TreeWalker-
expandEntityReferences
致谢
多年来,许多人为使 DOM 更具互操作性作出了贡献,从而促进了该标准的目标。同样,许多人也为使该标准发展至今做出了帮助。
因此,特别感谢以下人士: Adam Klein, Adrian Bateman, Ahmid snuggs, Alex Komoroske, Alex Russell, Alexey Shvayka, Andreas Kling, Andreu Botella, Anthony Ramine, Arkadiusz Michalski, Armen Michaeli, Arnaud Le Hors, Arun Ranganathan, Benjamin Gruenbaum, Björn Höhrmann, Boris Zbarsky, Brandon Payton, Brandon Slade, Brandon Wallace, Brian Kardell, C. Scott Ananian, Cameron McCormack, Chris Dumez, Chris Paris, Chris Rebert, Cyrille Tuzi, Dan Burzo, Daniel Clark, Daniel Glazman, Darien Maillet Valentine, Darin Fisher, David Baron, David Bruant, David Flanagan, David Håsäther, David Hyatt, Deepak Sherveghar, Dethe Elza, Dimitri Glazkov, Domenic Denicola, Dominic Cooney, Dominique Hazaël-Massieux, Don Jordan, Doug Schepers, Edgar Chen, Elisée Maurer, Elliott Sprehn, Emilio Cobos Álvarez, Eric Bidelman, Erik Arvidsson, Evgeny Kapun, François Daoust, François Remy, Gary Kacmarcik, Gavin Nicol, Giorgio Liscio, Glen Huang, Glenn Adams, Glenn Maynard, Hajime Morrita, Harald Alvestrand, Hayato Ito, Henri Sivonen, Hongchan Choi, Hunan Rostomyan, Ian Hickson, Igor Bukanov, Jacob Rossi, Jake Archibald, Jake Verbaten, James Graham, James Greene, James M Snell, James Robinson, Jayson Chen, Jeffrey Yasskin, Jens Lindström, Jeremy Davis, Jesse McCarthy, Jinho Bang, João Eiras, Joe Kesselman, John Atkins, John Dai, Jonas Sicking, Jonathan Kingston, Jonathan Robie, Joris van der Wel, Joshua Bell, J. S. Choi, Jungkee Song, Justin Summerlin, Kagami Sascha Rosylight, 呂康豪 (Kang-Hao Lu), 田村健人 (Kent TAMURA), Kevin J. Sung, Kevin Sweeney, Kirill Topolyan, Koji Ishii, Lachlan Hunt, Lauren Wood, Luca Casonato, Luke Zielinski, Magne Andersson, Majid Valipour, Malte Ubl, Manish Goregaokar, Manish Tripathi, Marcos Caceres, Mark Miller, Martijn van der Ven, Mason Freed, Mats Palmgren, Mounir Lamouri, Michael Stramel, Michael™ Smith, Mike Champion, Mike Taylor, Mike West, Nicolás Peña Moreno, Nidhi Jaju, Ojan Vafai, Oliver Nightingale, Olli Pettay, Ondřej Žára, Peter Sharpe, Philip Jägenstedt, Philippe Le Hégaret, Piers Wombwell, Pierre-Marie Dartus, prosody—Gab Vereable Context(, Rafael Weinstein, Rakina Zata Amni, Richard Bradshaw, Rick Byers, Rick Waldron, Robbert Broersma, Robin Berjon, Roland Steiner, Rune F. Halvorsen, Russell Bicknell, Ruud Steltenpool, Ryosuke Niwa, Sam Dutton, Sam Sneddon, Samuel Giles, Sanket Joshi, Scott Haseley, Sebastian Mayr, Seo Sanghyeon, Sergey G. Grekhov, Shiki Okasaka, Shinya Kawanaka, Simon Pieters, Simon Wülker, Stef Busking, Steve Byrne, Steven Obiajulu, Stig Halvorsen, Tab Atkins, Takashi Sakamoto, Takayoshi Kochi, Theresa O’Connor, Theodore Dubois, timeless, Timo Tijhof, Tobie Langel, Tom Pixley, Travis Leithead, Trevor Rowbotham, triple-underscore, Tristan Fraipont, Veli Şenol, Vidur Apparao, Warren He, Xidorn Quan, Yash Handa, Yehuda Katz, Yoav Weiss, Yoichi Osato, Yoshinori Sano, Yu Han, Yusuke Abe, 和 Zack Weinberg, 感谢你们的出色贡献!
本标准由Anne van Kesteren (Apple, [email protected])编写,并得到了Aryeh Gregor ([email protected])和Ms2ger ([email protected])的实质性贡献。
知识产权
版权所有 © WHATWG (Apple, Google, Mozilla, Microsoft)。本作品根据知识共享署名 4.0 国际许可协议进行许可。如果其部分内容被整合到源代码中,则源代码中的这些部分将根据 BSD 3-Clause 许可证进行许可。
这是现行标准。那些对专利审查版本感兴趣的人应该查看现行标准审查草案。