DOM

现行标准 — 最后更新

参与:
GitHub whatwg/dom (新问题, 开放的问题)
在 Matrix 上聊天
提交:
GitHub whatwg/dom/commits
此提交的快照
测试:
web-platform-tests dom/ (进行中的工作)
翻译 (非规范性)
日本語
简体中文
한국어

摘要

DOM 定义了一个平台中立的模型,用于事件、活动中止和节点树。

1. 基础设施

本规范依赖于现行标准的基础设施标准。[INFRA]

本规范中使用的一些术语定义于 编码选择器受信任类型Web IDLXMLXML 中的命名空间将样式表与 XML 文档关联[ENCODING] [SELECTORS4] [TRUSTED-TYPES] [WEBIDL] [XML] [XML-NAMES] [XML-STYLESHEET]

当需要扩展时,可以相应地更新 DOM 标准,或者可以编写一个新标准,该标准可以利用为 适用的规范 提供的可扩展性钩子。

1.1.

是一个有限的层次树结构。树的顺序是对的先序、深度优先遍历。

参与的对象有一个父节点,它要么是 null,要么是一个对象,并且有子节点,它是一个对象的有序集合。对象A父节点是对象B,则AB子节点

对象的是它自己,如果它的为null,否则它的根是它的的根。的根是参与该的任意对象,而该对象的为null。

如果对象A是对象B,或者对象A是对象C,而CB后代,则对象A被称为对象B后代

包含后代是指一个对象或其后代之一。

当且仅当BA后代时,称对象A为对象B祖先

包含祖先是指一个对象或其祖先之一。

当且仅当BA共享相同的非空父节点时,称对象A为对象B同胞

包含同胞是指一个对象或其同胞之一。

如果AB在同一个中,并且A树的顺序中位于B之前,则称对象A先于对象B

如果AB在同一个中,并且A树的顺序中位于B之后,则称对象A继于对象B

一个对象的第一个子节点是其第一个子节点,如果它没有子节点,则为 null。

一个对象的最后一个子节点是其最后一个子节点,如果它没有子节点,则为 null。

一个对象的前一个同胞是指其第一个先于同胞,如果没有,则为 null。

一个对象的下一个同胞是指其第一个继于同胞,如果没有,则为 null。

一个对象的索引是其先于同胞的数量,如果没有,则为 0。

1.2. 有序集合

有序集合解析器接受一个字符串input,然后执行以下步骤:

  1. inputTokens在 ASCII 空白字符处分割input的结果。

  2. tokens为一个新的有序集合

  3. 对于 inputTokens 中的每个 token: 将 token 追加tokens

  4. 返回tokens

有序集合序列化器接受一个set,并返回使用U+0020 SPACE连接的set串联结果

1.3. 选择器

给定字符串 selectors节点 node作用域匹配选择器字符串 的步骤如下:

  1. selector解析选择器 selectors 的结果。 [SELECTORS4]

  2. 如果 selector 返回失败,则 抛出一个 "SyntaxError"DOMException

  3. 返回 selectornode根节点 通过 作用域根 node 进行 在树中匹配选择器 的结果。[SELECTORS4]

不打算支持在选择器中使用命名空间,也不会添加此功能。

1.4. 名称验证

当一个字符串满足以下条件时,称为有效的命名空间前缀:其长度至少为1,并且不包含ASCII 空白符、U+0000 NULL、U+002F (/) 或 U+003E (>)。

当一个字符串满足以下条件时,称为有效的属性本地名:其长度至少为1,并且不包含ASCII 空白符、U+0000 NULL、U+002F (/)、U+003D (=) 或 U+003E (>)。

当一个字符串name满足下列步骤返回 true 时,称为有效的元素本地名

  1. 如果name长度为0,则返回 false。

  2. 如果name的第0个码点ASCII 字母

    1. 如果name包含ASCII 空白符、U+0000 NULL、U+002F (/) 或 U+003E (>),则返回 false。

    2. 返回 true。

  3. 如果name的第0个码点不是 U+003A (:)、U+005F (_),也不在 U+0080~U+10FFFF 范围内,则返回 false。

  4. 如果name的后续码点(如有)不是ASCII 字母ASCII 数字、U+002D (-)、U+002E (.)、U+003A (:)、U+005F (_),或者不在 U+0080~U+10FFFF 范围内,则返回 false。

  5. 返回 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 (>),则它是一个有效的文档类型名称

空字符串是一个有效的文档类型名称

验证并提取一个 namespacequalifiedName,给定一个 context

  1. 如果 namespace 是空字符串,则将其设置为 null。

  2. prefix 设置为 null。

  3. localName 设置为 qualifiedName

  4. 如果 qualifiedName 包含 U+003A (:):

    1. prefix 设置为 qualifiedName 第一个 U+003A (:) 之前的部分。

    2. localName 设置为 qualifiedName 第一个 U+003A (:) 之后的部分。

    3. 如果 prefix 不是一个 有效的命名空间前缀,则 抛出 "InvalidCharacterError" DOMException

  5. 断言prefix 要么为 null,要么是一个 有效的命名空间前缀

  6. 如果 context 是 "attribute" 并且 localName 不是 有效的属性本地名称,则 抛出一个 "InvalidCharacterError" DOMException

  7. 如果 context 是 "element" 并且 localName 不是 有效的元素本地名称,则 抛出一个 "InvalidCharacterError" DOMException

  8. 如果 prefix 不为 null 且 namespace 为 null,则 抛出一个 "NamespaceError" DOMException

  9. 如果 prefix 是 "xml" 且 namespace 不是 XML 命名空间,则 抛出一个 "NamespaceError" DOMException

  10. 如果 qualifiedNameprefix 是 "xmlns" 并且 namespace 不是 XMLNS 命名空间,则 抛出一个 "NamespaceError" DOMException

  11. 如果 namespaceXMLNS 命名空间 并且 qualifiedNameprefix 均不是 "xmlns",则 抛出一个 "NamespaceError" DOMException

  12. 返回 (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; // legacy
  readonly 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;  // legacy
  undefined 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属性值设置为typeeventInitDict参数允许通过同名对象成员设置bubblescancelable属性。
event . type
返回event的类型,例如"click"、"hashchange"或"submit"。
event . target
返回event分派的对象(其目标)。
event . currentTarget
返回当前正在调用其事件侦听器回调函数的对象。
event . composedPath()
返回event调用目标对象(将在其上调用侦听器的对象),但不包括任何节点,这些节点在shadow 树中,其shadow root模式为"closed"且无法从eventcurrentTarget到达。
event . eventPhase
返回事件的阶段,它是以下之一:NONECAPTURING_PHASEAT_TARGETBUBBLING_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属性必须返回初始化时的值。当创建一个事件时,必须将该属性初始化为空字符串。

target获取步骤是返回this目标

srcElement获取步骤是返回this目标

currentTarget属性必须返回初始化时的值。当创建一个事件时,必须将该属性初始化为 null。

composedPath() 方法步骤是:

  1. composedPath 为空列表

  2. paththis路径

  3. 如果 path 为空,则返回 composedPath

  4. currentTargetthiscurrentTarget 属性值。

  5. 断言currentTarget 是一个 EventTarget 对象。

  6. currentTarget 追加composedPath

  7. currentTargetIndex 为 0。

  8. currentTargetHiddenSubtreeLevel 为 0。

  9. indexpath大小 − 1。

  10. index 大于或等于 0 时:

    1. 如果 path[index] 的闭合树的根为 true,则将 currentTargetHiddenSubtreeLevel 增加 1。

    2. 如果 path[index] 的调用目标currentTarget,则将 currentTargetIndex 设为 index中断

    3. 如果 path[index] 的闭合树中的插槽为 true,则将 currentTargetHiddenSubtreeLevel 减少 1。

    4. index 减少 1。

  11. currentHiddenLevelmaxHiddenLevelcurrentTargetHiddenSubtreeLevel

  12. index 设为 currentTargetIndex − 1。

  13. index 大于或等于 0 时:

    1. 如果 path[index] 的闭合树的根为 true,则将 currentHiddenLevel 增加 1。

    2. 如果 currentHiddenLevel 小于或等于 maxHiddenLevel,则将 path[index] 的前置 调用目标composedPath

    3. 如果 path[index] 的闭合树中的插槽为 true:

      1. currentHiddenLevel 减少 1。

      2. 如果 currentHiddenLevel 小于 maxHiddenLevel,则将 maxHiddenLevel 设为 currentHiddenLevel

    4. index 减少 1。

  14. currentHiddenLevelmaxHiddenLevel 设为 currentTargetHiddenSubtreeLevel

  15. index 设为 currentTargetIndex + 1。

  16. index 小于 path大小时:

    1. 如果 path[index] 的闭合树中的插槽为 true,则将 currentHiddenLevel 增加 1。

    2. 如果 currentHiddenLevel 小于或等于 maxHiddenLevel,则将 path[index] 的追加 调用目标composedPath

    3. 如果 path[index] 的闭合树的根为 true:

      1. currentHiddenLevel 减少 1。

      2. 如果 currentHiddenLevel 小于 maxHiddenLevel,则将 maxHiddenLevel 设为 currentHiddenLevel

    4. index 增加 1。

  17. 返回 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立即停止传播标志

bubblescancelable属性必须返回初始化时的值。

设置取消标志,给定一个事件event,如果eventcancelable属性值为 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,使用typebubblescancelable,运行以下步骤:

  1. 设置event初始化标志

  2. 取消设置event停止传播标志立即停止传播标志取消标志

  3. 设置eventisTrusted属性为 false。

  4. 设置event目标为 null。

  5. eventtype属性设置为type

  6. eventbubbles属性设置为bubbles

  7. eventcancelable属性设置为cancelable

initEvent(type, bubbles, cancelable)方法的步骤为:

  1. 如果this分派标志已设置,则返回。

  2. 初始化this,使用typebubblescancelable

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) 方法的步骤如下:

  1. 如果 thisdispatch flag 已设置,则返回。

  2. 初始化 this ,包括 typebubblescancelable

  3. thisdetail 属性设置为 detail

2.5. 构造事件

规范可能会为所有或某些事件定义事件构造步骤。该算法接收一个事件event和一个EventIniteventInitDict,如内部事件创建步骤中所示。

这个构造方式可用于Event子类,它们具有比简单的初始化字典成员和IDL属性之间一对一映射更复杂的结构。

构造函数Event接口,或继承自Event接口的接口被调用时,必须运行以下步骤,给定参数typeeventInitDict

  1. 运行内部事件创建步骤,以获得event,使用此接口、null、当前时间和eventInitDict

  2. eventtype属性初始化为type

  3. 返回event

要使用eventInterface 创建事件,该接口必须是Event或继承自它的接口,并且可选地提供realm realm,运行以下步骤:

  1. 如果未提供realm,则将其设置为null。

  2. dictionary设置为将JavaScript值undefined转换为eventInterface构造函数所接受的字典类型的结果。(此字典类型将是EventInit或继承自它的字典类型。)

    如果需要成员,这种方法不起作用;请参见whatwg/dom#600

  3. 运行内部事件创建步骤,以eventInterfacerealm、该事件信号发生的时间和dictionary为参数,得到event

    在macOS中,输入操作的发生时间可以通过NSEvent对象的timestamp属性获得。

  4. eventisTrusted属性初始化为true。

  5. 返回event

创建事件用于需要分别创建分发事件的其他规范,而不是简单地触发事件。它确保事件的属性初始化为正确的默认值。

内部事件创建步骤,给定eventInterfacerealmtimedictionary,如下所示:

  1. 使用eventInterface创建一个新对象作为event的结果。如果realm非空,则使用该realm;否则,使用Web IDL中定义的默认行为。

    截至本文撰写时,Web IDL 尚未定义任何默认行为;请参见whatwg/webidl#135

  2. 设置event初始化标志

  3. eventtimeStamp属性初始化为给定timeevent相关全局对象相对高分辨率粗略时间

  4. 对于 dictionary 中的每个 membervalue: 如果 event 具有 标识符member 的属性,则将该属性初始化为 value

  5. 运行事件构造步骤,参数为eventdictionary

  6. 返回event

2.6. 定义事件接口

通常,在定义一个继承自Event的新接口时,请务必征求WHATWGW3C 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 对象都有一个相关的事件监听器列表(一个由零个或多个事件监听器组成的列表)。它最初是空的列表。

一个事件监听器 可以用于观察特定的事件,它由以下部分组成:

虽然回调是一个 EventListener 对象,事件监听器 是一个更广泛的概念,如上所述。

每个 EventTarget 对象还有一个相关的获取父级算法, 该算法接收一个事件 event,并返回一个EventTarget 对象。除非另有说明,它返回null。

节点影子根节点文档会重写 获取父级算法。

每个 EventTarget 对象可以有一个相关的激活行为算法。该激活行为算法接收一个事件,如 派发 算法中所示。

这是因为用户代理在某些EventTarget 对象上执行某些操作,例如 area 元素,以响应其MouseEventtype 属性为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,当信号被中止时,监听器将被移除。

若已存在相同typecallbackcapture的事件监听器,则不会再次添加。

target . removeEventListener(type, callback [, options])

移除target中与typecallbackoptions匹配的事件监听器。

target . dispatchEvent(event)

派发event事件,并返回true,若事件的cancelable属性为false或未调用preventDefault(),否则返回false。

展开 options,请执行以下步骤:

  1. 如果options是布尔值,则返回options

  2. 返回options["capture"]。

进一步展开 options,请执行以下步骤:

  1. captureoptions展开的结果。

  2. once为false。

  3. passivesignal为null。

  4. 如果options是一个字典,则:

    1. once设置为options["once"]。

    2. 如果options["passive"] 存在,则将passive设置为options["passive"]。

    3. 如果options["signal"] 存在,则将signal设置为options["signal"]。

  5. 返回capturepassiveoncesignal

new EventTarget()构造函数步骤不执行任何操作。

由于其他地方声明的默认值,返回的EventTarget获取父级算法将返回null,并且它没有激活行为遗留预激活行为, 或遗留取消激活行为

将来我们可以允许自定义的 获取父级 算法。如果这会有用, 请支持 issue #583。目前,所有 由作者创建的 EventTarget 都不参与树结构。

默认被动值,给定一个事件类型type和一个EventTarget eventTarget,由下列步骤决定:

  1. 若下列条件全部满足,则返回true:

  2. 返回false。

添加事件监听器,给定一个EventTarget 对象eventTarget和一个事件监听器listener,请执行以下步骤:

  1. eventTarget是一个ServiceWorkerGlobalScope 对象,其service worker脚本资源曾经评估过的标志被设置,且listener类型与任何service worker 事件类型属性值匹配,则向控制台报告一个警告,提示这可能不会产生预期结果。[SERVICE-WORKERS]

  2. 如果 listenersignal 不为 null 并且已中止,则返回。

  3. listener回调为null,则返回。

  4. listener被动为null,则将其设置为listener默认被动值,根据listener类型eventTarget

  5. eventTarget事件监听器列表包含一个事件监听器,其类型listener类型回调listener回调,且捕获listener捕获,则追加 listenereventTarget事件监听器列表中。

  6. listener信号不为null,则添加以下中止步骤:

    1. 移除事件监听器,使用eventTargetlistener

添加事件监听器的概念是为了确保事件处理器使用相同的代码路径。[HTML]

addEventListener(type, callback, options) 方法步骤为:

  1. capturepassiveoncesignal进一步展开 options的结果。

  2. 添加事件监听器,使用this和一个事件监听器,其类型type回调callback捕获capture被动passive一次性once信号signal

移除事件监听器,给定一个EventTarget 对象eventTarget和一个事件监听器 listener,请执行以下步骤:

  1. 如果eventTargetServiceWorkerGlobalScope对象,并且它的Service Worker要处理的事件类型集合包含listener类型,那么报告一个警告到控制台,表明这可能不会产生预期的结果。[SERVICE-WORKERS]

  2. listenerremoved设置为true,并且eventTarget事件侦听器列表中移除listener

HTML 需要这个来定义事件处理器。[HTML]

移除所有事件监听器,给定一个EventTarget 对象eventTarget: 对其每个 listener事件监听器列表项: 移除事件监听器,使用eventTargetlistener

HTML 需要这个来定义document.open()[HTML]

removeEventListener(type, callback, options) 方法步骤为:

  1. capture展开options的结果。

  2. 如果this事件 监听器列表 包含一个事件监听器, 其类型type回调callback,且捕获capture,则移除事件监听器,使用this和该事件监听器

事件侦听器列表不会包含具有相同typecallbackcapture的多个事件侦听器,因为添加事件侦听器会防止这种情况发生。

dispatchEvent(event)方法步骤为:

  1. event派发标志已设置,或其初始化标志未设置,则抛出一个“InvalidStateErrorDOMException

  2. eventisTrusted属性初始化为false。

  3. 返回派发 eventthis的结果。

2.8. 观察事件监听器

一般来说,开发者不会期望事件监听器的存在是可观察的。 事件监听器的影响由其回调决定。也就是说, 开发者添加一个无操作的事件监听器时不会期望它有任何副作用。

不幸的是,一些事件API的设计使得要高效实现它们就需要观察事件侦听器。这使得侦听器的存在是可观察的,即使是空的侦听器也可能对应用程序的行为产生显著的性能影响。例如,可以用于阻止异步滚动的触摸和滚轮事件。在某些情况下,可以通过仅在存在至少一个非被动侦听器时将事件指定为可取消来缓解这一问题。例如,非被动触摸事件侦听器必须阻止滚动,但如果所有侦听器都是被动的,则可以通过使触摸事件不可取消(从而忽略对preventDefault()的调用)来允许滚动并行开始。因此,分派事件的代码能够观察到非被动侦听器的缺失,并使用该信息来清除正在分派的事件的可取消属性。

理想情况下,任何新的事件API都应定义为不需要此属性。(请使用whatwg/dom进行讨论。)

获取遗留的Service Worker获取事件侦听器回调,给定一个ServiceWorkerGlobalScopeglobal,请运行以下步骤。这些步骤将返回一个EventListener对象的列表

  1. callbacks 为 « »。

  2. 对于每一个 listener 属于 global事件监听器列表:如果 listener类型为 "fetch" 并且 listener回调 不为 null, 则 listener回调添加到 callbacks

  3. 返回 callbacks

2.9. 分发事件

要将一个 事件 event 分派给一个 EventTarget 对象 target,并带有可选的 legacy target override flag 和 可选的 legacyOutputDidListenersThrowFlag

  1. 设置 eventdispatch flag

  2. targetOverridetarget,如果未给定 legacy target override flag; 否则为 target关联的 Document[HTML]

    legacy target override flag 仅由 HTML 使用,并且仅在 target 是一个 Window 对象时使用。

  3. activationTarget 为 null。

  4. relatedTarget 为将 eventrelatedTarget 相对于 target 进行重定向的结果。

  5. clearTargets 为 false。

  6. 如果 target 不是 relatedTarget,或 targeteventrelatedTarget

    1. touchTargets 为一个新的 列表

    2. 对于 event触摸目标列表中的每个 touchTarget:将 touchTarget 相对于 target 进行重定向的结果 追加touchTargets

    3. 使用 eventtargettargetOverriderelatedTargettouchTargets 和 false 追加到事件路径

    4. isActivationEvent 为 true,如果 event 是一个 MouseEvent 对象 且 eventtype 属性是 "click";否则为 false。

    5. 如果 isActivationEvent 为 true 且 target 具有 激活行为,则将 activationTarget 设置为 target

    6. slottabletarget,如果 target 是一个 可插槽分配对象已分配;否则为 null。

    7. slotInClosedTree 为 false。

    8. parent 为调用 target获取父级 并传入 event 的结果。

    9. parent 非 null 时:

      1. 如果 slottable 非 null:

        1. 断言:parent 是一个 插槽

        2. slottable 设置为 null。

        3. 如果 parent是一个 影子根,且其 模式为 "closed", 则将 slotInClosedTree 设置为 true。

      2. 如果 parent 是一个 可插槽分配对象已分配, 则将 slottable 设置为 parent

      3. relatedTarget 为将 eventrelatedTarget 相对于 parent 进行重定向的结果。

      4. touchTargets 为一个新的 列表

      5. 对于 event触摸目标列表中的每个 touchTarget:将 touchTarget 相对于 parent 进行重定向的结果 追加touchTargets

      6. 如果 parent 是一个 Window 对象,或 parent 是一个 节点targetparent包含影子的 包含祖先

        1. 如果 isActivationEvent 为 true,eventbubbles 属性为 true,activationTarget 为 null,并且 parent 具有 激活 行为,则将 activationTarget 设置为 parent

        2. 使用 eventparent、null、 relatedTargettouchTargetsslotInClosedTree 追加到事件路径

      7. 否则,如果 parentrelatedTarget,则将 parent 设置为 null。

      8. 否则:

        1. target 设置为 parent

        2. 如果 isActivationEvent 为 true,activationTarget 为 null,且 target 具有激活 行为,则将 activationTarget 设置为 target

        3. 使用 eventparenttargetrelatedTargettouchTargetsslotInClosedTree 追加到事件路径

      9. 如果 parent 非 null,则将 parent 设置为调用 parent获取父级并传入 event 的结果。

      10. slotInClosedTree 设置为 false。

    10. clearTargetsItemevent路径中最后一个 事件路径项, 且其影子调整后的目标 非 null。

    11. 如果 clearTargetsItem影子调整后的目标clearTargetsItemrelatedTarget,或 clearTargetsItem触摸 目标列表中的一个 EventTarget 对象是一个 节点, 且其是一个 影子根:将 clearTargets 设置为 true。

    12. 如果 activationTarget 非 null 且 activationTarget 具有 旧式预激活 行为,则运行 activationTarget旧式预激活 行为

    13. 按逆序,对于 event路径中的每个 item

      1. 如果 item影子调整后的目标 非 null,则 将 eventeventPhase 属性设置为 AT_TARGET

      2. 否则,将 eventeventPhase 属性设置为 CAPTURING_PHASE

      3. 使用 itemevent、"capturing",以及 给定时的 legacyOutputDidListenersThrowFlag 进行调用

    14. 对于 event路径中的每个 item

      1. 如果 item影子调整后的目标 非 null,则 将 eventeventPhase 属性设置为 AT_TARGET

      2. 否则:

        1. 如果 eventbubbles 属性为 false,则 continue

        2. eventeventPhase 属性设置为 BUBBLING_PHASE

      3. 使用 itemevent、"bubbling",以及 给定时的 legacyOutputDidListenersThrowFlag 进行调用

  7. eventeventPhase 属性设置为 NONE

  8. eventcurrentTarget 属性设置为 null。

  9. event路径设置为空列表。

  10. 取消设置 eventdispatch flagstop propagation flagstop immediate propagation flag

  11. 如果 clearTargets 为 true:

    1. eventtarget 设置为 null。

    2. eventrelatedTarget 设置为 null。

    3. event触摸目标列表设置为空列表。

  12. 如果 activationTarget 非 null:

    1. 如果 eventcanceled flag 未设置,则运行 activationTarget激活行为并传入 event

    2. 否则,如果 activationTarget 具有 旧式取消激活 行为,则运行 activationTarget旧式取消激活 行为

  13. 如果 eventcanceled flag 已设置,则返回 false;否则返回 true。

追加到 事件路径,给定一个 事件 event、 一个 EventTarget 对象 invocationTarget、一个 潜在 事件目标 shadowAdjustedTarget、一个 潜在事件目标 relatedTarget、一个由 潜在事件目标组成的 列表 touchTargets,以及一个布尔值 slotInClosedTree

  1. invocationTargetInShadowTree 为 false。

  2. 如果 invocationTarget 是一个 节点且其 是一个 影子 根,则将 invocationTargetInShadowTree 设置为 true。

  3. rootOfClosedTree 为 false。

  4. 如果 invocationTarget 是一个 影子根,且其 模式 为 "closed",则将 rootOfClosedTree 设置为 true。

  5. event路径 追加一个新的 事件路径项,其 调用目标invocationTargetinvocation-target-in-shadow-treeinvocationTargetInShadowTree影子调整后的目标shadowAdjustedTargetrelatedTargetrelatedTarget触摸目标列表touchTargetsroot-of-closed-treerootOfClosedTree,并且 slot-in-closed-treeslotInClosedTree

要进行调用,给定一个 事件路径项 pathItem、一个事件 event、一个字符串 phase,以及一个可选的 legacyOutputDidListenersThrowFlag

  1. targetItempathItem

  2. targetItem影子调整后的目标为 null 时:将 targetItem 设置为 event路径中 位于 targetItem 之前的 事件路径项

  3. eventtarget 设置为 targetItem影子调整后的目标

  4. eventrelatedTarget 设置为 pathItemrelatedTarget

  5. event触摸目标列表设置为 pathItem触摸目标列表

  6. 如果 eventstop propagation flag 已设置,则返回。

  7. eventcurrentTarget 属性初始化为 pathItem调用目标

  8. listenerseventcurrentTarget 属性值的事件监听器列表的一个 克隆

    这会避免在此之后添加的 事件监听器被运行。注意,由于 removed 字段, 移除操作仍然会生效。

  9. invocationTargetInShadowTreepathIteminvocation-target-in-shadow-tree

  10. found 为使用 eventlistenersphaseinvocationTargetInShadowTree, 以及给定时的 legacyOutputDidListenersThrowFlag 运行 内部调用的结果。

  11. 如果 found 为 false 且 eventisTrusted 属性为 true:

    1. originalEventTypeeventtype 属性值。

    2. 如果 eventtype 属性值与下表第一列中的任意字符串匹配,则将 eventtype 属性值设置为 与匹配字符串同一行的第二列中的字符串;否则返回。

      事件类型 旧式事件类型
      "animationend" "webkitAnimationEnd"
      "animationiteration" "webkitAnimationIteration"
      "animationstart" "webkitAnimationStart"
      "transitionend" "webkitTransitionEnd"
    3. 使用 eventlistenersphaseinvocationTargetInShadowTree,以及给定时的 legacyOutputDidListenersThrowFlag 进行内部调用

    4. eventtype 属性值设置为 originalEventType

要进行内部调用,给定一个 事件 event、 一个由 事件 监听器组成的 列表 listeners、一个 字符串 phase、一个布尔值 invocationTargetInShadowTree,以及一个可选的 legacyOutputDidListenersThrowFlag

  1. found 为 false。

  2. 对于 listeners 中每个 removed 为 false 的 listener

    1. 如果 eventtype 属性值不是 listenertype,则 continue

    2. found 设置为 true。

    3. 如果 phase 是 "capturing" 且 listenercapture 为 false,则 continue

    4. 如果 phase 是 "bubbling" 且 listenercapture 为 true,则 continue

    5. 如果 listeneronce 为 true,则 移除事件监听器,给定 eventcurrentTarget 属性值 和 listener

    6. globallistener回调关联 Realm全局对象

    7. currentEvent 为 undefined。

    8. 如果 global 是一个 Window 对象:

      1. currentEvent 设置为 global当前 事件

      2. 如果 invocationTargetInShadowTree 为 false,则将 global当前事件设置为 event

    9. 如果 listenerpassive 为 true,则设置 eventin passive listener flag

    10. 如果 global 是一个 Window 对象,则给定 eventlistener 记录事件 监听器的计时信息

    11. 使用 listener回调、"handleEvent"、« event »,以及 eventcurrentTarget 属性值来 调用用户对象的操作。如果这抛出异常 exception

      1. listener回调对应的 JavaScript 对象的 关联 Realm全局对象 报告 exception

      2. 如果给定,则设置 legacyOutputDidListenersThrowFlag

        legacyOutputDidListenersThrowFlag 仅由 Indexed Database API 使用。[INDEXEDDB]

    12. 取消设置 eventin passive listener flag

    13. 如果 global 是一个 Window 对象,则将 global当前事件设置为 currentEvent

    14. 如果 eventstop immediate propagation flag 已设置,则 break

  3. 返回 found

2.10. 触发事件

要在target触发事件,事件名为e,可选地使用eventConstructor,并描述如何初始化IDL属性,以及legacy target override flag,请执行以下步骤:

  1. 如果未给出eventConstructor,则令eventConstructorEvent

  2. event为根据eventConstructor 创建事件的结果,且在target相关领域中。

  3. eventtype属性初始化为e

  4. 按照此算法调用时描述的内容初始化event的其他IDL属性。

    这也允许将isTrusted属性设置为false。

  5. 返回调度eventtarget的结果,并在设置时设置legacy target override flag

在 DOM 的语境中,Fire 是 创建、 初始化以及分派一个事件的简称。 触发事件使 该过程更容易被写下来。

如果该事件需要初始化其 bubblescancelable 属性, 可以写成“在 target触发事件,其名称为 submit, 并将其 cancelable 属性初始化为 true”。

或者,当需要自定义构造函数时,“在 target触发事件,其名称为 click,并使用 MouseEvent, 将其 detail 属性初始化为 1”。

有时返回值很重要:

  1. doAction 为在 target触发事件,其名称为 like 的结果。

  2. 如果 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可以根据需要扩展AbortControllerAbortSignal对象。

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()构造函数步骤如下:

  1. signal成为一个新的AbortSignal对象。

  2. 设置thissignalsignal

signal的getter步骤是返回thissignal

abort(reason)方法步骤是在signal abort上执行,带有reason如果给定。

AbortControllercontroller上带有可选的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
如果signalAbortController已发出中止信号,则返回true;否则返回false。
signal . reason
返回signal中止原因
signal . throwIfAborted()
如果signalAbortController已发出中止信号,则抛出signal中止原因;否则不执行任何操作。

一个AbortSignal对象有一个关联的中止原因(一个JavaScript值),其初始状态为未定义。

一个AbortSignal对象有一个关联的中止算法(一组将在中止时执行的算法),其初始状态为空。

中止算法使得具有复杂要求的API能够合理地响应abort()。例如,给定API的中止原因可能需要传播到跨线程环境,例如service worker。

一个AbortSignal对象有一个依赖项(一个布尔值),其初始状态为false。

一个AbortSignal对象有一个关联的源信号(一组AbortSignal对象),其初始状态为空。

一个AbortSignal对象有一个关联的依赖信号(一组依赖于对象的AbortSignal对象),其初始状态为空。


静态方法abort(reason)的步骤如下:

  1. signal成为一个新的AbortSignal对象。

  2. signal中止原因设置为reason,如果给定;否则设置为新的"AbortError"DOMException

  3. 返回signal

静态方法timeout(milliseconds)的步骤如下:

  1. signal成为一个新的AbortSignal对象。

  2. global成为signal相关全局对象

  3. 在超时后运行步骤,给定global、"AbortSignal-timeout"、milliseconds,以及以下步骤:

    1. 在全局任务队列中排队,在global上,基于signal和新的"TimeoutError"DOMException执行signal abort

    在此超时时间内,如果signal已为其abort事件注册了任何事件监听器,则必须从globalsignal保持一个强引用。

  4. 返回signal

静态方法any(signals)的步骤是返回创建一个依赖的中止信号的结果,使用signalsAbortSignal当前领域

abortedgetter步骤是返回true如果this中止;否则返回false。

reasongetter步骤是返回this中止原因

throwIfAborted()方法步骤是抛出this中止原因,如果this中止

此方法主要用于当接受AbortSignal的函数希望在特定检查点抛出(或返回一个被拒绝的promise),而不是将AbortSignal传递给其他方法时。例如,以下函数允许在每次尝试轮询条件之间中止。这为中止轮询过程提供了机会,即使实际的异步操作(即await func())不接受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

  1. 如果 signal中止,则返回。

  2. algorithm 追加到 signal中止算法中。

要从 AbortSignal signal移除一个算法 algorithm,请从 signal中止算法移除 algorithm

发出中止信号, 给定一个 AbortSignal 对象 signal 和一个可选的 reason

  1. 如果 signal 已经 中止,则返回。

  2. signal中止原因 设为 reason(如果提供);否则设为一个新的 "AbortError" DOMException

  3. dependentSignalsToAbort 设为一个新的 列表

  4. 对于每个 dependentSignalsignal依赖信号 中:

    1. 如果 dependentSignal 尚未 中止

      1. dependentSignal中止原因 设为 signal中止原因

      2. 附加 dependentSignaldependentSignalsToAbort

  5. 运行中止步骤 对于 signal

  6. 对于每个 dependentSignaldependentSignalsToAbort 中,运行中止步骤 对于 dependentSignal

运行中止步骤 对于一个 AbortSignal signal

  1. 对于每个 algorithmsignal中止算法 中:运行 algorithm

  2. 清空 signal中止算法

  3. 触发事件,名为 abort,在 signal 上。

要从 AbortSignal 对象列表 signals 创建一个依赖中止信号,使用 signalInterface(它必须是 AbortSignal 或继承自它的接口)和一个 realm

  1. resultSignal 为一个使用 realm 实现 signalInterface对象。

  2. 对于 signals 中的每个 signal:如果 signal中止,则将 resultSignal中止原因设置为 signal中止原因并返回 resultSignal

  3. resultSignal依赖属性设置为 true。

  4. 对于 signals 中的每个 signal

    1. 如果 signal依赖属性为 false:

      1. signal 追加resultSignal源信号列表中。

      2. resultSignal 追加signal依赖信号列表中。

    2. 否则,对于 signal源信号列表中的每个 sourceSignal

      1. 断言:sourceSignal中止 且其依赖属性不为 true。

      2. sourceSignal 追加resultSignal源信号列表中。

      3. resultSignal 追加sourceSignal依赖信号列表中。

  5. 返回 resultSignal

3.2.1. 垃圾回收

一个未中止依赖的 AbortSignal 对象,当其源信号列表非空并且它已为其 abort 事件注册了事件监听器或者其中止算法列表非空时,不能被垃圾回收。

3.3. 在 API 中使用 AbortControllerAbortSignal 对象

任何使用 promises 表示可以中止操作的 Web 平台 API 必须遵循以下规则:

返回 promise 的方法 doAmazingness(options) 的方法步骤可能如下:

  1. global成为相关全局对象

  2. p成为一个新的 promise

  3. 如果 options["signal"] 存在

    1. signal成为options["signal"]。

    2. 如果 signal已中止, 则拒绝p,使用signal中止原因,并返回 p

    3. 添加以下中止步骤signal

      1. 停止做令人惊叹的事情。

      2. 拒绝p,使用signal中止原因

  4. 并行运行这些步骤:

    1. amazingResult成为做一些令人惊叹的事情的结果。

    2. 在全局任务队列中添加一个任务,任务源为global,以解决p,并将amazingResult作为参数。

  5. 返回 p

不使用 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 的对象还会实现 一个继承接口:DocumentDocumentTypeDocumentFragmentElementCharacterDataAttr

实现 DocumentFragment 的对象有时会实现 ShadowRoot

实现 Element 的对象 通常还会实现一个继承接口,例如 HTMLAnchorElement

实现 CharacterData 的对象还会实现一个继承接口:TextProcessingInstructionComment

实现 Text 的对象有时会实现 CDATASection

因此,每个 节点主接口是以下之一:DocumentDocumentTypeDocumentFragmentShadowRootElementElement 的继承接口、 AttrTextCDATASectionProcessingInstructionComment

为简洁起见,本规范将实现 Node 和一个 继承接口 NodeInterface 的对象,称为 NodeInterface 节点

节点树受到如下约束, 表示为一个 节点与其潜在子节点之间的关系:

Document

树序

  1. 零个或多个 ProcessingInstructionComment 节点

  2. 可选的一个 DocumentType 节点

  3. 零个或多个 ProcessingInstructionComment 节点

  4. 可选的一个 Element 节点

  5. 零个或多个 ProcessingInstructionComment 节点

DocumentFragment
Element

零个或多个 ElementCharacterData 节点

DocumentType
CharacterData
Attr

没有子节点

Attr 节点出于历史原因参与一棵;它们永远没有(非 null 的)父节点或任何子节点,因此在一棵中独自存在。

要确定一个节点 node长度,运行以下步骤:

  1. 如果 node 是一个 DocumentTypeAttr 节点,则返回 0。

  2. 如果 node 是一个 CharacterData 节点,则返回 node数据长度

  3. 返回 node子节点的数量。

如果一个节点长度为 0,则该节点被认为是空的

4.2.1. 文档树

文档树是 一棵节点树,其 是一个文档

一个文档文档元素是 其父节点为 该文档元素,如果它 存在的话;否则为 null。

根据节点树约束,只能有一个这样的 元素

如果一个节点是一个 文档,则该节点在文档树中

如果一个节点在文档树中,则它在文档中术语在 文档中不应再被使用。它表明 使用该术语的标准尚未更新,以考虑影子树

4.2.2. 影子树

影子树是一个节点树,其是一个影子根

影子根总是通过其宿主附加到另一个节点树。因此,影子树永远不会是孤立的。影子根宿主节点树有时被称为光树

一个影子树的相应光树本身可以是一个影子树

当一个节点包含影子的根是一个文档时,该节点被认为是已连接的

4.2.2.1. 插槽

一个影子树包含零个或多个元素,它们是插槽

一个插槽只能通过HTML的slot元素创建。

一个插槽有一个关联的名称(一个字符串)。除非另有说明,否则它是空字符串。

使用这些属性更改步骤来更新一个插槽名称

  1. 如果element是一个插槽localNamename,且namespace为空:

    1. 如果valueoldValue,则返回。

    2. 如果value为null且oldValue为空字符串,则返回。

    3. 如果value为空字符串且oldValue为null,则返回。

    4. 如果value为null或空字符串,则将element名称设置为空字符串。

    5. 否则,将element名称设置为value

    6. 使用element运行为树分配可插槽对象

一个插槽是一个影子树中的第一个,在树顺序中,其名称为空字符串的插槽,有时被称为“默认插槽”。

一个插槽有一个关联的分配的节点(一个可插槽对象的列表)。除非另有说明,否则它是空的。

4.2.2.2. 可插槽对象

元素文本节点可插槽对象

插槽 可以是一个可插槽对象

一个可插槽对象有一个关联的名称(一个字符串)。除非另有说明,否则它是空字符串。

使用这些属性更改步骤来更新可插槽对象名称

  1. 如果localNameslotnamespace为空:

    1. 如果valueoldValue,则返回。

    2. 如果value为null且oldValue为空字符串,则返回。

    3. 如果value为空字符串且oldValue为null,则返回。

    4. 如果value为null或空字符串,则将element名称设置为空字符串。

    5. 否则,将element名称设置为value

    6. 如果element已分配,则为element已分配插槽运行分配可插槽对象

    7. element运行分配插槽

字母A 可插槽元素有一个关联的已分配插槽(null或插槽)。 除非另有说明,否则它为null。字母A 可插槽元素已分配的,如果它的已分配插槽非null。

一个可插槽对象有一个关联的手动插槽分配(null或插槽)。除非另有说明,否则它是null。

一个可插槽对象手动插槽分配可以使用对插槽的弱引用来实现,因为这个变量不能直接从脚本访问。

4.2.2.3. 查找插槽和可插槽对象

查找插槽,对于给定的可插入对象 slottable 和一个可选的布尔值 open(默认为 false):

  1. 如果 slottable父节点为 null,则返回 null。

  2. shadowslottable父节点影子根

  3. 如果 shadow 为 null,则返回 null。

  4. 如果 open 为 true 且 shadow模式不为“open”,则返回 null。

  5. 如果 shadow插槽分配为“manual”,则返回 shadow后代中其手动分配的节点包含 slottable插槽(如果存在);否则返回 null。

  6. 返回 shadow后代中按树顺序排列的第一个其名称slottable名称插槽(如果存在);否则返回 null。

查找可插入对象,对于给定的插槽 slot

  1. result 为 « »。

  2. rootslot

  3. 如果 root 不是影子根,则返回 result

  4. hostroot宿主

  5. 如果 root插槽分配为“manual”:

    1. 对于 slot手动分配的节点中的每个可插入对象 slottable,如果 slottable父节点host,则将 slottable 追加result

  6. 否则,对于 host 的每个可插入对象子节点 slottable,按树顺序

    1. foundSlot 为给定 slottable 查找插槽的结果。

    2. 如果 foundSlotslot,则将 slottable 追加result

  7. 返回 result

查找扁平化可插入对象,对于给定的插槽 slot

  1. result 为 « »。

  2. 如果 slot不是影子根,则返回 result

  3. slottables 为给定 slot 查找可插入对象的结果。

  4. 如果 slottables 是空列表,则将 slot 的每个可插入对象子节点树顺序追加到 slottables

  5. 对于 slottables 中的每个 node

    1. 如果 node 是一个插槽,其是一个影子根

      1. temporaryResult 为给定 node 查找扁平化可插入对象的结果。

      2. temporaryResult 中的每个可插入对象按顺序追加到 result

    2. 否则,将 node 追加到 result

  6. 返回 result

4.2.2.4. 分配可插槽对象和插槽

要为插槽 slot 分配可插入对象

  1. slottables 为为 slot 查找可插入对象的结果。

  2. 如果 slottablesslot已分配节点不相同,则为 slot 运行发出插槽更改信号

  3. slot已分配节点设置为 slottables

  4. 对于 slottables 中的每个 slottable: 将 slottable已分配插槽设置为 slot

为树分配可插入对象,给定一个节点 root,按树顺序root包含后代中的每个插槽运行分配可插入对象

分配插槽,给定一个可插入对象 slottable

  1. slot 为使用 slottable 查找插槽的结果。

  2. 如果 slot 非空,则为 slot 运行分配可插入对象

4.2.2.5. 发出插槽变更信号

每个相同来源窗口代理都有一个信号插槽集合中的一部分插槽),其初始值为空。[HTML]

要为一个插槽 slot 发出插槽更改信号

  1. slot 追加slot相关代理信号插槽列表

  2. 将突变观察者微任务排入队列

4.2.3. 变异算法

给定一个 节点 node、一个 节点 parent、 null 或一个 节点 child,以及一个由 节点组成的 列表 childrenToExclude,要确保预插入有效性

  1. 如果 parent 不是 DocumentDocumentFragmentElement 节点,则抛出一个“HierarchyRequestErrorDOMException

  2. 如果 nodeparent包含宿主的含自身祖先,则 抛出一个“HierarchyRequestErrorDOMException

  3. 如果 child 非 null,且其父节点不是 parent, 则抛出一个“NotFoundErrorDOMException

  4. 如果 node 不是 DocumentFragmentDocumentTypeElementCharacterData 节点,则抛出一个 “HierarchyRequestErrorDOMException

  5. 如果 parent 不是文档

    1. 如果 node文档类型,则抛出 一个 “HierarchyRequestErrorDOMException

    2. 返回。

  6. 如果 node 是一个 Text 节点,则抛出一个 “HierarchyRequestErrorDOMException

  7. 如果 node 是一个 CharacterData 节点,则返回。

  8. 如果 node 是一个 DocumentFragment 节点

    1. 如果 node 有多个元素子节点,或者有一个 Text 节点子节点,则抛出 一个 “HierarchyRequestErrorDOMException

    2. 如果 node 没有元素子节点,则返回。

  9. 如果 node 是一个 DocumentFragmentElement 节点

    1. 如果以下任一条件为真:

      抛出一个“HierarchyRequestErrorDOMException

    2. 返回。

  10. 断言node 是一个文档类型

  11. 如果以下任一条件为真:

    抛出一个“HierarchyRequestErrorDOMException

要将一个节点 node 预插入一个节点 parent 中,并使其位于 null 或节点 child 之前:

  1. 给定 nodeparentchild 和 « »,确保预插入有效性

  2. referenceChildchild

  3. 如果 referenceChildnode,则将 referenceChild 设置为 node下一个同级节点

  4. node 插入 parent 中,并使其位于 referenceChild 之前。

  5. 返回 node

规范可以为全部或部分节点定义 插入步骤。 如下方插入算法所示,该算法会接收 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);

上述示例中的脚本会输出 'rgb(255, 0, 0)',因为以下操作按顺序发生:

  1. 插入算法运行,并按顺序插入 script style 元素。

    1. HTML 标准的插入步骤针对 script 元素运行;这些步骤不执行任何操作。[HTML]

    2. HTML 标准的插入步骤针对 style 元素运行;这些步骤立即将其样式规则应用于文档。[HTML]

    3. HTML 标准的连接后步骤针对 script 元素运行;这些步骤运行脚本,而该脚本会立即观察到上一步应用的样式规则。 [HTML]

规范也可以为全部或部分 节点定义 连接后步骤。如下方 插入 算法所示,该算法会接收 connectedNode

连接后步骤的目的是为 节点提供一个机会, 使其能够执行任何与连接有关的操作,包括修改 connectedNode参与节点树、 创建浏览上下文, 或以其他方式执行 JavaScript。这些步骤允许相对于脚本原子地插入一批节点, 所有主要副作用都在整批节点插入节点树完成之后发生。这可确保所有待处理的节点树 插入都完全结束后,才会发生更多插入。

规范可以为全部或部分 节点定义 子节点变更步骤。该算法不接收参数,并由 插入移除替换数据 调用。

要将一个节点 node 插入一个 节点 parent 中,并使其位于 null 或一个节点 child 之前,可带有一个可选布尔值 suppressObservers(默认为 false):

  1. 如果 node 是一个 DocumentFragment 节点,则令 nodesnode子节点;否则为 « node »。

  2. countnodes大小

  3. 如果 count 为 0,则返回。

  4. 如果 node 是一个 DocumentFragment 节点

    1. suppressObservers 设置为 true 的情况下,移除子节点

    2. node 使用 « »、nodes、null 和 null 排入一个树突变记录

      此步骤有意不考虑 suppressObservers

  5. 如果 child 非 null:

    1. 对于每个实时范围,如果其起始节点parent,且 起始偏移量大于 child索引:将其 起始偏移量增加 count

    2. 对于每个实时范围,如果其结束节点parent,且 结束偏移量大于 child索引:将其 结束偏移量增加 count

  6. 如果 child 非 null,则令 previousSiblingchild上一个同级 节点;否则令其为 parent最后一个子节点

  7. 对于 nodes 中按树顺序排列的每个 node

    1. node 收养parent节点文档中。

    2. 如果 child 为 null,则将 node 追加parent子节点中。

    3. 否则,将 node 插入 parent子节点中,并使其位于 child索引之前。

    4. 如果 parent 是一个影子宿主,其影子根槽位分配为“named”, 且 node 是一个 可分配槽位对象,则为 node 分配槽位

    5. 如果 parent是一个影子根,且 parent 是一个槽位,其已分配节点为空列表, 则为 parent 运行发出槽位变更信号

    6. 使用 node运行为树分配可分配槽位对象

    7. 对于 node 的每个包含影子的含自身后代 inclusiveDescendant,按包含影子的树顺序

      1. 使用 inclusiveDescendant 运行插入步骤

      2. 如果 inclusiveDescendant连接,则 继续

      3. 如果 inclusiveDescendant 是一个元素,且 inclusiveDescendant自定义元素注册表非 null:

        1. 如果 inclusiveDescendant自定义元素注册表是否限定作用域为 true,则将 inclusiveDescendant节点文档追加inclusiveDescendant自定义元素注册表限定作用域文档集中。

        2. 如果 inclusiveDescendant自定义的,则使用 inclusiveDescendant、回调名称 “connectedCallback”和 « » 排入一个自定义元素回调反应

        3. 否则,尝试升级 inclusiveDescendant

          如果这成功升级了 inclusiveDescendant,则在升级元素 算法期间,会自动排入其 connectedCallback

      4. 否则,如果 inclusiveDescendant 是一个影子根inclusiveDescendant自定义元素注册表 非 null,且 inclusiveDescendant自定义元素注册表是否限定作用域为 true,则将 inclusiveDescendant节点文档 追加inclusiveDescendant自定义元素注册表限定作用域文档集中。

  8. 如果 suppressObservers 为 false,则为 parent 使用 nodes、« »、previousSiblingchild 排入一个树突变记录

  9. parent 运行子节点变更步骤

  10. staticNodeList 为一个节点列表,初始为 « »。

    我们会在对任何节点调用连接后步骤之前,收集所有 节点,而不是在遍历节点树同时调用 连接后步骤。这是因为 连接后步骤可以修改树的结构, 从而使实时遍历变得不安全,并可能导致对同一个 节点多次调用 连接后步骤

  11. 对于 nodes 中按树顺序排列的每个 node

    1. 对于 node 的每个包含影子的含自身后代 inclusiveDescendant,按包含影子的树顺序: 将 inclusiveDescendant 追加staticNodeList

  12. 对于 staticNodeList 中的每个 node:如果 node连接,则使用 node 运行连接后步骤

要将一个节点 node 追加到一个节点 parent:将 node 预插入 parent 中,并使其位于 null 之前。


规范可以为全部或部分节点定义 移动步骤。 如下方移动算法所示,该算法会接收一个 节点 movedNode、一个布尔值 isSubtreeRoot,以及一个节点 oldAncestor。 与插入步骤类似,这些步骤不得修改 movedNode参与节点树、创建浏览上下文触发事件, 或以其他方式执行 JavaScript。不过,这些步骤可以排入任务,以异步执行这些操作。

要将一个节点 node 移动到一个节点 newParent 中,并使其位于 null 或一个节点 child 之前:

  1. 如果 newParent包含影子的根node包含影子的根不同,则抛出一个 “HierarchyRequestErrorDOMException

    这会产生一个副作用,即只有当 newParent连接状态node连接状态相同时,才会执行移动。

  2. 如果 nodenewParent包含宿主的含自身祖先, 则抛出一个“HierarchyRequestErrorDOMException

  3. 如果 child 非 null,且其父节点不是 newParent, 则抛出一个“NotFoundErrorDOMException

  4. 如果 node 不是 ElementCharacterData 节点,则 抛出一个“HierarchyRequestErrorDOMException

  5. 如果 node 是一个 Text 节点,且 newParent 是一个 文档, 则抛出一个“HierarchyRequestErrorDOMException

  6. 如果 newParent 是一个文档node 是一个 Element 节点,并且 newParent 已有一个元素 子节点child 是一个文档类型,或者 child 非 null 且在 child 之后存在一个文档类型,则抛出一个 “HierarchyRequestErrorDOMException

  7. oldParentnode父节点

  8. 断言oldParent 非 null。

  9. 给定 node,运行实时范围预移除步骤

  10. 对于每个 NodeIterator 对象 iterator,如果其 节点文档node节点文档:给定 nodeiterator,运行NodeIterator 预移除步骤

  11. oldPreviousSiblingnode上一个同级节点

  12. oldNextSiblingnode下一个同级节点

  13. oldParent子节点移除 node

  14. 如果 node分配,则为 node已分配槽位运行分配可分配槽位对象

  15. 如果 oldParent是一个影子根,且 oldParent 是一个槽位,其已分配节点 为空,则为 oldParent 运行发出槽位变更信号

  16. 如果 node 有一个作为槽位含自身后代

    1. 使用 oldParent运行为树分配可分配槽位对象

    2. 使用 node 运行为树分配可分配槽位对象

  17. 如果 child 非 null:

    1. 对于每个实时范围,如果其起始节点newParent,且 起始偏移量大于 child索引:将其 起始偏移量增加 1。

    2. 对于每个实时范围,如果其结束节点newParent,且 结束偏移量大于 child索引:将其 结束偏移量增加 1。

  18. 如果 child 非 null,则令 newPreviousSiblingchild上一个同级节点;否则令其为 newParent最后一个子节点

  19. 如果 child 为 null,则将 node 追加newParent子节点中。

  20. 否则,将 node 插入 newParent子节点中,并使其位于 child索引之前。

  21. 如果 newParent 是一个影子宿主,其影子根槽位分配为“named”,且 node 是一个 可分配槽位对象, 则为 node 分配槽位

  22. 如果 newParent是一个影子根,且 newParent 是一个槽位,其已分配节点 为空,则为 newParent 运行发出槽位变更信号

  23. 使用 node运行为树分配可分配槽位对象

  24. 对于 node 的每个包含影子的含自身后代 inclusiveDescendant,按包含影子的树顺序

    1. 如果 inclusiveDescendantnode,则令 isSubtreeRoot 为 true;否则为 false。

    2. 使用 inclusiveDescendantisSubtreeRootoldParent 运行移动步骤

      由于移动算法是一个独立于 插入移除的原语, 因此它不会为 inclusiveDescendant 调用插入步骤移除步骤

    3. 如果 inclusiveDescendant自定义的,且 newParent连接,则使用 inclusiveDescendant、回调名称 “connectedMoveCallback”和 « » 排入一个自定义元素回调反应

  25. oldParent 使用 « »、« node »、 oldPreviousSiblingoldNextSibling 排入一个树突变记录

  26. newParent 使用 « node »、« »、 newPreviousSiblingchild 排入一个树突变记录


要在一个节点 parent 中,使用一个节点 node 替换一个节点 child

  1. 给定 nodeparentchild 和 « child »,确保预插入有效性

  2. referenceChildchild下一个同级节点

  3. 如果 referenceChildnode,则将 referenceChild 设置为 node下一个同级节点

  4. previousSiblingchild上一个同级节点

  5. removedNodes 为空集。

  6. node 收养parent节点文档中。

  7. 如果 child父节点非 null:

    1. removedNodes 设置为 « child »。

    2. suppressObservers 设置 为 true 的情况下,移除 child

    只有当 childnode 时,上述条件才可能为 false。

  8. 如果 node 是一个 DocumentFragment 节点,则令 nodesnode子节点;否则为 « node »。

  9. suppressObservers 设置为 true 的情况下,将 node 插入 parent 中,并使其位于 referenceChild 之前。

  10. parent 使用 nodesremovedNodespreviousSiblingreferenceChild 排入一个树突变记录

  11. 返回 child

要在一个节点 parent 中,使用一个节点或 null node 替换全部

  1. removedNodesparent子节点

  2. addedNodes 为空集。

  3. 如果 node 是一个 DocumentFragment 节点,则将 addedNodes 设置为 node子节点

  4. 否则,如果 node 非 null,则将 addedNodes 设置为 « node »。

  5. 树顺序移除 parent 的所有子节点,并将 suppressObservers 设置为 true。

  6. 如果 node 非 null,则在 suppressObservers 设置为 true 的情况下,将 node 插入 parent 中,并使其位于 null 之前。

  7. 如果 addedNodesremovedNodes 中任一个非空, 则为 parent 使用 addedNodesremovedNodes、null 和 null 排入一个树突变记录

此算法不会对 节点树约束进行任何检查。规范作者需要谨慎使用它。


要从一个节点 parent预移除一个节点 child

  1. 如果 child父节点不是 parent,则抛出一个 “NotFoundErrorDOMException

  2. 移除 child

  3. 返回 child

规范可以为全部或部分节点定义 移除步骤。如下方移除算法所示, 该算法会接收一个节点 removedNode、一个布尔值 isSubtreeRoot,以及一个节点 oldAncestor

移除一个节点 node,可带有一个可选布尔值 suppressObservers(默认为 false):

  1. parentnode父节点

  2. 断言:parent 非 null。

  3. 给定 node,运行实时范围预移除步骤

  4. 对于每个 NodeIterator 对象 iterator,如果其 节点文档node节点文档:给定 nodeiterator,运行NodeIterator 预移除步骤

  5. oldPreviousSiblingnode上一个同级节点

  6. oldNextSiblingnode下一个同级节点

  7. 从其 parent子节点移除 node

  8. 如果 node分配,则为 node已分配槽位运行分配可分配槽位对象

  9. 如果 parent是一个影子根,且 parent 是一个槽位,其已分配节点为空列表, 则为 parent 运行发出槽位变更信号

  10. 如果 node 有一个作为槽位含自身后代

    1. 使用 parent运行为树分配可分配槽位对象

    2. 使用 node 运行为树分配可分配槽位对象

  11. 使用 node、true 和 parent 运行移除步骤

  12. isParentConnectedparent连接状态

  13. 如果 node自定义的,且 isParentConnected 为 true,则使用 node、回调名称 “disconnectedCallback”和 « » 排入一个自定义元素回调反应

    目前有意不向自定义元素传递 parent。如果将来有需要,这一点可能会改变。

  14. 对于 node 的每个包含影子的后代 descendant,按 包含影子的树顺序

    1. 使用 descendant、false 和 parent 运行移除步骤

    2. 如果 descendant自定义的,且 isParentConnected 为 true,则使用 descendant、 回调名称“disconnectedCallback”和 « » 排入一个自定义元素回调反应

  15. 对于 parent 的每个含自身祖先 inclusiveAncestor,然后对于 inclusiveAncestor已注册观察器列表中的每个 registered,如果 registered选项["subtree"] 为 true,则向 node已注册观察器列表追加一个新的临时已注册观察器,其 观察器registered观察器选项registered选项,且 来源registered

  16. 如果 suppressObservers 为 false,则为 parent 使用 « »、« node »、oldPreviousSiblingoldNextSibling 排入一个树突变记录

  17. parent 运行子节点变更步骤

4.2.4. 混入 NonElementParentNode

Web 兼容性阻止 getElementById() 方法暴露在元素上(因此也不能暴露在 ParentNode 上)。

interface mixin NonElementParentNode {
  Element? getElementById(DOMString elementId);
};
Document includes NonElementParentNode;
DocumentFragment includes NonElementParentNode;
node . getElementById(elementId)

返回 node后代中 第一个其 IDelementId元素

要在给定一个节点 node 和一个 字符串 elementId 的情况下按 ID 获取元素,返回 node后代中,按树序排列的 第一个其 IDelementId元素; 否则,如果没有这样的元素,则返回 null。

getElementById(elementId) 方法步骤是返回在给定 thiselementId 的情况下按 ID 获取元素的结果。

4.2.5. Mixin DocumentOrShadowRoot

interface mixin DocumentOrShadowRoot {
  readonly attribute CustomElementRegistry? customElementRegistry;
};
Document includes DocumentOrShadowRoot;
ShadowRoot includes DocumentOrShadowRoot;
registry = documentOrShadowRoot . customElementRegistry

返回 documentOrShadowRootCustomElementRegistry 对象(如果有); 否则返回 null。

customElementRegistry getter 步骤 为:

  1. 如果 this 是一个文档,则返回 this自定义元素注册表

  2. 断言this 是一个 ShadowRoot 节点

  3. 返回 this自定义元素注册表

DocumentOrShadowRoot mixin 也预期会被其他 想要定义在文档影子根之间共享的 API 的标准使用。

4.2.6. Mixin ParentNode

要将节点转换为一个节点,给定一个由列表节点和 字符串组成的 nodes,以及文档 document

  1. nodes 中的每个字符串替换为在给定 document 和该字符串的情况下,创建文本节点的结果。

  2. 如果 nodes大小为 1,则返回 nodes[0]。

  3. fragment 为在给定 document 的情况下,创建文档片段的结果。

  4. 对于 nodes 中的每个 node:将 node 附加fragment

  5. 返回 fragment

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 节点

如果违反了节点树的约束,则抛出一个“HierarchyRequestErrorDOMException

node . append(nodes)

nodes 插入到 node最后一个子节点之后,同时将 nodes 中的字符串替换为等效的 Text 节点

如果违反了节点树的约束,则抛出一个“HierarchyRequestErrorDOMException

node . replaceChildren(nodes)

nodes 替换 node 的所有子节点,同时将 nodes 中的字符串替换为等效的 Text 节点

如果违反了节点树的约束,则抛出一个“HierarchyRequestErrorDOMException

node . moveBefore(movedNode, child)

在不先移除 movedNode 的情况下,将其移动到 node 中;如果 child 非 null,则移动到 child 之后;否则移动到 node最后一个子节点之后。此 方法会保留与 movedNode 关联的状态。

如果违反了节点树的约束,或者无法保留与被移动节点关联的状态,则抛出一个“HierarchyRequestErrorDOMException

node . querySelector(selectors)

返回作为 node后代且与 selectors 匹配的第一个元素

node . querySelectorAll(selectors)

返回 node 的所有与 selectors 匹配的元素后代

children 获取器步骤是返回一个以 this 为根、仅匹配作为元素子节点HTMLCollection 集合

firstElementChild 获取器步骤是 返回 第一个属于元素子节点; 否则返回 null。

lastElementChild 获取器步骤是返回 最后一个属于元素子节点; 否则返回 null。

childElementCount 获取器步骤是 返回 this子节点中属于元素的数量。

prepend(nodes) 方法步骤如下:

  1. node 为在给定 nodesthis节点文档的情况下,将节点转换为一个节点的结果。

  2. node 预插入this 中,位于 this第一个子节点之前。

append(nodes) 方法步骤如下:

  1. node 为在给定 nodesthis节点文档的情况下,将节点转换为一个节点的结果。

  2. node 附加this

replaceChildren(nodes) 方法 步骤 如下:

  1. node 为在给定 nodesthis节点文档的情况下,将节点转换为一个节点的结果。

  2. 在给定 nodethis、null 和 this子节点的情况下,确保预插入有效性

  3. this 中用 node 全部替换

moveBefore(node, child) 方法步骤如下:

  1. referenceChildchild

  2. 如果 referenceChildnode,则将 referenceChild 设置为 node下一个同胞

  3. node 移动this 中,位于 referenceChild 之前。

querySelector(selectors) 方法 步骤是在对 this 运行对选择器字符串进行作用域匹配 selectors 的结果不是空列表时,返回第一个结果;否则返回 null。

querySelectorAll(selectors) 方法 步骤是返回对 this 运行 对选择器字符串进行作用域匹配 selectors静态结果。

4.2.7. 混入 NonDocumentTypeChildNode

Web 兼容性阻止 previousElementSiblingnextElementSibling 属性暴露在 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。

previousElementSibling getter 步骤是返回第一个先于它的、且为 元素兄弟节点;否则返回 null。

nextElementSibling getter 步骤是返回第一个跟随于它的、且为 元素兄弟节点;否则返回 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 节点

如果违反了 节点树 的约束,则抛出一个“HierarchyRequestErrorDOMException

node . after(...nodes)

nodes 紧接着插入到 node 之后,同时将 nodes 中的字符串替换为等效的 Text 节点

如果违反了 节点树 的约束,则抛出一个“HierarchyRequestErrorDOMException

node . replaceWith(...nodes)

nodes 替换 node,同时将 nodes 中的字符串替换为等效的 Text 节点

如果违反了 节点树 的约束,则抛出一个“HierarchyRequestErrorDOMException

node . remove()
移除 node

before(nodes) 方法步骤如下:

  1. parentthis父节点

  2. 如果 parent 为 null,则返回。

  3. viablePreviousSiblingthis 的第一个不在 nodes 中的前置 同胞;如果不存在,则为 null。

  4. node 为在给定 nodesthis节点文档的情况下,将节点转换为一个节点的结果。

  5. 如果 viablePreviousSibling 为 null,则将其设置为 parent第一个子节点;否则将其设置为 viablePreviousSibling下一个同胞

  6. node 预插入parent 中,位于 viablePreviousSibling 之前。

after(nodes) 方法步骤如下:

  1. parentthis父节点

  2. 如果 parent 为 null,则返回。

  3. viableNextSiblingthis 的第一个不在 nodes 中的后置 同胞;如果不存在,则为 null。

  4. node 为在给定 nodesthis节点文档的情况下,将节点转换为一个节点的结果。

  5. node 预插入parent 中,位于 viableNextSibling 之前。

replaceWith(nodes) 方法步骤如下:

  1. parentthis父节点

  2. 如果 parent 为 null,则返回。

  3. viableNextSiblingthis 的第一个不在 nodes 中的后置 同胞;如果不存在,则为 null。

  4. node 为在给定 nodesthis节点文档的情况下,将节点转换为一个节点的结果。

  5. 如果 this父节点parent,则在 parent 中用 node 替换 this

    This 可能已被插入到 node 中。

  6. 否则,将 node 预插入parent 中,位于 viableNextSibling 之前。

remove() 方法步骤如下:

  1. 如果 this父节点为 null,则返回。

  2. 移除 this

4.2.9. 混入 Slottable

interface mixin Slottable {
  readonly attribute HTMLSlotElement? assignedSlot;
};
Element includes Slottable;
Text includes Slottable;

assignedSlot 的 getter 步骤为:返回以 寻找插槽,传入 this 和 true 的结果。

4.2.10. 旧式集合:NodeListHTMLCollection

集合(collection) 是一个表示 节点列表的对象。 集合可以是 实时(live)静态(static)。 除非另有说明,集合必须是实时的。

如果集合实时的, 那么该对象上的属性和方法必须针对实际底层数据操作,而不是数据快照。

集合创建时,会与其关联一个筛选器和一个根节点。

然后集合 代表 一个以集合根节点为根的子树视图,仅包含与指定筛选器匹配的节点。该视图是线性的。如果没有特殊要求,集合内的节点必须按树顺序排列。

4.2.10.1. 接口 NodeList

一个 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。

支持的属性名称是这些步骤返回的列表中的值:

  1. result 为空列表。

  2. 对于由集合表示的每个 element,按 树序

    1. 如果 element 有一个不在 result 中的 ID, 则将 elementID 追加到 result

    2. 如果 element 位于 HTML 命名空间中,且具有 一个name 属性,该属性的既不是 空字符串,也不在 result 中,则将 elementname 属性追加到 result

  3. 返回 result

namedItem(key) 方法步骤为:

  1. 如果 key 是空字符串,则返回 null。

  2. 返回集合中第一个满足以下至少一项的元素

    如果没有这样的元素,则返回 null。

4.3. Mutation observers

每个相同来源窗口代理都有一个突变观察者微任务排队(布尔值),其初始值为false。[HTML]

每个相同来源窗口代理还具有待处理的突变观察者(一个包含零个或多个MutationObserver对象的集合),其初始状态为空。

排队一个突变观察者微任务

  1. 如果外围代理突变观察者微任务已排队为 true,则返回。

  2. 外围代理突变观察者微任务已排队设为 true。

  3. 排队一个微任务用于通知突变观察者

通知突变观察者

  1. 外围代理突变观察者微任务已排队设为 false。

  2. notifySet克隆 外围代理待处理突变观察者

  3. 清空 外围代理待处理突变观察者

  4. signalSet克隆 外围代理信号槽

  5. 清空 外围代理信号槽

  6. 对于 notifySet 中的每个 mo

    1. records克隆 mo记录队列

    2. 清空 mo记录队列

    3. 对于 mo节点列表中的每个 node移除 所有瞬态注册观察者,其 观察者mo,从 node注册观察者列表中。

    4. 如果 records 非空,则 调用 mo回调,参数为 « recordsmo » 和 "report",并以 回调 this 值 mo 调用。

  7. 对于 signalSet 中的每个 slot触发 一个名为 slotchange 的事件,且其 bubbles 属性设为 true,目标为 slot


每个节点都有一个已注册观察者 列表(一个包含零个或多个列表已注册 观察者),其初始为空。

一个已注册 观察者由一个 观察者(一个 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 对象都有以下关联概念:

observer = new MutationObserver(callback)
构造一个 MutationObserver 对象,并将其回调设置为 callback。调用 callback 时,以一个 MutationRecord 对象列表 作为第一个参数,并以构造的 MutationObserver 对象作为第二个参数。通过 observe() 方法注册的节点 发生突变后,将调用该回调。
observer . observe(target, options)
指示用户代理观察给定的 target (一个节点),并根据 options(一个对象)给出的条件报告任何突变。

options 参数允许通过对象成员设置突变 观察选项。可以使用以下对象成员:

childList
如果要观察 target子节点的突变, 则设置为 true。
attributes
如果要观察 target属性 的突变,则设置为 true。如果指定了 attributeOldValueattributeFilter, 则可以省略。
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()
清空记录 队列并返回其中原有的内容。

new MutationObserver(callback) 构造器步骤是:将 this回调设置为 callback

observe(target, options) 方法步骤如下:

  1. 如果 options["attributeOldValue"] 或 options["attributeFilter"] 中任一个存在,且 options["attributes"] 不存在,则将 options["attributes"] 设置为 true。

  2. 如果 options["characterDataOldValue"] 存在,且 options["characterData"] 不存在,则将 options["characterData"] 设置为 true。

  3. 如果 options["childList"]、 options["attributes"] 和 options["characterData"] 均不为 true,则抛出一个 TypeError

  4. 如果 options["attributeOldValue"] 为 true,且 options["attributes"] 为 false,则抛出一个 TypeError

  5. 如果 options["attributeFilter"] 存在,且 options["attributes"] 为 false,则抛出一个 TypeError

  6. 如果 options["characterDataOldValue"] 为 true,且 options["characterData"] 为 false,则抛出一个 TypeError

  7. 对于 target已注册观察器列表中的每个 registered:如果 registered观察器this

    1. 对于 this节点列表中的每个 node:从 node已注册 观察器列表移除所有临时已注册观察器,其 来源registered

    2. registered选项设置为 options

  8. 否则:

    1. target已注册观察器列表追加一个新的已注册观察器,其 观察器this,且 选项options

    2. this节点列表追加一个指向 target 的弱引用。

disconnect() 方法步骤如下:

  1. 对于 this节点列表中的每个 node:从 node已注册观察器列表移除所有以 this观察器已注册观察器

  2. 清空 this记录 队列

takeRecords() 方法步骤如下:

  1. recordsthis记录队列的一个克隆

  2. 清空 this记录 队列

  3. 返回 records

4.3.2. 排队突变记录

要为 targettype 排队一个 突变记录, 带 namenamespaceoldValueaddedNodesremovedNodespreviousSiblingnextSibling

  1. interestedObservers 为空映射

  2. nodestarget包含自身的祖先

  3. 对于 nodes 中的每个 node,然后对于 node每个 registered,该 node已注册观察器 列表

    1. optionsregisteredoptions

    2. 如果以下各项均不为真

      则:

      1. moregisteredobserver

      2. 如果 interestedObservers[mo] 不存在,则 设置 interestedObservers[mo] 为 null。

      3. 如果 type 为 "attributes" 且 options["attributeOldValue"] 为 true,或者 type 为 "characterData" 且 options["characterDataOldValue"] 为 true,则 设置 interestedObservers[mo] 为 oldValue

  4. 对于 interestedObservers 中的每个 observermappedOldValue

    1. record 为一个新的 MutationRecord 对象,其 type 设置为 typetarget 设置为 targetattributeName 设置为 nameattributeNamespace 设置为 namespaceoldValue 设置为 mappedOldValueaddedNodes 设置为 addedNodesremovedNodes 设置为 removedNodespreviousSibling 设置为 previousSibling,并且 nextSibling 设置为 nextSibling

    2. record 入队observer记录 队列

    3. observer 追加周围代理待处理 mutation observers

  5. 排队一个 mutation observer 微任务

要为 target,带 addedNodesremovedNodespreviousSiblingnextSibling 排队一个树突变记录

  1. 断言addedNodesremovedNodes 非空

  2. 排队一个突变记录, 类型为 "childList",target 为 target, 参数为 null, null, null, 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 . addedNodes
record . removedNodes
分别返回添加和 移除的节点
record . previousSibling
record . nextSibling
分别返回所添加或移除节点前一个同胞下一个同胞; 否则返回 null。
record . attributeName
返回发生更改的属性局部名称;否则返回 null。
record . attributeNamespace
返回发生更改的属性命名空间;否则返回 null。
record . oldValue
返回值取决于 type。 对于 “attributes”,它是发生更改的 属性 在更改前的。 对于“characterData”,它是发生更改的 节点 在更改前的数据。对于 “childList”,它为 null。

typetargetaddedNodesremovedNodespreviousSiblingnextSiblingattributeNameattributeNamespaceoldValue 属性必须返回它们被初始化为的值。

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 ENTITY_REFERENCE_NODE = 5; // legacy
  const unsigned short ENTITY_NODE = 6; // legacy
  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 NOTATION_NODE = 12; // legacy
  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? otherNode); // legacy alias of ===

  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

  1. 断言interface 既不是 Document, 也不是继承自 Document 的接口。 要创建文档,应改用 创建 文档

  2. document相关 Realm中,返回一个新的节点, 该节点实现 interface,并将其节点文档设置为 document


node . nodeType

根据 node 的类型返回相应的数字,如下所示:

Element
Node . ELEMENT_NODE (1)。
Attr
Node . ATTRIBUTE_NODE (2)。
一个独占 Text 节点
Node . TEXT_NODE (3)。
CDATASection
Node . CDATA_SECTION_NODE (4)。
ProcessingInstruction
Node . PROCESSING_INSTRUCTION_NODE (7)。
Comment
Node . COMMENT_NODE (8)。
Document
Node . DOCUMENT_NODE (9)。
DocumentType
Node . DOCUMENT_TYPE_NODE (10)。
DocumentFragment
Node . DOCUMENT_FRAGMENT_NODE (11)。
node . nodeName

根据 node 的类型返回相应的字符串,如下所示:

Element
HTML 大写限定名称
Attr
限定名称
一个独占 Text 节点
#text”。
CDATASection
#cdata-section”。
ProcessingInstruction
目标
Comment
#comment”。
Document
#document”。
DocumentType
名称
DocumentFragment
#document-fragment”。

nodeType 获取器步骤是根据 this 实现的接口,返回第一个匹配的 语句:

Element
ELEMENT_NODE (1)
Attr
ATTRIBUTE_NODE (2);
一个独占 Text 节点
TEXT_NODE (3);
CDATASection
CDATA_SECTION_NODE (4);
ProcessingInstruction
PROCESSING_INSTRUCTION_NODE (7);
Comment
COMMENT_NODE (8);
Document
DOCUMENT_NODE (9);
DocumentType
DOCUMENT_TYPE_NODE (10);
DocumentFragment
DOCUMENT_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 实现的接口,按下述方式执行:

Attr

使用 this 和给定值,设置现有属性值

CharacterData

使用 0、this长度和给定值,替换 this 的数据。

否则

不执行任何操作。

要使用一个节点 node 获取文本内容,根据 node 实现的接口,返回以下内容:

DocumentFragment
Element
node后代文本内容
Attr
node
CharacterData
node数据
否则
Null。

textContent 获取器步骤是: 使用 this 运行获取文本内容,并返回其结果。

要在一个节点 parent 中使用字符串 string 字符串全部替换,运行以下步骤:

  1. node 为 null。

  2. 如果 string 不是空字符串,则将 node 设置为在给定 parent节点文档string 的情况下,创建文本 节点的结果。

  3. parent 中用 node 全部替换

要使用一个节点 node 和一个字符串 value 设置文本内容, 根据 node 实现的接口, 按如下定义执行:

DocumentFragment
Element

node 中使用 value 字符串全部 替换

Attr

使用 nodevalue 设置现有属性值

CharacterData

使用 0、node长度value替换 node 的数据。

否则

不执行任何操作。

textContent 设置器步骤是:如果给定值为 null,则改为像给定值是 空字符串一样操作;然后使用 this 和给定值运行设置文本内容


node . normalize()
移除独占 Text 节点,并将其余连续独占 Text 节点数据串联到它们的第一个节点中。

normalize() 方法步骤是:对于 this 的每个作为后代独占 Text 节点 node,运行以下步骤:

  1. lengthnode长度

  2. 如果 length 为零,则移除 node,并继续处理 下一个独占 Text 节点(如果存在)。

  3. datanode连续独占 Text 节点(不包括其自身)的数据树顺序进行的串联

  4. 使用 length、0 和 data 替换 node 的数据

  5. currentNodenode下一个同胞

  6. currentNode 是一个独占 Text 节点时:

    1. 对于每个其起始 节点currentNode活动范围: 将 length 加到其起始偏移量,并将其 起始节点设置为 node

    2. 对于每个其结束节点currentNode活动范围:将 length 加到其结束偏移量,并将其结束节点设置为 node

    3. 对于每个其起始 节点currentNode父节点,且其起始 偏移量currentNode索引活动范围: 将其起始 节点设置为 node,并将其 起始偏移量设置为 length

    4. 对于每个其结束节点currentNode父节点,且其结束 偏移量currentNode索引活动范围: 将其结束节点设置为 node,并将其 结束偏移量设置为 length

    5. currentNode长度加到 length

    6. currentNode 设置为其下一个 同胞

  7. 树顺序移除 node连续独占 Text 节点 (不包括其自身)。


node . cloneNode([subtree = false])
返回 node 的副本。如果 subtree 为 true,则该副本还包括 node后代
node . isEqualNode(otherNode)
返回 nodeotherNode 是否具有相同属性。
规范可以为 所有或部分节点定义克隆步骤。该算法会按照克隆 节点算法中的说明,传入 nodecopysubtree

HTML 为多个元素定义了克隆步骤,例如 inputscripttemplate。 SVG 也应当为其 script 元素这样做,但它并未这样做。

给定一个节点 node、 一个可选的文档 document (默认为 node节点文档)、布尔值 subtree(默认为 false)、节点或 null parent(默认为 null),以及 null 或一个 CustomElementRegistry 对象 fallbackRegistry (默认为 null),要克隆节点

  1. 断言node 不是一个文档,或者 nodedocument

  2. copy 为在给定 nodedocumentfallbackRegistry 的情况下,克隆单个节点的结果。

  3. 运行其他适用规范中为 node 定义的任何克隆步骤,并将 nodecopysubtree 作为参数传入。

  4. 如果 parent 非 null,则将 copy 附加parent

  5. 如果 subtree 为 true,则对于 node子节点中的每个 child,按树顺序:在给定 child 的情况下克隆 节点,其中 document 设置为 documentsubtree 设置为 subtreeparent 设置为 copy,并且 fallbackRegistry 设置为 fallbackRegistry

  6. 如果 node 是一个元素node 是一个 影子 宿主,并且 node影子根可克隆为 true:

    1. 断言copy 不是一个影子宿主

    2. shadowRootRegistrynode影子 根自定义元素注册表

    3. 如果 shadowRootRegistry 是全局自定义元素 注册表,则将 shadowRootRegistry 设置为 document自定义元素注册表有效全局自定义 元素注册表

    4. 使用 copynode影子根模式、true、 node影子根可序列化node影子根委托 焦点node影子根槽 分配以及 shadowRootRegistry附加影子根

    5. copy影子根声明式 设置为 node影子根声明式

    6. copy影子根保持自定义元素 注册表为 null设置为 node影子根保持自定义元素 注册表为 null

    7. 对于 node影子根子节点中的每个 child,按树顺序:在给定 child 的情况下克隆节点,其中 document 设置为 documentsubtree 设置为 true,并且 parent 设置为 copy影子根

      这里有意不传递 fallbackRegistry 参数。

  7. 返回 copy

给定一个节点 node文档 document,以及 null 或一个 CustomElementRegistry 对象 fallbackRegistry,要克隆单个 节点

  1. copy 为 null。

  2. 如果 node 是一个元素

    1. registrynode自定义元素注册表

    2. 如果 registry 为 null,则将 registry 设置为 fallbackRegistry

    3. 如果 registry 是全局自定义元素 注册表,则将 registry 设置为 document自定义元素注册表有效全局自定义 元素注册表

    4. copy 设置为在给定 documentnode局部 名称node命名空间node命名空间前缀nodeis、false 和 registry 的情况下,创建 元素的结果。

    5. 对于 node属性列表中的每个 attribute

      1. copyAttribute 为在给定 attributedocument 和 null 的情况下,克隆单个 节点的结果。

      2. copyAttribute 附加copy

  3. 否则,如果 node 是一个文档,则将 copy 设置为在给定 document相关 Realm的情况下,创建 文档的结果,该文档实现与 node 相同的接口。

  4. 否则,将 copy 设置为在给定 document 的情况下,创建节点的结果,该节点 实现node 相同的接口。

  5. 根据 node 实现的接口,满足以下附加要求:

    Document
    1. copy编码内容类型URL类型模式允许声明式 影子根,设置为 node 的对应值。

    2. 如果 node自定义元素注册表具有作用域为 true,则将 copy自定义元素注册表 设置为 node自定义元素注册表

    DocumentType

    copy名称公共 ID系统 ID设置为 node 的对应值。

    Attr

    copy命名空间命名空间前缀局部名称设置为 node 的对应值。

    Text
    Comment

    copy数据设置为 node 的数据。

    ProcessingInstruction

    copy目标数据 设置为 node 的对应值。

    否则

    不执行任何操作。

  6. 断言copy 是一个节点

  7. 如果 node 是一个文档,则将 document 设置为 copy

  8. copy节点文档设置为 document

  9. 返回 copy

cloneNode(subtree) 方法步骤如下:

  1. 如果 this 是一个影子根,则抛出一个 “NotSupportedErrorDOMException

  2. 返回在给定 this 的情况下克隆节点的结果,其中 subtree 设置为 subtree

如果以下所有条件均为 true,则称一个节点 A 与另一个 节点 B 相等

isEqualNode(otherNode) 方法步骤是: 如果 otherNode 非 null,并且 thisotherNode 相等,则返回 true;否则返回 false。

isSameNode(otherNode) 方法步骤是: 如果 otherNodethis,则返回 true;否则返回 false。


node . compareDocumentPosition(other)
返回一个位掩码,指示 other 相对于 node 的位置。可以设置以下位:
Node . DOCUMENT_POSITION_DISCONNECTED (1)
nodeother 不在同一 中时设置。
Node . DOCUMENT_POSITION_PRECEDING (2)
other 位于 node 之前时设置。
Node . DOCUMENT_POSITION_FOLLOWING (4)
other 位于 node 之后时设置。
Node . DOCUMENT_POSITION_CONTAINS (8)
othernode祖先时设置。
Node . DOCUMENT_POSITION_CONTAINED_BY (16,十六进制为 10)
othernode后代时设置。
node . contains(other)
如果 othernode包含自身的后代,则返回 true; 否则返回 false。

以下是 compareDocumentPosition() 作为掩码返回的常量:

compareDocumentPosition(other) 方法 步骤如下:

  1. 如果 thisother,则返回零。

  2. node1other,并令 node2this

  3. attr1attr2 为 null。

  4. 如果 node1 是一个属性,则将 attr1 设置为 node1, 并将 node1 设置为 attr1元素

  5. 如果 node2 是一个属性

    1. attr2 设置为 node2,并将 node2 设置为 attr2元素

    2. 如果 attr1node1 非 null,并且 node2node1

      1. 对于 node2属性列表中的每个 attr

        1. 如果 attrattr1 相等,则返回 DOCUMENT_POSITION_IMPLEMENTATION_SPECIFICDOCUMENT_POSITION_PRECEDING 相加的结果。

        2. 如果 attrattr2 相等,则返回 DOCUMENT_POSITION_IMPLEMENTATION_SPECIFICDOCUMENT_POSITION_FOLLOWING 相加的结果。

  6. 如果 node1node2 为 null,或者 node1不是 node2,则返回 DOCUMENT_POSITION_DISCONNECTEDDOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC 以及 DOCUMENT_POSITION_PRECEDINGDOCUMENT_POSITION_FOLLOWING 之一相加的结果, 约束条件是这些选择合在一起必须保持一致。

    返回 DOCUMENT_POSITION_PRECEDING 还是 DOCUMENT_POSITION_FOLLOWING 通常通过指针比较实现。在 JavaScript 实现中,可以使用缓存的 Math.random() 值。

  7. 如果 node1node2祖先attr1 为 null,或者 node1node2attr2 非 null,则返回 DOCUMENT_POSITION_CONTAINSDOCUMENT_POSITION_PRECEDING 相加的结果。

  8. 如果 node1node2后代attr2 为 null,或者 node1node2attr1 非 null,则返回 DOCUMENT_POSITION_CONTAINED_BYDOCUMENT_POSITION_FOLLOWING 相加的结果。

  9. 如果 node1 位于 node2 之前,则返回 DOCUMENT_POSITION_PRECEDING

    由于此算法处理属性的方式,这会导致一个节点属性 被视为位于节点子节点之前, 尽管属性并不参与同一

  10. 返回 DOCUMENT_POSITION_FOLLOWING

contains(other) 方法步骤是: 如果 otherthis包含自身的后代,则返回 true;否则返回 false (包括 other 为 null 的情况)。


要使用 namespace 为一个 element 定位命名空间前缀,运行以下步骤:

  1. 如果 element命名空间namespace,并且其 命名空间前缀非 null,则返回其 命名空间前缀

  2. 如果 element 具有一个属性,其 命名空间前缀是“xmlns”, 且namespace,则返回 element 的第一个此类属性局部名称

  3. 如果 element父元素非 null,则返回使用 namespace 对该元素运行定位命名空间前缀的结果。

  4. 返回 null。

要使用 prefix 为一个 node 定位命名空间,根据 node 实现的接口:

Element
  1. 如果 prefix 是“xml”,则返回 XML 命名空间

  2. 如果 prefix 是“xmlns”,则返回 XMLNS 命名空间

  3. 如果其命名空间非 null,并且其 命名空间前缀prefix,则返回该 命名空间

  4. 如果它具有一个属性,该属性的命名空间XMLNS 命名空间命名空间前缀是 “xmlns”,并且 局部名称prefix;或者如果 prefix 为 null,且它 具有一个属性,该属性的命名空间XMLNS 命名空间命名空间前缀为 null,并且局部名称 是“xmlns”,则在其 不是空字符串时返回该值,否则返回 null。

  5. 如果其父 元素为 null,则返回 null。

  6. 返回使用 prefix 对其父元素运行定位命名空间的结果。

Document
  1. 如果其文档元素为 null,则返回 null。

  2. 返回使用 prefix 对其文档元素 运行定位命名空间的结果。

DocumentType
DocumentFragment

返回 null。

Attr
  1. 如果其元素为 null,则返回 null。

  2. 返回使用 prefix 对其元素 运行定位命名空间的结果。

否则
  1. 如果其父 元素为 null,则返回 null。

  2. 返回使用 prefix 对其父元素 运行定位命名空间的结果。

lookupPrefix(namespace) 方法步骤如下:

  1. 如果 namespace 为 null 或空字符串,则返回 null。

  2. 根据 this 实现的接口:

    Element

    返回使用 namespacethis 定位命名空间前缀的结果。

    Document
    1. 如果 this文档元素为 null,则返回 null。

    2. 返回使用 namespacethis文档元素定位命名空间前缀的结果。

    DocumentType
    DocumentFragment

    返回 null。

    Attr
    1. 如果 this元素为 null,则返回 null。

    2. 返回使用 namespacethis元素定位命名空间前缀的结果。

    否则
    1. 如果 this父元素为 null,则返回 null。

    2. 返回使用 namespacethis父 元素定位命名空间前缀的结果。

lookupNamespaceURI(prefix) 方法步骤 如下:

  1. 如果 prefix 是空字符串,则将其设置为 null。

  2. 返回使用 prefixthis 运行定位命名空间的结果。

isDefaultNamespace(namespace) 方法 步骤 如下:

  1. 如果 namespace 是空字符串,则将其设置为 null。

  2. defaultNamespace 为使用 null 为 this 运行定位命名空间的结果。

  3. 如果 defaultNamespacenamespace 相同,则返回 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

  1. 如果 qualifiedName 是 U+002A (*),则返回一个以 root 为根、其过滤器仅匹配作为后代元素HTMLCollection

  2. 否则,如果 root节点文档是一个HTML 文档, 则返回一个以 root 为根、其过滤器匹配以下作为 后代元素HTMLCollection

  3. 否则,返回一个以 root 为根、其过滤器匹配限定名称为 qualifiedName 的作为 后代元素HTMLCollection

当使用相同参数调用时,只要 root节点 文档类型未更改,就可以返回与先前调用所返回对象相同的 HTMLCollection 对象。

对于一个节点 root命名空间为 namespace 且局部名称为 localName 的元素列表 是由以下算法返回的 HTMLCollection

  1. 如果 namespace 是空字符串,则将其设置为 null。

  2. 如果 namespacelocalName 都是 U+002A (*),则返回一个 以 root 为根、其过滤器匹配作为后代元素HTMLCollection

  3. 如果 namespace 是 U+002A (*),则返回一个以 root 为根、其过滤器匹配局部名称为 localName 的作为后代元素HTMLCollection

  4. 如果 localName 是 U+002A (*),则返回一个以 root 为根、其过滤器匹配命名空间为 namespace 的作为后代元素HTMLCollection

  5. 返回一个以 root 为根、其过滤器匹配命名空间为 namespace局部名称localName 的作为 后代元素HTMLCollection

当使用相同参数调用时,可以返回与先前调用所返回对象相同的 HTMLCollection 对象。

对于一个节点 root类名为 classNames 的元素列表 是由以下算法返回的 HTMLCollection

  1. classes 为对 classNames 运行有序集合解析器的结果。
  2. 如果 classes 是空集合,则返回一个空的 HTMLCollection
  3. 返回一个以 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 .characterSet
  readonly attribute DOMString inputEncoding; // legacy alias of .characterSet
  readonly 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 interface); // legacy

  [NewObject] Range createRange();

  // NodeFilter.SHOW_ALL = 0xFFFFFFFF
  [NewObject] NodeIterator createNodeIterator(Node root, optional unsigned long whatToShow = 0xFFFFFFFF, optional NodeFilter? filter = null);
  [NewObject] TreeWalker createTreeWalker(Node root, optional unsigned long whatToShow = 0xFFFFFFFF, optional NodeFilter? filter = null);
};

[Exposed=Window]
interface XMLDocument : Document {};

dictionary ElementCreationOptions {
  CustomElementRegistry? customElementRegistry;
  DOMString is;
};

dictionary ImportNodeOptions {
  CustomElementRegistry customElementRegistry;
  boolean selfOnly = false;
};

Document 节点简称为文档

文档节点 文档就是其自身。

每个文档都有一个关联的 编码(一个编码)、 内容类型(一个字符串)、 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文档获取父节点算法,在 eventtype 属性值为“load”,或者该文档没有 浏览上下文时返回 null;否则返回该 文档相关全局对象

给定一个Realm realm,要创建 文档,使其实现接口 interface

  1. 断言interfaceDocument 或继承自 Document 的接口。

  2. realm 中返回一个新的节点,该节点实现 interface


document = new Document()
返回一个新的文档
document . implementation
返回 documentDOMImplementation 对象。
document . URL
document . documentURI
返回 documentURL
document . compatMode
如果 document模式是 “quirks”,则返回字符串“BackCompat”;否则返回 “CSS1Compat”。
document . characterSet
返回 document编码
document . contentType
返回 document内容类型

new Document() 构造器步骤是,将 this设置为 当前全局对象关联 Document[HTML]

createDocument() 不同,此构造器不会 返回一个 XMLDocument 对象,而是返回一个文档Document 对象)。

implementation 获取器步骤是返回与 this 关联的 DOMImplementation 对象。

URLdocumentURI 获取器步骤是返回 thisURL,并将其序列化

compatMode 获取器步骤是:如果 this模式是“quirks”,则返回 “BackCompat”;否则返回“CSS1Compat”。

characterSetcharsetinputEncoding 获取器步骤是返回 this编码名称

contentType 获取器步骤是返回 this内容类型


document . doctype
返回文档类型; 如果不存在,则返回 null。
document . documentElement
返回文档 元素
collection = document . getElementsByTagName(qualifiedName)

如果 qualifiedName 是“*”,则返回一个包含所有作为 后代元素HTMLCollection

否则,返回一个包含所有限定名称为 qualifiedName 的作为后代元素HTMLCollection。 (在HTML 文档内, 对HTML 命名空间中的元素进行不区分大小写的匹配。)

collection = document . getElementsByTagNameNS(namespace, localName)

如果 namespacelocalName 都是“*”,则返回一个 包含所有作为后代元素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.getElementsByTagName("FOO") 将匹配不在 HTML 命名空间中的 <FOO> 元素,以及位于 HTML 命名空间中的 <foo> 元素,但不会匹配位于 HTML 命名空间中的 <FOO> 元素。

getElementsByTagNameNS(namespace, localName) 方法步骤是返回 this命名空间为 namespace 且局部 名称为 localName 的元素列表

getElementsByClassName(classNames) 方法步骤是返回 this类名为 classNames 的元素列表

给定以下 XHTML 片段:
<div id="example">
  <p id="p1" class="aaa bbb"/>
  <p id="p2" class="aaa ccc"/>
  <p id="p3" class="bbb ccc"/>
</div>

调用 document.getElementById("example").getElementsByClassName("aaa") 将返回一个 HTMLCollection, 其中包含 p1p2 这两个段落。

而调用 getElementsByClassName("ccc bbb") 只会返回一个节点,即 p3。调用 document.getElementById("example").getElementsByClassName("bbb ccc ") 会返回相同的结果。

调用 getElementsByClassName("aaa,bbb") 不会返回任何节点;上述元素均不属于 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 不是一个有效元素局部名称,则将抛出一个 “InvalidCharacterErrorDOMException

如果同时提供了 optionscustomElementRegistryoptionsis, 则将抛出一个 “NotSupportedErrorDOMException

element = document . createElementNS(namespace, qualifiedName [, options])

返回一个命名空间为 namespace元素。 其命名空间前缀将是 qualifiedName 中 U+003A (:) 之前的所有内容,如果不存在则为 null。 其局部名称将是 qualifiedName 中 U+003A (:) 之后的所有内容;如果不存在 U+003A (:), 则为 qualifiedName

如果提供了 options,则可以使用其中的 customElementRegistry 设置 CustomElementRegistry

如果提供了 options,则可以使用其中的 is 创建一个 自定义内置元素

如果 qualifiedName 不是一个(可能带前缀的) 有效元素局部名称,则将抛出一个“InvalidCharacterErrorDOMException

如果以下任一条件为 true,则将抛出一个“NamespaceErrorDOMException

如果同时提供了 optionscustomElementRegistryoptionsis, 则将抛出一个 “NotSupportedErrorDOMException

documentFragment = document . createDocumentFragment()
返回一个 DocumentFragment 节点
text = document . createTextNode(data)
返回一个数据dataText 节点
text = document . createCDATASection(data)
返回一个数据dataCDATASection 节点
comment = document . createComment(data)
返回一个数据dataComment 节点
processingInstruction = document . createProcessingInstruction(target, data)
返回一个 ProcessingInstruction 节点,其 目标target,并且 数据data。 如果 target 不匹配 Name 产生式,则将抛出一个 “InvalidCharacterErrorDOMException。 如果 data 包含“?>”,则将抛出一个 “InvalidCharacterErrorDOMException

除非另有说明,否则任意 namenamespace元素接口都是 Element

例如,HTML 标准会定义,对于 htmlHTML 命名空间,使用 HTMLHtmlElement 接口。[HTML]

createElement(localName, options) 方法步骤如下:

  1. 如果 localName 不是一个有效元素局部名称,则抛出一个“InvalidCharacterErrorDOMException

  2. 如果 this 是一个HTML 文档,则将 localName 设置为 localNameASCII 小写形式

  3. registryis 为在给定 optionsthis 的情况下,扁平化元素创建选项的结果。

  4. 如果 this 是一个 HTML 文档,或者 this内容 类型是 “application/xhtml+xml”,则令 namespaceHTML 命名空间;否则为 null。

  5. 返回在给定 thislocalNamenamespace、null、is、true 和 registry 的情况下,创建元素的结果。

给定 documentnamespacequalifiedNameoptions内部 createElementNS 步骤如下:

  1. 令(namespaceprefixlocalName)为在给定 “element”的情况下,对 namespacequalifiedName 进行验证并提取的结果。

  2. registryis 为在给定 optionsthis 的情况下,扁平化元素创建选项的结果。

  3. 返回在给定 documentlocalNamenamespaceprefixis、true 和 registry 的情况下,创建元素的结果。

createElementNS(namespace, qualifiedName, options) 方法步骤是返回在给定 thisnamespacequalifiedNameoptions 的情况下,运行 内部 createElementNS 步骤的结果。

给定一个字符串或 ElementCreationOptions 字典 options,以及一个文档 document,要扁平化元素创建选项

  1. registry 为在给定 document 的情况下,查找自定义元素注册表的结果。

  2. is 为 null。

  3. 如果 options 是一个字典:

    1. 如果 options["is"] 存在,则将 is 设置为它。

    2. 如果 options["customElementRegistry"] 存在

      1. 如果 is 非 null,则抛出一个“NotSupportedErrorDOMException

      2. registry 设置为 options["customElementRegistry"]。

    3. 如果 registry 非 null,registry具有作用域为 false,并且 registry 不是 document自定义元素注册表,则抛出一个 “NotSupportedErrorDOMException

  4. 返回 registryis

为了 Web 兼容性,createElement()createElementNS()options 参数允许为字符串。

createDocumentFragment() 方法步骤是 返回在给定 this 的情况下,创建文档片段的结果。

createTextNode(data) 方法步骤是 返回在给定 thisdata 的情况下,创建文本节点的结果。

createCDATASection(data) 方法步骤 如下:

  1. 如果 this 是一个HTML 文档,则抛出一个 “NotSupportedErrorDOMException

  2. 如果 data 包含字符串“]]>”,则抛出一个 “InvalidCharacterErrorDOMException

  3. node 为在给定 this 的情况下,创建节点的结果,该节点实现 CDATASection

  4. node数据设置为 data

  5. 返回 node

createComment(data) 方法步骤是 返回在给定 thisdata 的情况下,创建注释节点的结果。

createProcessingInstruction(target, data) 方法步骤是返回在给定 thistargetdata 的情况下,创建处理指令节点的结果。


clone = document . importNode(node [, options = false])

返回 node 的副本。如果 options 为 true,或者 options 是一个 其 selfOnly 为 false 的字典,则该副本还包括 node后代

可以使用 optionscustomElementRegistry 设置没有自定义元素注册表的元素的 CustomElementRegistry

如果 node 是一个文档或一个影子根,则抛出一个 “NotSupportedErrorDOMException

node = document . adoptNode(node)

node 从另一个文档中移动出来并返回它。

如果 node 是一个文档,则抛出一个“NotSupportedErrorDOMException; 如果 node 是一个影子根,则抛出一个 “HierarchyRequestErrorDOMException

importNode(node, options) 方法步骤如下:

  1. 如果 node 是一个文档影子根,则抛出 一个“NotSupportedErrorDOMException

  2. subtree 为 false。

  3. registry 为 null。

  4. 如果 options 是布尔值,则将 subtree 设置为 options

  5. 否则:

    1. subtree 设置为 options["selfOnly"] 的否定值。

    2. 如果 options["customElementRegistry"] 存在,则将 registry 设置为它。

    3. 如果 registry具有作用域为 false,并且 registry 不是 this自定义元素注册表,则 抛出一个“NotSupportedErrorDOMException

  6. 如果 registry 为 null,则将 registry 设置为在给定 this 的情况下,查找自定义元素注册表的结果。

  7. 返回在给定 node 的情况下克隆节点的结果,其中 document 设置为 thissubtree 设置为 subtree,并且 fallbackRegistry 设置为 registry

规范可以为所有或部分 节点定义收养 步骤。按照收养算法中的说明,该算法会接收 nodeoldDocument

要将一个节点 node 收养到一个 文档 document 中:

  1. oldDocumentnode节点文档

  2. 如果 node父节点非 null,则移除 node

  3. 如果 document 不是 oldDocument,则对于 node影子包含且包含自身的后代中的每个 inclusiveDescendant,按影子包含树顺序

    1. inclusiveDescendant节点文档 设置为 document

    2. 如果 inclusiveDescendant 是一个影子根,并且以下任一条件为 true:

      则将 inclusiveDescendant自定义元素注册表设置为 document自定义元素注册表有效全局自定义 元素注册表

    3. 否则,如果 inclusiveDescendant 是一个元素

      1. inclusiveDescendant属性列表中每个属性节点文档设置为 document

      2. 如果 inclusiveDescendant自定义元素注册表为 null,或者 inclusiveDescendant自定义元素注册表具有作用域为 false:

        1. registry 为 null。

        2. 如果 inclusiveDescendant自定义元素 注册表非 null、inclusiveDescendant父节点为 null,或者 inclusiveDescendant父节点是一个 独占 DocumentFragment 节点,则将 registry 设置为 document自定义元素 注册表

        3. 否则,将 registry 设置为在给定 inclusiveDescendant父节点的情况下,查找自定义 元素注册表的结果。

        4. inclusiveDescendant自定义元素 注册表设置为 registry有效 全局自定义元素注册表

      3. 如果 inclusiveDescendant自定义的,则使用 inclusiveDescendant、回调名称“adoptedCallback” 和 « oldDocument, document » 将自定义元素 回调反应加入队列

    4. 使用 inclusiveDescendantoldDocument 运行收养步骤

adoptNode(node) 方法步骤如下:

  1. 如果 node 是一个文档,则抛出一个 “NotSupportedErrorDOMException

  2. 如果 node 是一个影子根,则抛出一个 “HierarchyRequestErrorDOMException

  3. node 收养this 中。

  4. 返回 node


如果 null 或一个 CustomElementRegistry 对象 registry 非 null,并且 registry具有 作用域为 false,则称 registry 是全局自定义元素注册表

null 或一个 CustomElementRegistry 对象 registry有效全局自定义元素注册表是:

  1. 如果 registry 是全局自定义元素注册表,则返回 registry

  2. 返回 null。


createAttribute(localName) 方法 步骤如下:

  1. 如果 localName 不是一个有效属性局部名称,则 抛出一个“InvalidCharacterErrorDOMException

  2. 如果 this 是 一个HTML 文档,则将 localName 设置为 localNameASCII 小写形式
  3. 返回在给定 thislocalName 的情况下,创建属性的结果。

createAttributeNS(namespace, qualifiedName) 方法步骤如下:

  1. 令(namespaceprefixlocalName)为在给定 “attribute”的情况下,对 namespacequalifiedName 进行验证 并提取的结果。

  2. 返回在给定 thislocalNamenamespaceprefix 的情况下,创建属性的结果。


createEvent(interface) 方法步骤 如下:

  1. constructor 为 null。

  2. 如果 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"
  3. 如果 constructor 为 null,则抛出一个“NotSupportedErrorDOMException

  4. 如果 constructor 所指示的接口未在 this相关全局对象上公开,则抛出一个 “NotSupportedErrorDOMException

    用户代理通常会在某些配置中禁用对触摸事件的支持, 在这种情况下,此条款将针对 TouchEvent 接口触发。

  5. event 为在给定 constructor 的情况下,创建事件的结果。

  6. eventtype 属性初始化为空字符串。

  7. eventtimeStamp 属性初始化为使用 this相关全局对象调用 当前高分辨率时间的结果。

  8. eventisTrusted 属性初始化为 false。

  9. 取消设置 event已初始化标志

  10. 返回 event

应当改用事件构造器。


createRange() 方法步骤是返回一个新的 活动范围,其起点终点均为(this, 0)。

可以改用 Range() 构造器。


createNodeIterator(root, whatToShow, filter) 方法步骤如下:

  1. iterator 为一个新的 NodeIterator 对象。

  2. iterator设置为 root

  3. iterator引用设置为(root, true)。

  4. iteratorwhatToShow设置为 whatToShow

  5. iterator过滤器设置为 filter

  6. 返回 iterator

createTreeWalker(root, whatToShow, filter) 方法步骤如下:

  1. walker 为一个新的 TreeWalker 对象。

  2. walkerwalker当前节点设置为 root

  3. walkerwhatToShow设置为 whatToShow

  4. walker过滤器设置为 filter

  5. 返回 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)
返回一个具有给定 namepublicIdsystemId文档类型

如果 name 不是一个有效文档类型名称,则抛出一个“InvalidCharacterErrorDOMException

doc = document . implementation . createDocument(namespace, qualifiedName [, doctype = null])
返回一个 XMLDocument, 其 文档元素局部名称qualifiedName,且其 命名空间namespace(除非 qualifiedName 是 空字符串);如果提供了 doctype,则将其作为文档的 文档类型

使用 namespacequalifiedName 调用此方法时, 它会抛出与 createElementNS() 方法相同的异常。

doc = document . implementation . createHTMLDocument([title])
返回一个文档, 其中已经构建了一个基本 ,并包含一个 title 元素,除非省略了 title 参数。

createDocumentType(name, publicId, systemId) 方法步骤如下:

  1. 如果 name 不是一个有效文档类型名称,则抛出一个“InvalidCharacterErrorDOMException

  2. 返回在给定与 this 关联的文档namepublicIdsystemId 的情况下,创建文档类型的结果。

createDocument(namespace, qualifiedName, doctype) 方法步骤如下:

  1. document 为在给定 this相关 Realm的情况下,创建文档的结果,该文档实现 XMLDocument

  2. element 为 null。

  3. 如果 qualifiedName 不是空字符串,则将 element 设置为在给定 documentnamespacequalifiedName 和一个空字典的情况下, 运行内部 createElementNS 步骤的结果。

  4. 如果 doctype 非 null,则将 doctype 附加document

  5. 如果 element 非 null,则将 element 附加document

  6. document是与 this 关联的 文档

  7. document内容类型namespace 决定:

    HTML 命名空间
    application/xhtml+xml
    SVG 命名空间
    image/svg+xml
    任何其他命名空间
    application/xml
  8. 返回 document

createHTMLDocument(title) 方法步骤如下:

  1. doc 为在给定 this相关 Realm的情况下,创建文档的结果,该文档实现 Document

  2. doc类型设置为“html”,并将 内容类型设置为“text/html”。

  3. doctype 为在给定 doc 和 “html”的情况下,创建文档类型的结果。

  4. doctype 附加doc

  5. 将在给定 doc、“html”和 HTML 命名空间的情况下,创建元素的结果附加doc

  6. 将在给定 doc、“head”和 HTML 命名空间的情况下,创建元素的结果附加到先前创建的 html 元素。

  7. 如果提供了 title

    1. 将在给定 doc、“title”和 HTML 命名空间的情况下,创建 元素的结果附加到先前创建的 head 元素。

    2. text 为在给定 doctitle(可以是空字符串)的情况下,创建文本节点的结果。

    3. text 附加到先前创建的 title 元素。

  8. 将在给定 doc、“body”和 HTML 命名空间的情况下,创建元素的结果附加到先前创建的 html 元素。

  9. doc是与 this 关联的 文档

  10. 返回 doc

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(默认为空字符串),要创建文档类型

  1. doctype 为在给定 document 的情况下,创建节点的结果,该节点实现 DocumentType

  2. doctype名称设置为 name,将公共 ID设置为 publicId,并将系统 ID设置为 systemId

  3. 返回 doctype

name 获取器步骤是返回 this名称

publicId 获取器步骤是返回 this公共 ID

systemId 获取器步骤是返回 this系统 ID

4.7. 接口DocumentFragment

[Exposed=Window]
interface DocumentFragment : Node {
  constructor();
};
tree = new DocumentFragment()
返回一个新的 DocumentFragment 节点

一个独占 DocumentFragment 节点是一个不属于 ShadowRoot 节点DocumentFragment 节点

一个 DocumentFragment 节点有一个关联的 宿主(null 或不同节点树中的一个 元素)。除非另有说明, 其值为 null。

如果对象 A 是对象 B包含自身的祖先, 或者 B具有非 null 的宿主,并且 AB宿主宿主包含且包含自身的祖先, 则对象 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 节点简称为 影子根

影子根关联的 宿主永不为 null。

影子根有一个关联的 模式(“open” 或“closed”)。

影子根有一个关联的 委托焦点 (一个布尔值)。其初始设置为 false。

影子根有一个关联的 可供元素内部使用(一个布尔值)。其初始设置为 false。

影子根有一个关联的 声明式 (一个布尔值)。其初始设置为 false。

影子根有一个关联的 槽分配 (“manual”或“named”)。

影子根有一个关联的 可克隆(一个布尔值)。 其初始设置为 false。

影子根有一个关联的 可序列化(一个布尔值)。 其初始设置为 false。

影子根有一个关联的 自定义元素注册表 (null 或一个 CustomElementRegistry 对象)。其初始为 null。

影子根有一个关联的 保持自定义元素注册表为 null(一个布尔值)。 其初始为 false。

此值只能与声明式影子根结合时为 true。而且仅在影子根自定义 元素注册表 为 null 期间才有意义。


给定一个 event影子根获取父节点算法,在 event组合标志未设置,并且该影子根event路径中第一个事件路径项调用目标时返回 null;否则返回该影子根宿主


mode 获取器步骤是返回 this模式

delegatesFocus 获取器步骤是返回 this委托焦点

slotAssignment 获取器步骤是返回 this槽分配

clonable 获取器步骤是返回 this可克隆

serializable 获取器步骤是返回 this可序列化

host 获取器步骤是返回 this宿主


onslotchange 属性是 onslotchange 事件处理程序的一个事件处理程序 IDL 属性,其 事件处理程序事件类型slotchange


影子包含树顺序是对一棵节点树进行的 影子包含前序深度优先遍历。 对一棵节点树 tree 进行影子包含前序深度优先遍历,就是对 tree 进行前序深度优先遍历,并且对于在 tree 中遇到的每个 影子宿主, 在遇到它之后立即对该元素影子根节点树进行 影子包含前序深度优先遍历

如果一个对象的是一个影子根,则该对象的 影子包含根是其宿主影子包含根; 否则是其

如果对象 A 是对象 B后代,或者 A是一个影子根,并且 A宿主B影子包含且包含自身的后代, 则对象 A 是对象 B影子包含后代

影子包含且包含自身的后代 是一个对象本身或其影子包含后代之一。

当且仅当 BA影子包含后代时,对象 A 才是对象 B影子包含祖先

影子包含且包含自身的祖先 是一个对象本身或其影子包含祖先之一。

如果以下所有条件均为 true,则一个节点 A 对另一个节点 B闭合影子隐藏的

要针对一个对象 B 重定目标一个对象 A,重复以下步骤,直到它们返回一个对象:

  1. 如果以下任一条件为 true

    则返回 A

  2. A 设置为 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 selectors); // legacy alias of .matches

  HTMLCollection getElementsByTagName(DOMString qualifiedName);
  HTMLCollection getElementsByTagNameNS(DOMString? namespace, DOMString localName);
  HTMLCollection getElementsByClassName(DOMString classNames);

  [CEReactions] Element? insertAdjacentElement(DOMString where, Element element); // legacy
  undefined insertAdjacentText(DOMString where, DOMString data); // legacy
};

dictionary ShadowRootInit {
  required ShadowRootMode mode;
  boolean delegatesFocus = false;
  SlotAssignmentMode slotAssignment = "named";
  boolean clonable = false;
  boolean serializable = false;
  CustomElementRegistry? customElementRegistry;
};

ShadowRootInit 有些不同寻常,它允许将 undefinednull 都传递给其 customElementRegistry 成员,以便 Web 开发者可以将一个 ShadowRoot 节点而不是字典传递给 attachShadow()

Element 节点简称为 元素

元素有以下关联项:

命名空间
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 大写限定名称是以下步骤的返回 值:

  1. qualifiedNamethis限定名称

  2. 如果 this 位于 HTML 命名空间中,并且其节点文档是一个 HTML 文档, 则返回 qualifiedNameASCII 大写形式

  3. 返回 qualifiedName

用户代理可以通过将限定名称HTML 大写限定名称存储 在内部槽中来优化它们。

给定一个文档 document、字符串 localName、字符串或 null namespace,以及 可选的字符串或 null prefix(默认为 null)、字符串或 null is(默认为 null)、布尔值 synchronousCustomElements(默认为 false),以及“default”、 null 或一个 CustomElementRegistry 对象 registry(默认为“default”),要创建一个 元素

  1. result 为 null。

  2. 如果 registry 是“default”,则将 registry 设置为 在给定 document 的情况下查找自定义元素注册表的结果。

  3. definition 为在给定 registrynamespacelocalNameis 的情况下, 查找自定义元素定义的结果。

  4. 如果 definition 非 null,并且 definition名称不等于其 局部名称(即 definition 表示一个 自定义内置元素):

    1. interfacelocalNameHTML 命名空间元素接口

    2. result 设置为在给定 documentinterfacelocalNameHTML 命名空间prefix、“undefined”、isregistry 的情况下,在内部 创建元素的结果。

    3. 如果 synchronousCustomElements 为 true,则在捕获任何异常的同时运行此 步骤:

      1. 使用 definition 升级 result

      如果此步骤抛出了异常 exception

      1. definition构造器对应的 JavaScript 对象的 关联 Realm全局对象报告 exception

      2. result自定义元素状态 设置为 “failed”。

    4. 否则,在给定 resultdefinition 的情况下,将自定义元素升级反应加入队列

  5. 否则,如果 definition 非 null:

    1. 如果 synchronousCustomElements 为 true:

      1. Cdefinition构造器

      2. previousRegistry周围代理活动自定义元素 构造器映射[C],其默认值为 null。

      3. 周围代理活动自定义元素 构造器映射[C] 设置registry

      4. 在捕获任何异常的同时运行以下步骤:

        1. result 设置为无参数构造 C 的结果。

        2. 断言:以下条件之一为 true:

          customElements.define("x-example", class extends HTMLElement {
            constructor() {
              // 不符合规范:返回现有元素,而不是调用 super()。
              return document.createElement("p");
            }
          });
          
          document.createElement("x-example");
          

          这里的 resultp 元素,其 自定义 元素状态是“uncustomized”,并且其 自定义 元素定义为 null。

        3. 断言:result命名空间HTML 命名空间

          IDL 强制 result 是一个 HTMLElement 对象,而它们全部 使用HTML 命名空间

        4. 如果 result属性列表不为空, 则抛出一个“NotSupportedErrorDOMException

        5. 如果 result子节点,则抛出一个 “NotSupportedErrorDOMException

        6. 如果 result父节点非 null,则抛出一个 “NotSupportedErrorDOMException

        7. 如果 result节点文档不是 document,则 抛出一个“NotSupportedErrorDOMException

        8. 如果 result局部名称不等于 localName,则抛出一个“NotSupportedErrorDOMException

        9. result命名空间前缀 设置为 prefix

        10. resultis设置为 null。

        11. result自定义元素 注册表设置为 registry

        如果其中任何步骤抛出了异常 exception

        1. definition构造器对应的 JavaScript 对象的关联 Realm全局对象报告 exception

        2. result 设置为在给定 documentHTMLUnknownElementlocalNameHTML 命名空间prefix、“failed”、null 和 registry 的情况下,在内部创建元素的结果。

      5. 如果 previousRegistry 为 null,则从 周围代理活动自定义元素 构造器映射[C] 中移除该项。

      6. 否则,将周围代理活动自定义元素 构造器映射[C] 设置previousRegistry

    2. 否则:

      1. result 设置为在给定 documentHTMLElementlocalNameHTML 命名空间prefix、“undefined”、null 和 registry 的 情况下,在内部创建元素的结果。

      2. 在给定 resultdefinition 的情况下,将自定义元素 升级反应加入队列

  6. 否则:

    1. interfacelocalNamenamespace元素接口

    2. result 设置为在给定 documentinterfacelocalNamenamespaceprefix、“uncustomized”、isregistry 的情况下,在内部 创建元素的结果。

    3. 如果 namespaceHTML 命名空间,并且 localName 是 一个 有效自定义元素名称,或者 is 非 null,则将 result自定义元素状态设置为 “undefined”。

  7. 返回 result

给定一个文档 document、一个 接口 interface、一个字符串 localName、一个字符串或 null namespace、 一个字符串或 null prefix、一个字符串 state、一个字符串或 null is,以及 null 或一个 CustomElementRegistry 对象 registry,要在内部创建元素

  1. element 为在给定 document 的情况下,创建节点的结果,该节点实现 interface

  2. element命名空间设置为 namespace, 将命名空间前缀设置为 prefix, 将局部名称设置为 localName,将自定义元素注册表设置为 registry, 将自定义元素状态设置为 state, 将自定义元素定义设置为 null,并将is 设置为 is

  3. 断言element属性列表 为空

  4. 返回 element

元素还有一个关联的 属性列表,它是一个通过 NamedNodeMap 公开的列表。 除非在创建元素时明确给出,否则其 属性 列表为空

如果一个元素属性列表包含属性 A,则该元素具有属性

本规范和其他规范可以为 元素定义 属性更改步骤。该算法会接收 elementlocalNameoldValuevaluenamespace

要使用 elementoldValuenewValue 处理属性 更改一个属性 attribute,运行以下步骤:

  1. 使用 attribute局部名称attribute命名空间oldValue、« »、« »、null 和 null,为 element 将一个“attributes”突变记录加入队列

  2. 如果 element自定义的,则使用 element、回调名称 “attributeChangedCallback”和 « attribute局部名称oldValuenewValueattribute命名空间 » 将自定义元素回调反应加入队列

  3. 使用 elementattribute局部名称oldValuenewValueattribute命名空间运行属性更改步骤

要将一个属性 attribute 更改value

  1. oldValueattribute

  2. attribute设置为 value

  3. 使用 attribute元素oldValuevalue,为 attribute 处理属性更改

要将一个属性 attribute 附加到一个元素 element

  1. attribute 附加element属性列表

  2. attribute元素设置为 element

  3. attribute节点文档设置为 element节点文档

  4. 使用 element、null 和 attribute,为 attribute 处理属性更改

移除一个 属性 attribute

  1. elementattribute元素

  2. element属性 列表移除 attribute
  3. attribute元素设置为 null。

  4. 使用 elementattribute和 null,为 attribute 处理属性更改

要使用一个属性 newAttribute 替换一个 属性 oldAttribute

  1. elementoldAttribute元素

  2. element属性列表中,使用 newAttribute 替换 oldAttribute

  3. newAttribute元素设置为 element

  4. newAttribute节点文档设置为 element节点文档

  5. oldAttribute元素设置为 null。

  6. 使用 elementoldAttributenewAttribute,为 oldAttribute 处理属性更改


给定一个字符串 qualifiedName 和一个元素 element,要按名称获取属性

  1. 如果 element 位于HTML 命名空间中,并且其节点文档 是一个HTML 文档,则将 qualifiedName 设置为 qualifiedNameASCII 小写形式

  2. 返回 element属性列表中第一个 属性,其 限定名称qualifiedName;否则返回 null。

给定 null 或一个字符串 namespace、一个字符串 localName 和一个 元素 element,要 按命名空间和局部名称获取属性

  1. 如果 namespace 是空字符串,则将其设置为 null。

  2. 如果存在,则返回 element属性列表属性,其 命名空间namespace,且 局部名称localName;否则返回 null。

给定一个元素 element、一个字符串 localName,以及可选的 null 或 字符串 namespace(默认为 null),要获取 属性值

  1. attr 为在给定 namespacelocalNameelement 的情况下, 获取属性的结果。

  2. 如果 attr 为 null,则返回空字符串。

  3. 返回 attr

给定一个属性 attr 和一个元素 element,要设置 属性

  1. verifiedValue 为使用 attr局部名称attr命名空间elementattr调用 获取符合可信类型的属性值的结果。 [TRUSTED-TYPES]

  2. 如果 attr元素既不是 null 也不是 element, 则抛出一个“InUseAttributeErrorDOMException

  3. oldAttr 为在给定 attr命名空间attr局部名称element 的情况下,获取属性的结果。

  4. 如果 oldAttrattr,则返回 attr

  5. attr设置为 verifiedValue

  6. 如果 oldAttr 非 null,则使用 attr 替换 oldAttr

  7. 否则,将 attr 附加element

  8. 返回 oldAttr

给定一个元素 element、一个字符串 localName、一个字符串 value、 一个可选的 null 或字符串 prefix(默认为 null),以及一个可选的 null 或字符串 namespace(默认为 null),要设置 属性值

  1. attribute 为在给定 namespacelocalNameelement 的情况下, 获取属性的结果。
  2. 如果 attribute 为 null,则将在给定 element节点文档localNamenamespaceprefixvalue 的情况下 创建属性的结果附加element,然后返回。
  3. attribute 更改value

给定一个字符串 qualifiedName 和一个元素 element,要按名称移除属性

  1. attr 为在给定 qualifiedNameelement 的情况下,获取属性的结果。

  2. 如果 attr 非 null,则移除 attr

  3. 返回 attr

给定 null 或一个字符串 namespace、一个字符串 localName 和一个 元素 element,要 按命名空间和局部名称移除 属性

  1. attr 为在给定 namespacelocalNameelement 的情况下, 获取属性的结果。

  2. 如果 attr 非 null,则移除 attr

  3. 返回 attr


一个元素可以有一个关联的 唯一标识符(ID)

过去,元素可以有多个标识符,例如同时使用 HTML id 属性和 DTD。本规范将 ID 定义为 DOM 的一个概念,并且只允许每个元素有一个 ID,该 ID 由 id 属性给出。

使用以下属性更改步骤更新一个元素ID

  1. 如果 localNameidnamespace 为 null,并且 value 为 null 或空字符串,则取消设置 elementID

  2. 否则,如果 localNameid,并且 namespace 为 null,则 将 elementID 设置为 value

虽然本规范为任意元素上的 classidslot 属性定义了要求,但并不 声明使用它们是否符合规范。


一个节点的类型为 Element父节点称为其 父元素。如果该节点具有 不同类型的父节点,则其 父元素为 null。


namespace = element . namespaceURI
返回命名空间
prefix = element . prefix
返回 命名空间前缀
localName = element . localName
返回 局部名称
qualifiedName = element . tagName
返回HTML 大写限定名称

namespaceURI 获取器步骤是返回 this命名空间

prefix 获取器步骤是返回 this命名空间前缀

localName 获取器步骤是返回 this局部名称

tagName 获取器步骤是返回 thisHTML 大写限定名称


element . id [ = value ]

返回 elementid 内容属性的值。可以通过设置它来 更改该值。

element . className [ = value ]

返回 elementclass 内容属性的值。可以通过设置它 来更改该值。

element . classList

允许通过一个 DOMTokenList 对象,将 elementclass 内容属性作为 一组由空格分隔的标记进行操作。

element . slot [ = value ]

返回 elementslot 内容属性的值。可以通过设置它来 更改该值。

被定义为反映字符串 name 的 IDL 属性,必须具有以下获取器和设置器步骤:

获取器步骤

返回在给定 thisname 的情况下,运行获取属性值的结果。

设置器步骤

使用 name 和给定值,为 this 设置属性值

id 属性必须反映id”。

className 属性必须 反映class”。

classList 获取器步骤是返回一个 DOMTokenList 对象,其关联的元素this,并且其关联的 属性局部名称class。这个特定 DOMTokenList 对象的标记集合也称为该元素

slot 属性必须反映slot”。

idclassslot 实际上是 超全局属性,因为它们可以出现在任何元素上,而不论该元素的 命名空间为何。


element . hasAttributes()

如果 element 具有属性,则返回 true;否则返回 false。

element . getAttributeNames()

返回 element 的所有属性限定名称。 其中可以包含重复项。

element . getAttribute(qualifiedName)

返回 element 中第一个属性,其限定名称qualifiedName;如果没有这样的属性,则返回 null。

element . getAttributeNS(namespace, localName)

返回 element属性,其命名空间namespace,且局部名称localName;如果 没有这样的属性,则返回 null。

element . setAttribute(qualifiedName, value)

element 中第一个属性设置为 value,该属性的 限定名称qualifiedName

element . setAttributeNS(namespace, localName, value)

element属性设置为 value,该属性的 命名空间namespace,且 局部名称localName

element . removeAttribute(qualifiedName)

移除 element 中第一个属性,其限定名称qualifiedName

element . removeAttributeNS(namespace, localName)

移除 element属性,其命名空间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。

hasAttributes() 方法步骤是:如果 this属性列表为空, 则返回 false;否则返回 true。

attributes 获取器步骤是返回关联的 NamedNodeMap

getAttributeNames() 方法步骤是按顺序返回 this属性列表属性限定名称;否则返回一个新的列表

这些名称不保证唯一。

getAttribute(qualifiedName) 方法 步骤如下:

  1. attr 为在给定 qualifiedNamethis 的情况下,获取属性的结果。

  2. 如果 attr 为 null,则返回 null。

  3. 返回 attr

getAttributeNS(namespace, localName) 方法步骤如下:

  1. attr 为在给定 namespacelocalNamethis 的情况下,获取属性的结果。

  2. 如果 attr 为 null,则返回 null。

  3. 返回 attr

setAttribute(qualifiedName, value) 方法步骤如下:

  1. 如果 qualifiedName 不是一个有效属性局部名称,则抛出一个 “InvalidCharacterErrorDOMException

    尽管参数如此命名, 仅当已经存在一个属性,其限定名称qualifiedName 时,qualifiedName 才会被用作限定名称。否则,它会被用作新 属性的局部 名称。我们只需针对后一种情况验证它。

  2. 如果 this 位于HTML 命名空间中,并且其节点文档是一个 HTML 文档, 则将 qualifiedName 设置为 qualifiedNameASCII 小写形式

  3. verifiedValue 为使用 qualifiedName、null、thisvalue 调用 获取符合可信类型的 属性值的结果。[TRUSTED-TYPES]

  4. attributethis属性列表中第一个属性,其 限定名称qualifiedName; 否则为 null。

  5. 如果 attribute 非 null,则将 attribute 更改verifiedValue,然后返回。

  6. attribute 设置为在给定 this节点文档qualifiedName、null、null 和 verifiedValue 的情况下,创建属性的结果。

  7. attribute 附加this

setAttributeNS(namespace, qualifiedName, value) 方法步骤如下:

  1. 令(namespaceprefixlocalName)为在给定 “attribute”的情况下,对 namespacequalifiedName 进行验证并提取的结果。

  2. verifiedValue 为使用 localNamenamespacethisvalue 调用 获取符合可信类型的 属性值的结果。[TRUSTED-TYPES]

  3. 使用 localNameverifiedValueprefixnamespace,为 this 设置属性值

removeAttribute(qualifiedName) 方法步骤是,在给定 qualifiedNamethis 的情况下,移除属性,然后返回 undefined。

removeAttributeNS(namespace, localName) 方法步骤是,在给定 namespacelocalNamethis 的情况下,移除属性,然后返回 undefined。

hasAttribute(qualifiedName) 方法 步骤如下:

  1. 如果 this 位于HTML 命名空间中,并且其节点文档是一个 HTML 文档, 则将 qualifiedName 设置为 qualifiedNameASCII 小写形式

  2. 如果 this 具有一个属性,其 限定名称qualifiedName,则返回 true;否则返回 false。

toggleAttribute(qualifiedName, force) 方法步骤如下:

  1. 如果 qualifiedName 不是一个有效属性局部名称,则抛出一个 “InvalidCharacterErrorDOMException

    请参阅上面的讨论, 了解为何 我们将其作为局部名称而不是限定名称进行验证。

  2. 如果 this 位于HTML 命名空间中,并且其节点文档是一个 HTML 文档, 则将 qualifiedName 设置为 qualifiedNameASCII 小写形式

  3. attributethis属性列表中第一个属性,其 限定名称qualifiedName; 否则为 null。

  4. 如果 attribute 为 null:

    1. 如果未给出 force 或其为 true,则将在给定 this节点文档qualifiedName 的情况下,创建属性的结果附加this,然后 返回 true。

    2. 返回 false。

  5. 如果未给出 force 或其为 false,则在给定 qualifiedNamethis 的情况下,移除属性,然后返回 false。

  6. 返回 true。

hasAttributeNS(namespace, localName) 方法步骤如下:

  1. 如果 namespace 是空字符串,则将其设置为 null。

  2. 如果 this 具有一个属性,其 命名空间namespace,且 局部名称localName,则返回 true;否则返回 false。

getAttributeNode(qualifiedName) 方法 步骤是返回在给定 qualifiedNamethis 的情况下,获取属性的结果。

getAttributeNodeNS(namespace, localName) 方法步骤是返回在给定 namespacelocalNamethis 的情况下, 获取属性的结果。

setAttributeNode(attr)setAttributeNodeNS(attr) 方法 步骤是返回在给定 attrthis 的情况下,设置属性的结果。

removeAttributeNode(attr) 方法 步骤 如下:

  1. 如果 this属性列表包含 attr,则抛出一个“NotFoundErrorDOMException

  2. 移除 attr

  3. 返回 attr


shadow = element . attachShadow(init)

element 创建一个影子根并返回它。

shadow = element . shadowRoot

如果 element影子根,并且该 影子根模式是“open”,则返回该影子根;否则返回 null。

有效影子宿主名称是:

此列表有意受到限制,以便内置元素可以随时间推移根据需要获得内部 影子树

attachShadow(init) 方法步骤如下:

  1. registrythis节点文档自定义元素注册表

  2. 如果 init["customElementRegistry"] 存在,则 将 registry 设置为它。

  3. 如果 registry 非 null、registry具有作用域为 false,并且 registry 不是 this节点文档自定义元素注册表,则抛出一个 “NotSupportedErrorDOMException

  4. 使用 thisinit["mode"]、 init["clonable"]、 init["serializable"]、 init["delegatesFocus"]、 init["slotAssignment"] 和 registry,运行附加影子根

  5. 返回 this影子根

给定一个元素 element、一个字符串 mode、一个布尔值 clonable、 一个布尔值 serializable、一个布尔值 delegatesFocus、一个字符串 slotAssignment,以及 null 或一个 CustomElementRegistry 对象 registry,要附加影子根

  1. 如果 element命名空间不是HTML 命名空间, 则抛出一个“NotSupportedErrorDOMException

  2. 如果 element局部名称不是一个 有效影子宿主名称,则抛出一个“NotSupportedErrorDOMException

  3. 如果 element局部名称是一个有效自定义元素名称,或者 elementis非 null:

    1. definition 为在给定 element自定义元素注册表、其 命名空间、其局部名称和其 is的情况下,查找自定义元素定义的结果。

    2. 如果 definition 非 null,并且 definition禁用影子为 true,则抛出一个 “NotSupportedErrorDOMException

  4. 如果 element 是一个影子宿主

    1. currentShadowRootelement影子根

    2. 如果以下任一项为真:

      • currentShadowRoot声明式为 false;或者

      • currentShadowRoot模式不是 mode

      抛出一个 "NotSupportedError" DOMException

    3. 树顺序移除 currentShadowRoot 的所有子节点

    4. currentShadowRoot声明式设置为 false。

    5. 返回。

  5. shadow 为在给定 element节点文档的情况下,创建节点的结果,该节点实现 ShadowRoot

  6. shadow宿主设置为 element

  7. shadow模式设置为 mode

  8. shadow委托焦点设置为 delegatesFocus

  9. 如果 element自定义元素状态是 “precustomized”或“custom”,则将 shadow可供元素内部使用设置为 true。

  10. shadow槽分配设置为 slotAssignment

  11. shadow声明式设置为 false。

  12. shadow可克隆设置为 clonable

  13. shadow可序列化设置为 serializable

  14. shadow自定义元素注册表设置为 registry

  15. element影子根设置为 shadow

shadowRoot 获取器步骤如下:

  1. shadowthis影子根

  2. 如果 shadow 为 null,或者其模式是“closed”, 则返回 null。

  3. 返回 shadow


registry = element . customElementRegistry

如果有,则返回 elementCustomElementRegistry 对象;否则返回 null。

customElementRegistry 获取器步骤是 返回 this自定义元素注册表


element . closest(selectors)
返回第一个(从 element 开始)与 selectors 匹配的包含自身的祖先;否则返回 null。
element . matches(selectors)
如果以 element为基准匹配 selectors 得到 element,则返回 true;否则返回 false。

closest(selectors) 方法步骤如下:

  1. selector 为从 selectors解析选择器的结果。 [SELECTORS4]

  2. 如果 selector 是失败,则抛出一个“SyntaxErrorDOMException

  3. elementsthis 的属于 元素包含自身的祖先,按反向 树顺序排列。

  4. 对于 elements 中的每个 element:如果使用 selectorelement作用域根 this将选择器与元素进行匹配返回成功, 则返回 element[SELECTORS4]

  5. 返回 null。

matches(selectors)webkitMatchesSelector(selectors) 方法步骤 如下:

  1. selector 为从 selectors解析选择器的结果。 [SELECTORS4]

  2. 如果 selector 是失败,则抛出一个“SyntaxErrorDOMException

  3. 如果使用 selectorthis作用域 根 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。

返回将 node 预插入element父节点中、位于 element 之前的结果。

afterbegin

返回将 node 预插入element 中、位于 element第一个子节点之前的结果。

beforeend

返回将 node 预插入element 中、位于 null 之前的结果。

afterend

如果 element父节点为 null,则返回 null。

返回将 node 预插入element父节点中、位于 element下一个同胞之前的结果。

否则

抛出一个“SyntaxErrorDOMException

insertAdjacentElement(where, element) 方法步骤是返回在给定 thiswhereelement 的情况下,运行相邻插入的结果。

insertAdjacentText(where, data) 方法步骤如下:

  1. text 为在给定 this节点文档data 的情况下,创建文本节点的结果。

  2. 在给定 thiswheretext 的情况下,运行相邻插入

此方法不返回任何内容,因为在我们有机会设计它之前,它就已经存在了。

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 范围内的数字,除非 该属性列表为空,在这种 情况下不存在 支持的属性索引

length 获取器步骤是返回 属性列表大小

item(index) 方法步骤如下:

  1. 如果 index 大于或等于 this属性列表大小,则返回 null。

  2. 否则,返回 this属性列表[index]。

一个 NamedNodeMap 对象的支持的属性名称是运行以下 步骤的返回值:

  1. names 为此 NamedNodeMap 对象的属性列表属性限定名称,按顺序排列并省略重复项。

  2. 如果此 NamedNodeMap 对象的元素位于 HTML 命名空间中,并且其节点文档是一个HTML 文档,则 对于 names 中的每个 name

    1. lowercaseNamenameASCII 小写形式

    2. 如果 lowercaseName 不等于 name,则从 names 中移除 name

  3. 返回 names

getNamedItem(qualifiedName) 方法步骤是返回在给定 qualifiedName元素的情况下,获取属性的结果。

getNamedItemNS(namespace, localName) 方法步骤是返回在给定 namespacelocalName元素的情况下,获取属性的结果。

setNamedItem(attr)setNamedItemNS(attr) 方法步骤是 返回在给定 attr元素的情况下,设置属性的结果。

removeNamedItem(qualifiedName) 方法步骤如下:

  1. attr 为在给定 qualifiedName元素的情况下,移除属性的结果。

  2. 如果 attr 为 null,则抛出一个“NotFoundErrorDOMException

  3. 返回 attr

removeNamedItemNS(namespace, localName) 方法步骤如下:

  1. attr 为在给定 namespacelocalName元素的情况下,移除属性的结果。

  2. 如果 attr 为 null,则抛出一个“NotFoundErrorDOMException

  3. 返回 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(默认为空 字符串),要创建 属性

  1. attribute 为在给定 document 的情况下,创建节点的结果,该节点实现 Attr

  2. attribute命名空间设置为 namespace, 将命名空间前缀设置为 prefix, 将局部名称设置为 localName,并将设置为 value

  3. 返回 attribute

一个 A 属性 是一个属性,其 局部名称A,并且其 命名空间命名空间前缀均为 null。


namespaceURI 获取器步骤是返回 this命名空间

prefix 获取器步骤是返回 this命名空间前缀

localName 获取器步骤是返回 this局部名称

name 获取器步骤是返回 this限定名称

value 获取器步骤是返回 this

给定一个属性 attribute 和 字符串 value,要设置现有属性值,运行以下步骤:

  1. 如果 attribute元素为 null,则将 attribute设置为 value,然后返回。

  2. elementattribute元素

  3. verifiedValue 为使用 attribute局部名称attribute命名空间elementvalue 调用 获取符合可信类型的属性 值的结果。[TRUSTED-TYPES]

  4. 如果 attribute元素为 null,则将 attribute设置为 verifiedValue,然后返回。

  5. 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 是一个抽象接口。无法直接获取它的实例。它 由 TextProcessingInstructionComment 节点使用。

每个继承自 CharacterData 接口的节点都有一个关联的可变 字符串,称为数据

要使用整数 offset、整数 count、字符串 data 和一个可选的 布尔值 piAttributesAlreadyUpdated(默认为 false)替换数据一个 节点 node

  1. lengthnode长度

  2. 如果 offset 大于 length,则抛出一个 “IndexSizeErrorDOMException

  3. 如果 offset + count 大于 length,则将 count 设置为 lengthoffset

  4. 使用 null、null、node数据、« »、« »、null 和 null,为 node 将一个 “characterData”突变记录加入队列

  5. offset代码单元之后,将 data 插入 node数据中。

  6. deleteOffsetoffset + data长度

  7. deleteOffset代码单元处开始,从 node数据中移除 count代码单元

  8. 对于每个实时范围,如果其起始节点node,且 起始偏移量大于 offset, 但小于或等于 offset + count:将其起始偏移量设置为 offset

  9. 对于每个实时范围,如果其结束节点node,且 结束偏移量大于 offset, 但小于或等于 offset + count:将其结束偏移量设置为 offset

  10. 对于每个实时范围,如果其起始节点node,且 起始偏移量大于 offset + count:将其 起始偏移量增加 data长度,并将其减少 count

  11. 对于每个实时范围,如果其结束节点node,且 结束偏移量大于 offset + count:将其 结束偏移量增加 data长度,并将其减少 count

  12. 如果 node 是一个 ProcessingInstruction 节点,并且 piAttributesAlreadyUpdated 为 false,则在给定 node 的情况下从数据更新属性

  13. 如果 node父节点非 null,则为 node父节点运行 子节点已更改步骤

要使用整数 offset 和整数 count 截取数据子字符串一个 节点 node

  1. lengthnode长度

  2. 如果 offset 大于 length,则抛出一个 “IndexSizeErrorDOMException

  3. 如果 offset + count 大于 length,则返回一个 字符串,其值为 node数据中从第 offset 代码单元到末尾的代码单元

  4. 返回一个字符串,其值为 node数据中从第 offset 代码单元到第 offset+count 代码单元代码单元

data 获取器步骤是返回 this数据。其设置器步骤是使用 0、this长度和给定值替换 数据 this

length 获取器步骤是返回 this长度

substringData(offset, count) 方法步骤是返回使用 offsetcount 截取数据子字符串 this 的结果。

appendData(data) 方法步骤是 使用 this长度、0 和 data 替换数据 this

insertData(offset, data) 方法步骤是使用 offset、0 和 data 替换数据 this

deleteData(offset, count) 方法步骤是使用 offsetcount 和 空字符串替换数据 this

replaceData(offset, count, data) 方法步骤是使用 offsetcountdata 替换数据 this

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 节点nodenode前一个同胞 Text 节点(如果有),以及 它的连续 Text 节点,还有 node下一个同胞 Text 节点(如果有),以及它的连续 Text 节点,并避免任何 重复项。

一个节点 node连续独占 Text 节点nodenode前一个同胞 独占 Text 节点(如果有),以及它的 连续独占 Text 节点,还有 node下一个 同胞 独占 Text 节点(如果有),以及它的 连续独占 Text 节点, 并避免任何重复项。

一个节点 node子文本 内容是按树顺序排列的 node 的所有 Text 节点 子节点数据串联

一个 节点 node后代文本内容是按树顺序排列的 node 的所有 Text 节点 后代数据串联

给定一个文档 document 和一个 字符串 data,要创建文本 节点

  1. text 为在给定 document 的情况下,创建节点的结果,该节点实现 Text

  2. text数据设置为 data

  3. 返回 text


new Text(data) 构造器步骤是将 this数据设置为 data,并将 this节点 文档设置为当前全局对象关联 Document

要使用整数 offset 拆分一个 Text 节点 node

  1. lengthnode长度

  2. 如果 offset 大于 length,则抛出一个 “IndexSizeErrorDOMException

  3. countlengthoffset

  4. newData 为使用 offsetcount 截取数据子字符串 node 的结果。

  5. newNode 为在给定 node节点 文档newData 的情况下,创建文本节点的结果。

  6. parentnode父节点

  7. 如果 parent 非 null:

    1. newNode 插入parent 中、位于 node下一个同胞之前。

    2. 对于每个实时范围,如果其起始 节点node,且 起始偏移量大于 offset,则将其 起始节点设置为 newNode,并将其 起始偏移量 减少 offset

    3. 对于每个实时范围,如果其结束节点node,且 结束偏移量大于 offset,则将其结束节点 设置为 newNode,并将其结束 偏移量减少 offset

    4. 对于每个实时范围,如果其起始 节点parent,且 起始偏移量等于 node索引加 1, 则将其起始偏移量增加 1。

    5. 对于每个实时范围,如果其结束节点parent,且 结束偏移量等于 node索引加 1, 则将其结束偏移量增加 1。

  8. 使用 offsetcount 和 空字符串替换 数据 node

  9. 返回 newNode

splitText(offset) 方法步骤是使用 偏移量 offset 拆分 this

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

  1. pi创建节点的结果,该节点实现 ProcessingInstruction, 给定 document

  2. 使用 targetdata 初始化 pi

  3. 返回 pi

要使用 targetdata 初始化一个 ProcessingInstruction 节点 pi

  1. 如果 target 不匹配 Name 产生式,则 抛出一个“InvalidCharacterErrorDOMException

  2. 如果 data 包含字符串“?>”,则抛出一个 “InvalidCharacterErrorDOMException

  3. pi目标设置为 target

  4. pi数据设置为 data

  5. 给定 pi从数据更新属性

从 数据更新属性,给定一个 ProcessingInstruction 节点 pi

  1. 清空 pi属性映射

  2. result 为给定 pi数据调用 从字符串解析伪属性的规则所得的解析结果

  3. 如果 result 是错误,则返回。

  4. 对于 result 的每个伪属性 pseudoAttr: 将 pi属性映射[pseudoAttr名称] 设置pseudoAttr

从 属性更新数据,给定一个 ProcessingInstruction 节点 pi

  1. data 为空字符串。

  2. 对于 pi属性映射中的每个 namevalue

    1. 如果 data 不是空字符串,则将 U+0020 SPACE 附加到 data

    2. name 附加到 data

    3. 将 U+003D (=) 附加到 data

    4. 将 U+0022 (") 附加到 data

    5. value 中的任何 U+0026 (&) 替换为“&amp;”。

    6. value 中的任何 U+003C (<) 替换为“&lt;”。

    7. value 中的任何 U+003D (>) 替换为“&gt;”。

    8. value 中的任何 U+0022 (") 替换为“&quot;”。

    9. value 附加到 data

    10. 将 U+0022 (") 附加到 data

  3. 使用 0、pi长度data 和 true 替换 数据 pi

获取处理指令属性,给定一个 ProcessingInstruction 节点 pi 和一个 字符串 name:返回 pi属性映射[name],其默认值为 null。


new ProcessingInstruction(target, data) 构造器步骤如下:

  1. this节点文档设置为当前全局对象关联 Document

  2. 使用 targetdata 初始化 this

target 获取器步骤是 返回 this目标

hasAttributes() 方法 步骤是:如果 this属性映射 为 空,则返回 false;否则返回 true。

getAttributeNames() 方法步骤 是返回this属性映射获取键的结果。

getAttribute(name) 方法 步骤是返回在给定 thisname 的情况下,获取处理指令属性的结果。

setAttribute(name, value) 方法步骤如下:

  1. 如果 name 不是一个有效属性局部名称,则抛出一个 “InvalidCharacterErrorDOMException

  2. this属性映射[name] 设置value

  3. 给定 this从属性更新数据

removeAttribute(name) 方法步骤如下:

  1. this属性映射[name] 中移除该项。

  2. 给定 this从属性更新数据

toggleAttribute(name, force) 方法步骤如下:

  1. 如果 name 不是一个有效属性局部名称,则抛出一个 “InvalidCharacterErrorDOMException

  2. attributesthis属性映射

  3. 如果 attributes[name] 不存在

    1. 如果未给出 force 或其为 true,则将 attributes[name] 设置 为空字符串,给定 this 从属性更新 数据,然后返回 true。

    2. 返回 false。

  4. 如果未给出 force 或其为 false,则从 attributes[name] 中移除该项,给定 this 从属性更新 数据,然后返回 false。

  5. 返回 true。

hasAttribute(name) 方法步骤是:如果 this属性映射[name] 存在,则返回 true;否则返回 false。

4.14. 接口 注释

[Exposed=Window]
interface Comment : CharacterData {
  constructor(optional DOMString data = "");
};
comment = new Comment([data = ""])
返回一个新的 Comment 节点,其 数据data

创建注释 节点,给定一个文档 document 和 一个字符串 data

  1. comment创建节点的结果,该节点实现 Comment, 给定 document

  2. comment数据设置为 data

  3. 返回 comment

new Comment(data) 构造器步骤是将 this数据设置为 data,并将 this节点 文档设置为当前全局对象关联的 Document

5. Ranges

5.1. Introduction to "DOM Ranges"

StaticRangeRange 对象(范围)表示 节点树中的一段 内容序列。每个范围都有一个起点和一个终点,它们 是边界点。一个边界点是一个由 元组组成的 节点和一个偏移。换句话说, 一个 范围表示节点 树中两个 边界点之间的一段 内容。

范围经常用于 编辑中的内容选择和复制。

在上面的节点树 中,可以使用一个 范围来表示 序列 “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 现在转换为字符串后就是前述引文

上面节点树中的 srcalt属性无法由范围表示。范围仅适用于 节点

Range 对象与 StaticRange 对象不同,会受到 节点树突变的影响。因此 它们也称为实时范围。此类突变不会 使它们失效,并会尝试确保它仍表示相同的内容片段。 必然地,当例如其所表示内容的一部分发生突变时,作为 节点树突变的一部分,实时 范围本身也可能被修改。

有关详细信息,请参阅插入移除算法、 normalize() 方法,以及替换 数据拆分 算法。

为响应节点 树突变而更新实时范围 可能成本高昂。每当 节点树发生更改时,所有 受影响的 Range 对象都需要更新。即使应用程序 对某些实时范围不感兴趣,在发生突变时,它仍须承担使它们 保持最新状态 的成本。

一个 StaticRange 对象是一个轻量级范围, 在 节点树发生突变时不会更新。因此它 不会产生与 实时范围相同的维护成本。

5.2. Boundary points

一个 边界点是一个元组, 由一个 节点(一个节点)和一个 偏移量(一个非负整数)组成。

一个正确的边界点偏移量将 位于 0 与该边界点节点长度 之间,包括两端。

一个 边界点nodeAoffsetA)相对于另一个边界点nodeBoffsetB)的 位置之前相等之后,由以下步骤返回:

  1. 断言:nodeAnodeB 具有相同的

  2. 如果 nodeAnodeB,则当 offsetAoffsetB 时返回相等;当 offsetA 小于 offsetB 时返回之前;当 offsetA 大于 offsetB 时返回之后
  3. 如果 nodeA 位于 nodeB 之后,则如果 (nodeBoffsetB)相对于 (nodeAoffsetA)的 位置之前,则返回 之后;如果是之后,则返回 之前

  4. 如果 nodeAnodeB祖先

    1. childnodeB

    2. child 不是 nodeA子节点时,将 child 设置为其父级

    3. 如果 child索引小于 offsetA,则返回 之后

  5. 返回之前

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。

startContainer 获取器步骤是返回 this起始节点

startOffset 获取器步骤是返回 this起始偏移量

endContainer 获取器步骤是返回 this结束节点

endOffset 获取器步骤是返回 this结束偏移量

collapsed 获取器步骤是:如果 this折叠,则返回 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);
};
staticRange = new StaticRange(init)

返回一个新的范围 对象,当节点树发生变更时,该对象不会更新。

new StaticRange(init) 构造器步骤如下:

  1. 如果 init["startContainer"] 或 init["endContainer"] 是一个 DocumentTypeAttr 节点,则抛出一个“InvalidNodeTypeErrorDOMException

  2. 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 START_TO_START = 0;
  const unsigned short START_TO_END = 1;
  const unsigned short END_TO_END = 2;
  const unsigned short END_TO_START = 3;
  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 接口的对象称为 实时范围

修改的算法(尤其是插入移除移动替换数据拆分 算法)会修改与该关联的实时 范围

一个实时范围是其起始 节点

如果一个节点 noderange,并且 (node, 0) 位于 range起始位置之后,且 (node, node长度) 位于 range结束位置之前,则 node 包含 在一个实时范围 range 中。

如果一个节点是一个实时范围起始节点包含自身的祖先,但不是其结束 节点的包含自身的祖先,反之亦然,则该节点部分包含在该实时范围 中。

以下事实有助于更好地理解这些定义:

给定一个节点 node实时 范围预移除步骤如下:

  1. parentnode父节点

  2. 断言parent 非 null。

  3. indexnode索引

  4. 对于每个实时范围,如果其起始节点node包含自身的后代, 则将其起始位置设置为 (parent, index)。

  5. 对于每个实时范围,如果其结束节点node包含自身的后代, 则将其结束位置设置为 (parent, index)。

  6. 对于每个实时范围,如果其起始节点parent,且其 起始偏移量大于 index, 则将其 起始偏移量减少 1。

  7. 对于每个实时范围,如果其结束节点parent,且其 结束偏移量大于 index, 则将其 结束偏移量减少 1。


range = new Range()
返回一个新的实时 范围

new Range() 构造器 步骤是 将 this起始位置结束位置设置为 (当前全局对象关联 Document, 0)。


container = range . commonAncestorContainer
返回同时为 range起始节点结束 节点祖先中, 距离文档最远的节点

要获取一个实时范围 range公共 祖先

  1. containerrange起始节点

  2. container 不是 range结束节点包含自身的祖先时:将 container 设置为 container父节点

  3. 返回 container

commonAncestorContainer 获取器步骤是 返回this 获取公共祖先的结果。


要将 range起始位置或结束位置设置为 一个边界点 (node, offset):

  1. 如果 node 是一个文档类型,则抛出一个 “InvalidNodeTypeErrorDOMException

  2. 如果 offset 大于 node长度,则 抛出一个“IndexSizeErrorDOMException

  3. boundaryPoint边界点 (node, offset)。

  4. 如果这些步骤是以“设置起始位置”调用的
    1. 如果 range不是 node,或者 boundaryPoint 位于 range结束位置之后,则将 range结束位置 设置为 boundaryPoint

    2. range起始位置设置为 boundaryPoint

    如果这些步骤是以“设置结束位置”调用的
    1. 如果 range不是 node,或者 boundaryPoint 位于 range起始位置之前,则将 range起始位置 设置为 boundaryPoint

    2. range结束位置设置为 boundaryPoint

setStart(node, offset) 方法 步骤是将 this起始位置设置为边界点 (node, offset)。

setEnd(node, offset) 方法 步骤是将 this结束位置设置为边界点 (node, offset)。

setStartBefore(node) 方法步骤如下:

  1. parentnode父节点

  2. 如果 parent 为 null,则抛出一个 “InvalidNodeTypeErrorDOMException

  3. this起始位置设置为边界点 (parent, node索引)。

setStartAfter(node) 方法步骤如下:

  1. parentnode父节点

  2. 如果 parent 为 null,则抛出一个 “InvalidNodeTypeErrorDOMException

  3. this起始位置设置为边界点 (parent, node索引加 1)。

setEndBefore(node) 方法步骤如下:

  1. parentnode父节点

  2. 如果 parent 为 null,则抛出一个 “InvalidNodeTypeErrorDOMException

  3. this结束位置设置为边界点 (parent, node索引)。

setEndAfter(node) 方法步骤如下:

  1. parentnode父节点

  2. 如果 parent 为 null,则抛出一个 “InvalidNodeTypeErrorDOMException

  3. this结束位置设置为边界点 (parent, node索引加 1)。

collapse(toStart) 方法步骤是:如果 toStart 为 true,则将结束位置设置为起始位置;否则将 起始位置设置为结束位置

要在一个范围 range选择一个节点 node

  1. parentnode父节点

  2. 如果 parent 为 null,则抛出一个 “InvalidNodeTypeErrorDOMException

  3. indexnode索引

  4. range起始位置设置为边界点 (parent, index)。

  5. range结束位置设置为边界点 (parent, index 加 1)。

selectNode(node) 方法步骤是在this选择 node

selectNodeContents(node) 方法 步骤 如下:

  1. 如果 node 是一个文档类型,则抛出一个 “InvalidNodeTypeErrorDOMException

  2. lengthnode长度

  3. 起始位置设置为边界点 (node, 0)。

  4. 结束位置设置为边界 点 (node, length)。


compareBoundaryPoints(how, sourceRange) 方法步骤如下:

  1. 如果 how 不是以下值之一:

    抛出一个“NotSupportedErrorDOMException

  2. 如果 this不是 sourceRange, 则抛出一个“WrongDocumentErrorDOMException

  3. thisPointsourcePoint 为 null。

  4. 根据 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结束位置

  5. 根据 thisPoint 相对于 sourcePoint位置进行切换:

    之前
    返回 −1。
    相等
    返回 0。
    之后
    返回 1。

deleteContents() 方法步骤如下:

  1. 如果 this折叠,则返回。

  2. originalStartNodeoriginalStartOffsetoriginalEndNodeoriginalEndOffset 分别为this起始节点起始 偏移量结束节点结束偏移量

  3. 如果 originalStartNodeoriginalEndNode,并且它是一个 CharacterData 节点

    1. 使用 originalStartOffsetoriginalEndOffsetoriginalStartOffset 和空字符串替换数据 originalStartNode

    2. 返回。

  4. nodesToRemovethis 中所有被 包含节点的列表,按树顺序排列,并省略其父节点也被 包含this 中的任何 节点

  5. newNodenewOffset 为 null。

  6. 如果 originalStartNodeoriginalEndNode包含自身的祖先,则将 newNode 设置为 originalStartNode,并将 newOffset 设置为 originalStartOffset

  7. 否则:

    1. referenceNodeoriginalStartNode

    2. referenceNode父节点非 null,且不是 originalEndNode包含自身的祖先时:将 referenceNode 设置为 其父节点

    3. newNode 设置为 referenceNode父节点,并将 newOffset 设置为 referenceNode索引 + 1。

      如果 referenceNode父节点为 null, 它将是 this。这样 它将是 originalEndNode包含自身的祖先,因此我们不可能到达此 步骤。

  8. this起始位置结束位置设置为 (newNode, newOffset)。

  9. 如果 originalStartNode 是一个 CharacterData 节点,则 使用 originalStartOffsetoriginalStartNode长度originalStartOffset 和 空字符串替换 数据 originalStartNode

  10. 对于 nodesToRemove 中按树顺序排列的每个 node移除 node

  11. 如果 originalEndNode 是一个 CharacterData 节点,则 使用 0、originalEndOffset 和 空字符串替换 数据 originalEndNode

提取一个实时范围 range

  1. fragment 为在给定 range起始节点节点文档的情况下,创建 文档片段的结果。

  2. 如果 range折叠,则返回 fragment

  3. originalStartNodeoriginalStartOffsetoriginalEndNodeoriginalEndOffset 分别为 range起始节点起始 偏移量结束节点结束偏移量

  4. 如果 originalStartNodeoriginalEndNode,并且它是一个 CharacterData 节点

    1. cloneoriginalStartNode 的一个克隆

    2. clone数据设置为使用 originalStartOffsetoriginalEndOffsetoriginalStartOffset 截取数据子字符串 originalStartNode 的结果。

    3. clone 附加fragment

    4. 使用 originalStartOffsetoriginalEndOffsetoriginalStartOffset 和空字符串替换数据 originalStartNode

    5. 返回 fragment
  5. commonAncestorrange 获取公共 祖先的结果。

  6. firstPartiallyContainedChild 为 null。

  7. 如果 originalStartNode 不是 originalEndNode包含自身的 祖先,则将 firstPartiallyContainedChild 设置为 commonAncestor 中第一个在 range 中被 部分 包含子节点
  8. lastPartiallyContainedChild 为 null。

  9. 如果 originalEndNode 不是 originalStartNode包含自身的祖先,则将 lastPartiallyContainedChild 设置为 commonAncestor 中最后一个 在 range 中被 部分 包含子节点

    这些变量赋值实际上始终是有意义的。例如, 如果 originalStartNode 不是 originalEndNode包含自身的祖先originalStartNode 本身就在 range 中被 部分 包含,其所有祖先也都是如此,直到 commonAncestor 的一个子节点为止。 commonAncestor 不可能是 originalStartNode,因为它必须是 originalEndNode包含自身的祖先。另一种情况类似。此外, 请注意,如果两个子节点都有定义,它们永远不会相等。

  10. containedChildrencommonAncestor 中所有 在 range 中被包含子节点的列表,按 树 顺序排列。

  11. 如果 containedChildren 的任何成员是一个文档类型,则抛出一个 “HierarchyRequestErrorDOMException

    无需担心第一个或最后一个部分 包含的节点,因为文档类型永远不可能被 部分包含。它不能是范围的边界点,也 不可能是任何事物的祖先。

  12. newNodenewOffset 为 null。

  13. 如果 originalStartNodeoriginalEndNode包含自身的祖先,则将 newNode 设置为 originalStartNode,并将 newOffset 设置为 originalStartOffset

  14. 否则:

    1. referenceNodeoriginalStartNode

    2. referenceNode父节点非 null,且不是 originalEndNode包含自身的祖先时:将 referenceNode 设置为 其父节点

    3. newNode 设置为 referenceNode父节点,并将 newOffset 设置为 referenceNode索引 + 1。

      如果 referenceNode父节点为 null, 它将是 range。这样它将是 originalEndNode包含自身的祖先,因此我们不可能到达此 步骤。

  15. range起始位置结束位置设置为 (newNode, newOffset)。

  16. 如果 firstPartiallyContainedChild 是一个 CharacterData 节点

    在这种情况下,firstPartiallyContainedChildoriginalStartNode

    1. cloneoriginalStartNode 的一个克隆

    2. clone数据设置为使用 originalStartOffsetoriginalStartNode长度originalStartOffset 截取数据子字符串 originalStartNode 的结果。

    3. clone 附加fragment

    4. 使用 originalStartOffsetoriginalStartNode长度originalStartOffset 和 空字符串替换数据 originalStartNode

  17. 否则,如果 firstPartiallyContainedChild 非 null:

    1. clonefirstPartiallyContainedChild 的一个克隆

    2. clone 附加fragment

    3. subrange 为一个新的实时范围,其起始位置是 (originalStartNode, originalStartOffset),其结束位置是 (firstPartiallyContainedChild, firstPartiallyContainedChild长度)。

    4. subfragment提取 subrange 的结果。

    5. subfragment 附加clone
  18. 对于 containedChildren 中的每个 contained child:将 contained child 附加fragment

  19. 如果 lastPartiallyContainedChild 是一个 CharacterData 节点

    在这种情况下,lastPartiallyContainedChildoriginalEndNode

    1. cloneoriginalEndNode 的一个克隆

    2. clone数据设置为使用 0 和 originalEndOffset 截取数据子字符串 originalEndNode 的结果。

    3. clone 附加fragment

    4. 使用 0、originalEndOffset 和 空字符串替换数据 originalEndNode

  20. 否则,如果 lastPartiallyContainedChild 非 null:

    1. clonelastPartiallyContainedChild 的一个克隆

    2. clone 附加fragment

    3. subrange 为一个新的实时范围,其起始位置是 (lastPartiallyContainedChild, 0),其结束位置是 (originalEndNode, originalEndOffset)。

    4. subfragment提取 subrange 的结果。

    5. subfragment 附加clone

  21. 返回 fragment

extractContents() 方法步骤是返回this 提取的结果。

克隆内容 一个实时范围 range

  1. fragment 为在给定 range起始节点节点文档的情况下,创建 文档片段的结果。

  2. 如果 range折叠,则返回 fragment

  3. originalStartNodeoriginalStartOffsetoriginalEndNodeoriginalEndOffset 分别为 range起始节点起始 偏移量结束节点结束偏移量

  4. 如果 originalStartNodeoriginalEndNode,并且它是一个 CharacterData 节点

    1. cloneoriginalStartNode 的一个克隆

    2. clone数据设置为使用 originalStartOffsetoriginalEndOffsetoriginalStartOffset 截取数据子字符串 originalStartNode 的结果。

    3. clone 附加fragment

    4. 返回 fragment

  5. commonAncestorrange 获取公共 祖先的结果。

  6. firstPartiallyContainedChild 为 null。

  7. 如果 originalStartNode 不是 originalEndNode包含自身的祖先,则将 firstPartiallyContainedChild 设置为 commonAncestor 中第一个 在 range 中被 部分 包含子节点

  8. lastPartiallyContainedChild 为 null。

  9. 如果 originalEndNode 不是 originalStartNode包含自身的祖先,则将 lastPartiallyContainedChild 设置为 commonAncestor 中最后一个 在 range 中被 部分 包含子节点

    这些变量赋值实际上始终是有意义的。例如, 如果 originalStartNode 不是 originalEndNode包含自身的祖先originalStartNode 本身就在 range 中被 部分 包含,其所有祖先也都是如此,直到 commonAncestor 的一个子节点为止。 commonAncestor 不可能是 originalStartNode,因为它必须是 originalEndNode包含自身的祖先。另一种情况类似。此外, 请注意,如果两个子节点都有定义,它们永远不会相等。

  10. containedChildrencommonAncestor 中所有 在 range 中被包含子节点的列表,按 树 顺序排列。

  11. 如果 containedChildren 的任何成员是一个文档类型,则抛出一个 “HierarchyRequestErrorDOMException

    无需担心第一个或最后一个部分 包含的节点,因为文档类型永远不可能被 部分包含。它不能是范围的边界点,也 不可能是任何事物的祖先。

  12. 如果 firstPartiallyContainedChild 是一个 CharacterData 节点

    在这种情况下,firstPartiallyContainedChildoriginalStartNode

    1. cloneoriginalStartNode 的一个克隆

    2. clone数据设置为使用 originalStartOffsetoriginalStartNode长度originalStartOffset 截取数据子字符串 originalStartNode 的结果。

    3. clone 附加fragment

  13. 否则,如果 firstPartiallyContainedChild 非 null:

    1. clonefirstPartiallyContainedChild 的一个克隆

    2. clone 附加fragment

    3. subrange 为一个新的实时范围,其起始位置是 (originalStartNode, originalStartOffset),其结束位置是 (firstPartiallyContainedChild, firstPartiallyContainedChild长度)。

    4. subfragment克隆 内容 subrange 的结果。

    5. subfragment 附加clone

  14. 对于 containedChildren 中的每个 contained child

    1. clonecontained child 的一个克隆, 其中subtree 设置为 true。

    2. clone 附加fragment

  15. 如果 lastPartiallyContainedChild 是一个 CharacterData 节点

    在这种情况下,lastPartiallyContainedChildoriginalEndNode

    1. cloneoriginalEndNode 的一个克隆

    2. clone数据设置为使用 0 和 originalEndOffset 截取数据子字符串 originalEndNode 的结果。

    3. clone 附加fragment

  16. 否则,如果 lastPartiallyContainedChild 非 null:

    1. clonelastPartiallyContainedChild 的一个克隆

    2. clone 附加fragment

    3. subrange 为一个新的实时范围,其起始位置是 (lastPartiallyContainedChild, 0),其结束位置是 (originalEndNode, originalEndOffset)。

    4. subfragment克隆 内容 subrange 的结果。

    5. subfragment 附加clone

  17. 返回 fragment

cloneContents() 方法步骤是返回 this 克隆 内容的结果。

要将一个节点 node 插入到一个实时范围 range 中:

  1. 如果 range起始节点是一个 ProcessingInstructionComment 节点,是一个其父节点为 null 的 Text 节点,或者是 node,则抛出一个“HierarchyRequestErrorDOMException

  2. referenceNode 为 null。

  3. 如果 range起始节点是一个 Text 节点,则将 referenceNode 设置为该 Text 节点

  4. 否则,如果存在一个 range起始节点子节点,其索引range起始偏移量,则将 referenceNode 设置为该子节点; 否则设置为 null。

  5. 如果 referenceNode 为 null,则令 parentrange起始节点; 否则为 referenceNode父节点

  6. 给定 nodeparentreferenceNode 和 « »,确保预插入有效性

  7. 如果 range起始节点是一个 Text 节点,则使用 range起始偏移量拆分它,并将 referenceNode 设置为结果。

  8. 如果 nodereferenceNode,则将 referenceNode 设置为其 下一个同胞

  9. 如果 node父节点非 null,则移除 node

  10. 如果 referenceNode 为 null,则令 newOffsetparent长度; 否则为 referenceNode索引

  11. 如果 node 是一个 DocumentFragment 节点,则将 newOffset 增加 node长度;否则增加 1。

  12. node 预插入parent 中、位于 referenceNode 之前。

  13. 如果 range折叠,则将 range结束位置设置为 (parent, newOffset)。

insertNode(node) 方法步骤是将 node 插入this 中。

surroundContents(newParent) 方法 步骤 如下:

  1. 如果一个非 Text 节点this 中被部分包含,则抛出一个 “InvalidStateErrorDOMException

  2. 如果 newParent 是一个 DocumentDocumentTypeDocumentFragment 节点,则抛出一个“InvalidNodeTypeErrorDOMException

    由于历史原因,这里不会检查 CharacterData 节点, 它们最终会在稍后作为副作用抛出异常。

  3. fragment提取this 的结果。

  4. 如果 newParent子节点,则在 newParent 内用 null 全部替换

  5. newParent 插入this 中。

  6. fragment 附加newParent

  7. this选择 newParent

cloneRange() 方法步骤是返回一个新的 实时范围,其起始位置结束位置this 相同。

detach() 方法步骤是什么也不做。 其功能(禁用一个 Range 对象) 已被移除,但该方法本身 为了兼容性而保留。


position = range . comparePoint(node, offset)
如果该点位于范围之前,则返回 −1;如果该点 位于范围内,则返回 0;如果该点位于范围之后,则返回 1。
intersects = range . intersectsNode(node)
返回 range 是否与 node 相交。

isPointInRange(node, offset) 方法步骤如下:

  1. 如果 node不是this, 则返回 false。

  2. 如果 node 是一个文档类型,则抛出一个 “InvalidNodeTypeErrorDOMException

  3. 如果 offset 大于 node长度,则 抛出一个“IndexSizeErrorDOMException

  4. 如果 (node, offset) 位于 起始位置之前,或位于结束位置之后,则返回 false。

  5. 返回 true。

comparePoint(node, offset) 方法步骤如下:

  1. 如果 node不是this, 则抛出一个“WrongDocumentErrorDOMException

  2. 如果 node 是一个文档类型,则抛出一个 “InvalidNodeTypeErrorDOMException

  3. 如果 offset 大于 node长度,则 抛出一个“IndexSizeErrorDOMException

  4. 如果 (node, offset) 位于 起始位置之前,则返回 −1。

  5. 如果 (node, offset) 位于 结束位置之后,则 返回 1。

  6. 返回 0。


intersectsNode(node) 方法步骤如下:

  1. 如果 node不是this, 则返回 false。

  2. parentnode父节点

  3. 如果 parent 为 null,则返回 true。

  4. offsetnode索引

  5. 如果 (parent, offset) 位于 结束位置之前,并且 (parent, offset + 1) 位于 起始位置之后,则返回 true。

  6. 返回 false。


字符串化行为必须运行 以下步骤:

  1. string 为空字符串。

  2. 如果 this起始节点this结束节点,并且 它是一个 Text 节点,则返回 该 Text 节点数据 中从this起始偏移量开始,到 this结束偏移量结束的子字符串。

  3. 如果 this起始节点是一个 Text 节点,则将 该节点数据中从this起始偏移量到末尾的子字符串附加到 string

  4. 将所有在this 中被包含Text 节点数据树 顺序进行串联,并附加到 string

  5. 如果 this结束节点是一个 Text 节点,则 将该节点数据中从开头到 this结束偏移量的子字符串附加到 string

  6. 返回 string


createContextualFragment()getClientRects()getBoundingClientRect() 方法在其他规范中定义。 [DOM-Parsing] [CSSOM-VIEW]

6. 遍历

NodeIteratorTreeWalker 对象可用于筛选和遍历节点

每个 NodeIteratorTreeWalker 对象都有一个关联的布尔值 处于活动状态,以避免递归调用。其 初始值为 false。

每个 NodeIteratorTreeWalker 对象还有一个关联的 (一个节点)、一个 whatToShow(一个位掩码),以及一个 筛选器(一个回调)。

要在 一个 NodeIteratorTreeWalker 对象 traverser筛选一个节点 node

  1. 如果 traverser处于活动状态为 true,则抛出一个 “InvalidStateErrorDOMException

  2. nnodenodeType 属性值 − 1。

  3. 如果 traverserwhatToShow 的第 n(其中 0 是最低有效位)未设置,则返回 FILTER_SKIP

  4. 如果 traverser筛选器为 null,则返回 FILTER_ACCEPT

  5. traverser处于活动状态设置为 true。

  6. result 为使用 traverser筛选器、“acceptNode”和 « node » 调用用户对象操作的返回值。如果此操作抛出异常,则将 traverser处于活动状态设置为 false,并重新抛出该异常。

  7. traverser处于活动状态设置为 false。

  8. 返回 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 和一个节点 toBeRemovedNodeNodeIterator 预移除步骤 如下:

  1. nodeIterator引用设置为在给定 nodeIterator引用nodeIteratortoBeRemovedNode 的情况下,调整节点指针的结果。

  2. 如果 nodeIterator候选引用非 null,则将 nodeIterator候选引用设置为在给定 nodeIterator候选引用nodeIteratortoBeRemovedNode 的情况下,调整节点指针的结果。


要在给定一个节点指针 nodePointer、一个 NodeIterator 对象 nodeIterator 和一个节点 toBeRemovedNode 的情况下,调整节点指针,执行以下步骤。它们返回一个节点指针

  1. 如果 toBeRemovedNode 不是 nodePointer节点包含自身的祖先,或者 toBeRemovedNodenodeIterator包含自身的祖先,则 返回 nodePointer

  2. 如果 nodePointer指针在前为 true:

    1. nexttoBeRemovedNode 之后第一个 既是 nodeIterator包含自身的后代,又不是 toBeRemovedNode包含自身的后代后续 节点(如果存在这样的节点);否则为 null。

    2. 如果 next 非 null,则返回 (next, true)。

  3. 如果 toBeRemovedNode前一个同胞为 null,则令 newNodetoBeRemovedNode父节点;否则为 toBeRemovedNode前一个同胞中,在树顺序中最后出现的 包含自身的后代

  4. 返回 (newNode, false)。


root 获取器步骤是返回 this

referenceNode 获取器步骤是返回 this引用节点

pointerBeforeReferenceNode 获取器步骤 是返回 this引用指针在前

whatToShow 获取器步骤是返回 thiswhatToShow

filter 获取器步骤是返回 this筛选器

遍历,给定一个 NodeIterator 对象 iterator 和值为“next”或“previous”的 type

  1. iterator候选引用设置为 iterator引用

  2. result 为 null。

  3. 当 true 时:

    1. 如果 type 是“next”:

      1. 如果 iterator候选引用指针在前为 false:

        1. following 为在 iterator迭代器集合中, iterator候选 引用节点之后第一个后续节点。如果 不存在这样的 节点,则中断

        2. iterator候选 引用设置为 (following, false)。

      2. 否则,将 iterator候选引用设置为 (iterator候选引用节点, false)。

    2. 否则:

      1. 如果 iterator候选引用指针在前为 true:

        1. preceding 为在 iterator迭代器集合中, iterator候选 引用节点之前第一个先前节点。如果 不存在这样的 节点,则中断

        2. iterator候选 引用设置为 (preceding, true)。

      2. 否则,将 iterator候选引用设置为 (iterator候选引用节点, true)。

    3. nodeiterator候选引用节点

    4. filterResult 为在 iterator筛选 node 的结果。如果此操作抛出异常,则将 iterator候选引用设置为 null,并 重新抛出该异常。

    5. 如果 filterResultFILTER_ACCEPT

      1. iterator引用设置为 iterator候选引用

      2. result 设置为 node

      3. 中断

  4. iterator候选引用设置为 null。

  5. 返回 result

nextNode() 方法步骤是返回使用this 和“next”进行遍历的结果。

previousNode() 方法步骤是返回使用this 和 “previous”进行遍历的结果。

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筛选器

root 获取器步骤是返回 this

whatToShow 获取器步骤是返回 thiswhatToShow

filter 获取器步骤是返回 this筛选器

currentNode 获取器步骤是返回 this当前节点

currentNode 设置器步骤是将 this当前节点设置为 给定值。


parentNode() 方法步骤如下:

  1. nodethis当前节点

  2. node 非 null 且不是 this时:

    1. node 设置为 node父节点

    2. 如果 node 非 null,且在 this筛选 node 返回 FILTER_ACCEPT, 则将 this当前节点设置为 node,并返回 node

  3. 返回 null。

遍历子节点,给定一个 TreeWalker 对象 walker 和值为“first”或“last”的 type

  1. nodewalker当前节点

  2. 如果 type 是 “first”,则将 node 设置为 node第一个子节点;否则设置为 node最后一个子节点

  3. node 非 null 时:

    1. result 为在 walker筛选 node 的结果。

    2. 如果 resultFILTER_ACCEPT, 则将 walker当前节点设置为 node,并返回 node

    3. 如果 resultFILTER_SKIP

      1. 如果 type 是“first”,则令 childnode第一个子节点;否则为 node最后一个 子节点

      2. 如果 child 非 null,则将 node 设置为 child,并 继续

    4. node 非 null 时:

      1. 如果 type 是“first”,则令 siblingnode下一个同胞;否则为 node前一个同胞

      2. 如果 sibling 非 null,则将 node 设置为 sibling,并 中断

      3. parentnode父节点

      4. 如果 parent 为 null、walker,或 walker当前节点,则返回 null。

      5. node 设置为 parent

  4. 返回 null。

firstChild() 方法步骤是使用this 和“first遍历子节点

lastChild() 方法步骤是使用this 和“last遍历子节点

遍历 同胞,给定一个 TreeWalker 对象 walker 和值为“next”或“previous”的 type

  1. nodewalker当前节点

  2. 如果 node,则返回 null。

  3. 当 true 时:

    1. 如果 type 是“next”,则令 siblingnode下一个 同胞;否则为 node前一个同胞

    2. sibling 非 null 时:

      1. node 设置为 sibling

      2. result 为在 walker筛选 node 的结果。

      3. 如果 resultFILTER_ACCEPT, 则将 walker当前节点设置为 node,并返回 node

      4. 如果 type 是“next”,则将 sibling 设置为 node第一个子节点;否则设置为 node最后一个子节点

      5. 如果 resultFILTER_REJECTsibling 为 null,则 如果 type 是“next”,将 sibling 设置为 node下一个同胞;否则设置为 node前一个同胞

    3. node 设置为 node父节点

    4. 如果 node 为 null 或为 walker,则返回 null。

    5. 如果在 walker筛选 node 的返回值是 FILTER_ACCEPT, 则返回 null。

nextSibling() 方法步骤是使用this 和“next遍历同胞

previousSibling() 方法步骤是使用this 和 “previous遍历同胞

previousNode() 方法步骤如下:

  1. nodethis当前节点

  2. node 不是 this时:

    1. siblingnode前一个同胞

    2. sibling 非 null 时:

      1. node 设置为 sibling

      2. result 为在 this筛选 node 的结果。

      3. result 不是 FILTER_REJECTnode 有一个 子节点时:

        1. node 设置为 node最后一个子节点

        2. result 设置为在 this筛选 node 的结果。

      4. 如果 resultFILTER_ACCEPT, 则将 this当前节点设置为 node,并返回 node

      5. sibling 设置为 node前一个同胞

    3. 如果 nodethis,或 node父节点为 null,则返回 null。

    4. node 设置为 node父节点

    5. 如果在 this筛选 node 的返回值是 FILTER_ACCEPT, 则将 this当前节点设置为 node,并返回 node

  3. 返回 null。

nextNode() 方法步骤如下:

  1. nodethis当前节点

  2. resultFILTER_ACCEPT

  3. 当 true 时:

    1. result 不是 FILTER_REJECTnode 有一个 子节点时:

      1. node 设置为其第一个子节点

      2. result 设置为在 this筛选 node 的结果。

      3. 如果 resultFILTER_ACCEPT, 则将 this当前节点设置为 node,并返回 node

    2. sibling 为 null。

    3. temporarynode

    4. temporary 非 null 时:

      1. 如果 temporarythis,则返回 null。

      2. sibling 设置为 temporary下一个同胞

      3. 如果 sibling 非 null,则中断

      4. temporary 设置为 temporary父节点

    5. 如果 sibling 为 null,则返回 null。

    6. node 设置为 sibling

    7. result 设置为在 this筛选 node 的结果。

    8. 如果 resultFILTER_ACCEPT, 则将 this当前节点设置为 node,并返回 node

6.3. 接口 NodeFilter

[Exposed=Window]
callback interface NodeFilter {
  // Constants for acceptNode()
  const unsigned short FILTER_ACCEPT = 1;
  const unsigned short FILTER_REJECT = 2;
  const unsigned short FILTER_SKIP = 3;

  // Constants for whatToShow
  const 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 SHOW_ENTITY_REFERENCE = 0x10; // legacy
  const unsigned long SHOW_ENTITY = 0x20; // legacy
  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 SHOW_NOTATION = 0x800; // legacy

  unsigned short acceptNode(Node node);
};

NodeFilter 对象可以用作 filter 用于 NodeIteratorTreeWalker 对象, 并且为它们的 whatToShow 位掩码提供常量。 NodeFilter 对象通常实现为 JavaScript 函数。

这些常量可用作 过滤器 的返回值:

这些常量可用于 whatToShow

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验证步骤如下:

  1. 如果 set元素属性名称未定义支持的标记,则 抛出一个 TypeError

  2. lowercaseTokentokenASCII 小写形式。

  3. 如果 lowercaseToken 存在于 set元素属性 名称支持的标记 中,则 返回 true。

  4. 返回 false。

一个 DOMTokenList 对象 set更新步骤如下:

  1. 如果在给定 null、set属性名称set元素的情况下,按命名空间和 本地名称获取属性 返回 null,并且 set标记集合为空,则返回。

  2. 在给定 set元素set属性名称,以及为 set标记 集合运行有序集合序列化器的结果的情况下,设置属性值

一个 DOMTokenList 对象 set序列化步骤是返回在给定 set元素set属性名称的情况下运行获取属性值的结果。


一个 DOMTokenList 对象 setset元素具有以下属性更改步骤

  1. 如果 localNameset属性 名称namespace 为 null,并且 value 为 null,则清空 标记 集合

  2. 否则,如果 localNameset属性名称,并且 namespace 为 null,则将 set标记 集合设置为经解析value

当一个 DOMTokenList 对象 set 被创建时:

  1. elementset元素

  2. attributeNameset属性 名称

  3. value 为在给定 elementattributeName 的情况下,获取属性值的结果。

  4. elementattributeNamevaluevalue 和 null 运行属性更改步骤

tokenlist . length

返回标记的数量。

tokenlist . item(index)
tokenlist[index]

返回索引为 index 的标记。

tokenlist . contains(token)

如果 token 存在,则返回 true;否则返回 false。

tokenlist . add(tokens…)

添加传入的所有参数,但已存在的参数除外。

如果其中一个参数是空 字符串,则抛出一个“SyntaxErrorDOMException

如果其中一个参数 包含任何ASCII 空白,则抛出一个“InvalidCharacterErrorDOMException

tokenlist . remove(tokens…)

如果传入的参数存在,则移除它们。

如果其中一个参数是空 字符串,则抛出一个“SyntaxErrorDOMException

如果其中一个参数 包含任何ASCII 空白,则抛出一个“InvalidCharacterErrorDOMException

tokenlist . toggle(token [, force])

如果未给出 force,则“切换”token:存在时将其移除, 不存在时将其添加。如果 force 为 true,则添加 token (与 add() 相同)。 如果 force 为 false,则移除 token(与 remove() 相同)。

如果 token 现在存在,则返回 true;否则返回 false。

如果 token 为空,则抛出一个“SyntaxErrorDOMException

如果 token 包含 任何空格,则抛出一个“InvalidCharacterErrorDOMException

tokenlist . replace(token, newToken)

newToken 替换 token

如果 token 已被 newToken 替换,则返回 true;否则返回 false。

如果其中一个参数是空 字符串,则抛出一个“SyntaxErrorDOMException

如果其中一个参数 包含任何ASCII 空白,则抛出一个“InvalidCharacterErrorDOMException

tokenlist . supports(token)

如果 token 位于关联属性支持的标记中,则返回 true。否则返回 false。

如果关联属性未定义支持的标记,则抛出一个 TypeError

tokenlist . value

以字符串形式返回关联的集合。

可以设置该值,以更改关联属性。

length 获取器步骤是返回 this标记集合大小

该对象的支持的属性索引是从零到该对象的 标记集合大小 − 1 范围内的数字,除非标记集合 为 空, 在这种情况下,不存在支持的属性索引

item(index) 方法步骤如下:

  1. 如果 index 大于或等于 this标记 集合大小,则返回 null。

  2. 返回 this标记集合[index]。

contains(token) 方法步骤是: 如果 this标记集合[token] 存在,则返回 true;否则 返回 false。

add(tokens…) 方法步骤如下:

  1. 对于 tokens 中的每个 token

    1. 如果 token 是空字符串,则抛出 一个“SyntaxErrorDOMException

    2. 如果 token 包含任何ASCII 空白,则抛出 一个 “InvalidCharacterErrorDOMException

  2. 对于 tokens 中的每个 token:将 token 附加this标记集合

  3. 运行更新 步骤

remove(tokens…) 方法步骤如下:

  1. 对于 tokens 中的每个 token

    1. 如果 token 是空字符串,则抛出 一个“SyntaxErrorDOMException

    2. 如果 token 包含任何ASCII 空白,则抛出 一个 “InvalidCharacterErrorDOMException

  2. 对于 tokens 中的每个 token:从 this标记集合移除 token

  3. 运行更新步骤

toggle(token, force) 方法步骤如下:

  1. 如果 token 是空字符串,则抛出一个 “SyntaxErrorDOMException

  2. 如果 token 包含任何ASCII 空白,则抛出一个 “InvalidCharacterErrorDOMException

  3. 如果 this标记集合[token] 存在

    1. 如果未给出 force 或其为 false,则从 this标记集合移除 token,运行更新步骤并 返回 false。

    2. 返回 true。

  4. 否则,如果未给出 force 或其为 true,则将 token 附加this标记集合,运行更新步骤,并返回 true。

  5. 返回 false。

为了 Web 兼容性,toggle() 并不总是运行更新步骤

replace(token, newToken) 方法步骤如下:

  1. 如果 tokennewToken 中任一个是空字符串,则抛出一个 “SyntaxErrorDOMException

  2. 如果 tokennewToken 中任一个包含任何ASCII 空白,则 抛出一个“InvalidCharacterErrorDOMException

  3. 如果 this标记集合包含 token,则 返回 false。

  4. this标记 集合中,用 newToken 替换 token

  5. 运行更新步骤

  6. 返回 true。

为了 Web 兼容性,replace() 并不总是运行更新步骤

supports(token) 方法步骤如下:

  1. result 为使用 token 调用验证步骤的返回值。

  2. 返回 result

value 获取器步骤是返回运行 this序列化步骤的结果。

value 设置器步骤是使用 this属性名称和给定值,为this元素设置属性值

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 ANY_TYPE = 0;
  const unsigned short NUMBER_TYPE = 1;
  const unsigned short STRING_TYPE = 2;
  const unsigned short BOOLEAN_TYPE = 3;
  const unsigned short UNORDERED_NODE_ITERATOR_TYPE = 4;
  const unsigned short ORDERED_NODE_ITERATOR_TYPE = 5;
  const unsigned short UNORDERED_NODE_SNAPSHOT_TYPE = 6;
  const unsigned short ORDERED_NODE_SNAPSHOT_TYPE = 7;
  const unsigned short ANY_UNORDERED_NODE_TYPE = 8;
  const unsigned short FIRST_ORDERED_NODE_TYPE = 9;

  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 XPathExpression {
  // XPathResult.ANY_TYPE = 0
  XPathResult evaluate(Node contextNode, optional unsigned short type = 0, 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 nodeResolver); // legacy
  // XPathResult.ANY_TYPE = 0
  XPathResult evaluate(DOMString expression, Node contextNode, optional XPathNSResolver? resolver = null, optional unsigned short type = 0, 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. 历史

此标准曾包含多个已被移除的接口和接口成员。

这些接口已被移除:

这些接口成员已被移除:

Attr
  • schemaTypeInfo
  • isId
Document
  • createEntityReference()
  • xmlEncoding
  • xmlStandalone
  • xmlVersion
  • strictErrorChecking
  • domConfig
  • normalizeDocument()
  • renameNode()
DocumentType
  • entities
  • notations
  • internalSubset
DOMImplementation
  • getFeature()
Element
  • schemaTypeInfo
  • setIdAttribute()
  • setIdAttributeNS()
  • setIdAttributeNode()
Node
  • isSupported
  • getFeature()
  • getUserData()
  • setUserData()
NodeIterator
  • expandEntityReferences
Text
  • isElementContentWhitespace
  • replaceWholeText()
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])的实质性贡献。

知识产权

自定义元素相关的集成点的部分修订历史可以在 w3c/webcomponents 代码库中找到,该代码库根据 W3C 软件和文档许可证提供。

版权所有 © WHATWG (Apple, Google, Mozilla, Microsoft)。本作品根据知识共享署名 4.0 国际许可协议进行许可。如果其部分内容被整合到源代码中,则源代码中的这些部分将根据 BSD 3-Clause 许可证进行许可。

这是现行标准。那些对专利审查版本感兴趣的人应该查看现行标准审查草案

索引

本规范定义的术语

由引用定义的术语

参考文献

规范性引用

[CONSOLE]
Dominic Farolino;Robert Kowalski;Terin Stock。控制台标准。Living Standard。URL:https://console.spec.whatwg.org/
[DEVICE-ORIENTATION]
Reilly Grant;Marcos Caceres。设备方向与运动。URL:https://w3c.github.io/deviceorientation/
[ECMASCRIPT]
ECMAScript 语言规范。URL:https://tc39.es/ecma262/multipage/
[ENCODING]
Anne van Kesteren。编码标准。Living Standard。URL:https://encoding.spec.whatwg.org/
[HR-TIME-3]
Yoav Weiss。高精度时间。URL:https://w3c.github.io/hr-time/
[HTML]
Anne van Kesteren;等。HTML 标准。Living Standard。URL:https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren;Domenic Denicola。底层标准。Living Standard。URL:https://infra.spec.whatwg.org/
[LONG-ANIMATION-FRAMES]
Noam Rosenthal. 长动画帧 API。URL:https://w3c.github.io/long-animation-frames/
[POINTEREVENTS3]
Patrick Lauke;Robert Flack。指针事件。URL:https://w3c.github.io/pointerevents/
[SELECTORS4]
Elika Etemad;Tab Atkins Jr.。选择器等级4。URL:https://drafts.csswg.org/selectors/
[SERVICE-WORKERS]
Monica CHINTALA;Yoshisato Yanagisawa。Service Worker Nightly。URL:https://w3c.github.io/ServiceWorker/
[TOUCH-EVENTS]
Doug Schepers;等。触摸事件。URL:https://w3c.github.io/touch-events/
[TRUSTED-TYPES]
Krzysztof Kotowicz。可信类型。URL:https://w3c.github.io/trusted-types/dist/spec/
[UIEVENTS]
Xiaoqian Wu。用户界面事件。URL:https://w3c.github.io/uievents/
[URL]
Anne van Kesteren。URL 标准。Living Standard。URL:https://url.spec.whatwg.org/
[WEBIDL]
Edgar Chen;Timothy Gu。Web IDL 标准。Living Standard。URL:https://webidl.spec.whatwg.org/
[XML]
Tim Bray;等。可扩展标记语言(XML)1.0(第五版)。2008年11月26日。REC。URL:https://www.w3.org/TR/xml/
[XML-NAMES]
Tim Bray;等。XML 1.0 命名空间(第三版)。2009年12月8日。REC。URL:https://www.w3.org/TR/xml-names/
[XML-STYLESHEET]
James Clark; Simon Pieters; Henry Thompson. 将样式表与 XML 文档 1.0 关联 (第二版). 2010 年 10 月 28 日. REC. URL:https://www.w3.org/TR/xml-stylesheet/

信息性引用

[CSSOM-VIEW]
Simon Fraser; Emilio Cobos Álvarez. CSSOM 视图模块(CSSOM View Module). URL: https://drafts.csswg.org/cssom-view/
[DOM-Level-3-XPath]
Ray Whitmer. 文档对象模型(DOM)第 3 级 XPath 规范(Document Object Model (DOM) Level 3 XPath Specification). 2020 年 11 月 3 日. NOTE. URL: https://www.w3.org/TR/DOM-Level-3-XPath/
[DOM-Parsing]
Travis Leithead. DOM 解析与序列化(DOM Parsing and Serialization). URL: https://w3c.github.io/DOM-Parsing/
[FULLSCREEN]
Philip Jägenstedt. 全屏 API 标准(Fullscreen API Standard). Living Standard. URL: https://fullscreen.spec.whatwg.org/
[INDEXEDDB]
Nikunj Mehta; et al. 索引数据库 API(Indexed Database API). URL: https://w3c.github.io/IndexedDB/
[XPath]
James Clark; Steven DeRose. XML 路径语言(XPath) 1.0 版(Version 1.0). 1999 年 11 月 16 日. REC. URL: https://www.w3.org/TR/xpath-10/
[XSLT]
James Clark. XSL 转换(XSLT) 1.0 版(XSL Transformations (XSLT) Version 1.0). 1999 年 11 月 16 日. REC. URL: https://www.w3.org/TR/xslt-10/

IDL 索引

[Exposed=*]
interface Event {
  constructor(DOMString type, optional EventInit eventInitDict = {});

  readonly attribute DOMString type;
  readonly attribute EventTarget? target;
  readonly attribute EventTarget? srcElement; // legacy
  readonly 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;  // legacy
  undefined 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;
};

partial interface Window {
  [Replaceable] readonly attribute (Event or undefined) event; // legacy
};

[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;
};

[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;
};

[Exposed=*]
interface AbortController {
  constructor();

  [SameObject] readonly attribute AbortSignal signal;

  undefined abort(optional any reason);
};

[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;
};
interface mixin NonElementParentNode {
  Element? getElementById(DOMString elementId);
};
Document includes NonElementParentNode;
DocumentFragment includes NonElementParentNode;

interface mixin DocumentOrShadowRoot {
  readonly attribute CustomElementRegistry? customElementRegistry;
};
Document includes DocumentOrShadowRoot;
ShadowRoot includes DocumentOrShadowRoot;

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;

interface mixin NonDocumentTypeChildNode {
  readonly attribute Element? previousElementSibling;
  readonly attribute Element? nextElementSibling;
};
Element includes NonDocumentTypeChildNode;
CharacterData includes NonDocumentTypeChildNode;

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;

interface mixin Slottable {
  readonly attribute HTMLSlotElement? assignedSlot;
};
Element includes Slottable;
Text includes Slottable;

[Exposed=Window]
interface NodeList {
  getter Node? item(unsigned long index);
  readonly attribute unsigned long length;
  iterable<Node>;
};

[Exposed=Window, LegacyUnenumerableNamedProperties]
interface HTMLCollection {
  readonly attribute unsigned long length;
  getter Element? item(unsigned long index);
  getter Element? namedItem(DOMString name);
};

[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;
};

[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;
};

[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 ENTITY_REFERENCE_NODE = 5; // legacy
  const unsigned short ENTITY_NODE = 6; // legacy
  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 NOTATION_NODE = 12; // legacy
  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? otherNode); // legacy alias of ===

  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;
};

[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 .characterSet
  readonly attribute DOMString inputEncoding; // legacy alias of .characterSet
  readonly 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 interface); // legacy

  [NewObject] Range createRange();

  // NodeFilter.SHOW_ALL = 0xFFFFFFFF
  [NewObject] NodeIterator createNodeIterator(Node root, optional unsigned long whatToShow = 0xFFFFFFFF, optional NodeFilter? filter = null);
  [NewObject] TreeWalker createTreeWalker(Node root, optional unsigned long whatToShow = 0xFFFFFFFF, optional NodeFilter? filter = null);
};

[Exposed=Window]
interface XMLDocument : Document {};

dictionary ElementCreationOptions {
  CustomElementRegistry? customElementRegistry;
  DOMString is;
};

dictionary ImportNodeOptions {
  CustomElementRegistry customElementRegistry;
  boolean selfOnly = false;
};

[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
};

[Exposed=Window]
interface DocumentType : Node {
  readonly attribute DOMString name;
  readonly attribute DOMString publicId;
  readonly attribute DOMString systemId;
};

[Exposed=Window]
interface DocumentFragment : Node {
  constructor();
};

[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" };

[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 selectors); // legacy alias of .matches

  HTMLCollection getElementsByTagName(DOMString qualifiedName);
  HTMLCollection getElementsByTagNameNS(DOMString? namespace, DOMString localName);
  HTMLCollection getElementsByClassName(DOMString classNames);

  [CEReactions] Element? insertAdjacentElement(DOMString where, Element element); // legacy
  undefined insertAdjacentText(DOMString where, DOMString data); // legacy
};

dictionary ShadowRootInit {
  required ShadowRootMode mode;
  boolean delegatesFocus = false;
  SlotAssignmentMode slotAssignment = "named";
  boolean clonable = false;
  boolean serializable = false;
  CustomElementRegistry? customElementRegistry;
};

[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);
};

[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
};
[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);
};

[Exposed=Window]
interface Text : CharacterData {
  constructor(optional DOMString data = "");

  [NewObject] Text splitText(unsigned long offset);
  readonly attribute DOMString wholeText;
};

[Exposed=Window]
interface CDATASection : Text {
};
[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);
};
[Exposed=Window]
interface Comment : CharacterData {
  constructor(optional DOMString data = "");
};

[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;
};

dictionary StaticRangeInit {
  required Node startContainer;
  required unsigned long startOffset;
  required Node endContainer;
  required unsigned long endOffset;
};

[Exposed=Window]
interface StaticRange : AbstractRange {
  constructor(StaticRangeInit init);
};

[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 START_TO_START = 0;
  const unsigned short START_TO_END = 1;
  const unsigned short END_TO_END = 2;
  const unsigned short END_TO_START = 3;
  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;
};

[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();
};

[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();
};
[Exposed=Window]
callback interface NodeFilter {
  // Constants for acceptNode()
  const unsigned short FILTER_ACCEPT = 1;
  const unsigned short FILTER_REJECT = 2;
  const unsigned short FILTER_SKIP = 3;

  // Constants for whatToShow
  const 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 SHOW_ENTITY_REFERENCE = 0x10; // legacy
  const unsigned long SHOW_ENTITY = 0x20; // legacy
  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 SHOW_NOTATION = 0x800; // legacy

  unsigned short acceptNode(Node node);
};

[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>;
};

[Exposed=Window]
interface XPathResult {
  const unsigned short ANY_TYPE = 0;
  const unsigned short NUMBER_TYPE = 1;
  const unsigned short STRING_TYPE = 2;
  const unsigned short BOOLEAN_TYPE = 3;
  const unsigned short UNORDERED_NODE_ITERATOR_TYPE = 4;
  const unsigned short ORDERED_NODE_ITERATOR_TYPE = 5;
  const unsigned short UNORDERED_NODE_SNAPSHOT_TYPE = 6;
  const unsigned short ORDERED_NODE_SNAPSHOT_TYPE = 7;
  const unsigned short ANY_UNORDERED_NODE_TYPE = 8;
  const unsigned short FIRST_ORDERED_NODE_TYPE = 9;

  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);
};

[Exposed=Window]
interface XPathExpression {
  // XPathResult.ANY_TYPE = 0
  XPathResult evaluate(Node contextNode, optional unsigned short type = 0, optional XPathResult? result = null);
};

callback interface XPathNSResolver {
  DOMString? lookupNamespaceURI(DOMString? prefix);
};

interface mixin XPathEvaluatorBase {
  [NewObject] XPathExpression createExpression(DOMString expression, optional XPathNSResolver? resolver = null);
  Node createNSResolver(Node nodeResolver); // legacy
  // XPathResult.ANY_TYPE = 0
  XPathResult evaluate(DOMString expression, Node contextNode, optional XPathNSResolver? resolver = null, optional unsigned short type = 0, optional XPathResult? result = null);
};
Document includes XPathEvaluatorBase;

[Exposed=Window]
interface XPathEvaluator {
  constructor();
};

XPathEvaluator includes XPathEvaluatorBase;

[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();
};

MDN

AbortController/AbortController

In all current engines.

Firefox57+Safari12.1+Chrome66+
Opera?Edge79+
Edge (Legacy)16+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js15.0.0+

AbortController/abort

In all current engines.

Firefox57+Safari12.1+Chrome66+
Opera?Edge79+
Edge (Legacy)16+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js15.0.0+
MDN

AbortController/signal

In all current engines.

Firefox57+Safari12.1+Chrome66+
Opera?Edge79+
Edge (Legacy)16+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js15.0.0+
MDN

AbortController

In all current engines.

Firefox57+Safari12.1+Chrome66+
Opera?Edge79+
Edge (Legacy)16+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js15.0.0+
MDN

AbortSignal/abort_event

In all current engines.

Firefox57+Safari11.1+Chrome66+
Opera?Edge79+
Edge (Legacy)16+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js15.0.0+
MDN

AbortSignal/abort_event

In all current engines.

Firefox57+Safari11.1+Chrome66+
Opera?Edge79+
Edge (Legacy)16+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js15.0.0+
MDN

AbortSignal/abort_static

In all current engines.

Firefox88+Safari15+Chrome93+
Opera?Edge93+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js15.12.0+
MDN

AbortSignal/aborted

In all current engines.

Firefox57+Safari11.1+Chrome66+
Opera?Edge79+
Edge (Legacy)16+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js15.0.0+
MDN

AbortSignal/reason

In all current engines.

Firefox97+Safari15.4+Chrome98+
Opera?Edge98+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js17.2.0+
MDN

AbortSignal/throwIfAborted

In all current engines.

Firefox97+Safari15.4+Chrome100+
Opera?Edge100+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js17.3.0+
MDN

AbortSignal/timeout_static

In all current engines.

Firefox100+Safari16+Chrome103+
Opera?Edge103+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js17.3.0+
MDN

AbortSignal

In all current engines.

Firefox57+Safari11.1+Chrome66+
Opera?Edge79+
Edge (Legacy)16+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js15.0.0+
MDN

AbstractRange/collapsed

In all current engines.

Firefox69+Safari14.1+Chrome90+
Opera?Edge90+
Edge (Legacy)NoneIENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Range/collapsed

In all current engines.

Firefox1+Safari1+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+

StaticRange/collapsed

In all current engines.

Firefox69+Safari10.1+Chrome60+
Opera?Edge79+
Edge (Legacy)18IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AbstractRange/endContainer

In all current engines.

Firefox69+Safari14.1+Chrome90+
Opera?Edge90+
Edge (Legacy)NoneIENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Range/endContainer

In all current engines.

Firefox1+Safari1+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+

StaticRange/endContainer

In all current engines.

Firefox69+Safari10.1+Chrome60+
Opera?Edge79+
Edge (Legacy)18IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AbstractRange/endOffset

In all current engines.

Firefox69+Safari14.1+Chrome90+
Opera?Edge90+
Edge (Legacy)NoneIENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Range/endOffset

In all current engines.

Firefox1+Safari1+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+

StaticRange/endOffset

In all current engines.

Firefox69+Safari10.1+Chrome60+
Opera?Edge79+
Edge (Legacy)18IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AbstractRange/startContainer

In all current engines.

Firefox69+Safari14.1+Chrome90+
Opera?Edge90+
Edge (Legacy)NoneIENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Range/startContainer

In all current engines.

Firefox1+Safari1+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+

StaticRange/startContainer

In all current engines.

Firefox69+Safari10.1+Chrome60+
Opera?Edge79+
Edge (Legacy)18IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AbstractRange/startOffset

In all current engines.

Firefox69+Safari14.1+Chrome90+
Opera?Edge90+
Edge (Legacy)NoneIENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Range/startOffset

In all current engines.

Firefox1+Safari1+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+

StaticRange/startOffset

In all current engines.

Firefox69+Safari10.1+Chrome60+
Opera?Edge79+
Edge (Legacy)18IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AbstractRange

In all current engines.

Firefox69+Safari14.1+Chrome90+
Opera?Edge90+
Edge (Legacy)NoneIENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Attr/localName

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Attr/name

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE6+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Attr/namespaceURI

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Attr/ownerElement

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE8+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Attr/prefix

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Attr/value

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE6+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Attr

In all current engines.

Firefox1+Safari1+Chrome1+
Opera8+Edge79+
Edge (Legacy)12+IE5.5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

CDATASection

In all current engines.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

CharacterData/after

In all current engines.

Firefox49+Safari10+Chrome54+
Opera39+Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

DocumentType/after

In all current engines.

Firefox49+Safari10+Chrome54+
Opera39+Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Element/after

In all current engines.

Firefox49+Safari10+Chrome54+
Opera39+Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

CharacterData/appendData

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE6+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

CharacterData/before

In all current engines.

Firefox49+Safari10+Chrome54+
Opera39+Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

DocumentType/before

In all current engines.

Firefox49+Safari10+Chrome54+
Opera39+Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Element/before

In all current engines.

Firefox49+Safari10+Chrome54+
Opera39+Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

CharacterData/data

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

CharacterData/deleteData

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE6+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

CharacterData/insertData

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE6+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

CharacterData/length

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

CharacterData/nextElementSibling

In all current engines.

Firefox25+Safari9+Chrome29+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Element/nextElementSibling

In all current engines.

Firefox3.5+Safari4+Chrome2+
Opera10+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile10.1+
MDN

CharacterData/previousElementSibling

In all current engines.

Firefox25+Safari9+Chrome29+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Element/previousElementSibling

In all current engines.

Firefox3.5+Safari4+Chrome2+
Opera10+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile10.1+
MDN

CharacterData/remove

In all current engines.

Firefox23+Safari7+Chrome24+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

DocumentType/remove

In all current engines.

Firefox23+Safari7+Chrome24+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Element/remove

In all current engines.

Firefox23+Safari7+Chrome24+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

CharacterData/replaceData

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE6+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

CharacterData/replaceWith

In all current engines.

Firefox49+Safari10+Chrome54+
Opera39+Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

DocumentType/replaceWith

In all current engines.

Firefox49+Safari10+Chrome54+
Opera39+Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Element/replaceWith

In all current engines.

Firefox49+Safari10+Chrome54+
Opera39+Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

CharacterData/substringData

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE6+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

CharacterData

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Comment/Comment

In all current engines.

Firefox24+Safari8+Chrome29+
Opera?Edge79+
Edge (Legacy)16+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Comment

In all current engines.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

CustomEvent/CustomEvent

In all current engines.

Firefox11+Safari6+Chrome15+
Opera11.6+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12+
MDN

CustomEvent/detail

In all current engines.

Firefox6+Safari5+Chrome5+
Opera11.6+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari5+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile12+
MDN

CustomEvent

In all current engines.

Firefox6+Safari5+Chrome5+
Opera11+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari5+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile11+
Node.js19.0.0+
MDN

DOMImplementation/createDocument

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

DOMImplementation/createDocumentType

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

DOMImplementation/createHTMLDocument

In all current engines.

Firefox4+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

DOMImplementation

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE6+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

DOMTokenList/add

In all current engines.

Firefox3.6+Safari5.1+Chrome8+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile12.1+
MDN

DOMTokenList/contains

In all current engines.

Firefox3.6+Safari5.1+Chrome8+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile12.1+
MDN

DOMTokenList/item

In all current engines.

Firefox3.6+Safari5.1+Chrome8+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile12.1+
MDN

DOMTokenList/length

In all current engines.

Firefox3.6+Safari5.1+Chrome8+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile12.1+
MDN

DOMTokenList/remove

In all current engines.

Firefox3.6+Safari5.1+Chrome8+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile12.1+
MDN

DOMTokenList/replace

In all current engines.

Firefox49+Safari10.1+Chrome61+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

DOMTokenList/supports

In all current engines.

Firefox49+Safari10.1+Chrome49+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

DOMTokenList/toggle

In all current engines.

Firefox3.6+Safari5.1+Chrome8+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile12.1+
MDN

DOMTokenList/value

In all current engines.

Firefox47+Safari10+Chrome50+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

DOMTokenList

In all current engines.

Firefox3.6+Safari5.1+Chrome8+
Opera11.5+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile11.5+
MDN

Document/Document

In all current engines.

Firefox20+Safari8+Chrome60+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Document/URL

In all current engines.

Firefox1+Safari1+Chrome1+
Opera3+Edge79+
Edge (Legacy)12+IE4+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Document/adoptNode

In all current engines.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Document/append

In all current engines.

Firefox49+Safari10+Chrome54+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

DocumentFragment/append

In all current engines.

Firefox49+Safari10+Chrome54+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Element/append

In all current engines.

Firefox49+Safari10+Chrome54+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Document/characterSet

In all current engines.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView1+Samsung Internet?Opera Mobile12.1+
MDN

Document/childElementCount

In all current engines.

Firefox25+Safari9+Chrome29+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

DocumentFragment/childElementCount

In all current engines.

Firefox25+Safari9+Chrome29+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Element/childElementCount

In all current engines.

Firefox3.5+Safari4+Chrome2+
Opera10+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile10.1+
MDN

Document/children

In all current engines.

Firefox25+Safari9+Chrome29+
Opera?Edge79+
Edge (Legacy)16+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

DocumentFragment/children

In all current engines.

Firefox25+Safari9+Chrome29+
Opera?Edge79+
Edge (Legacy)16+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Element/children

In all current engines.

Firefox3.5+Safari4+Chrome1+
Opera10+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Document/compatMode

In all current engines.

Firefox1+Safari3.1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE6+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Document/contentType

In all current engines.

Firefox1+Safari9+Chrome36+
Opera23+Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile24+
MDN

Document/createAttribute

In all current engines.

Firefox44+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE6+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Document/createAttributeNS

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Document/createCDATASection

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+

Document/createComment

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE6+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Document/createDocumentFragment

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE6+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Document/createElement

In all current engines.

Firefox1+Safari1+Chrome1+
Opera6+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android4+iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Document/createElementNS

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android4+iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Document/createEvent

In all current engines.

Firefox1+Safari1+Chrome1+
Opera7+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android4+iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Document/createExpression

In all current engines.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile12.1+

XPathEvaluator/createExpression

In all current engines.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Document/createNodeIterator

In all current engines.

Firefox1+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Document/createNSResolver

In all current engines.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile12.1+

XPathEvaluator/createNSResolver

In all current engines.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Document/createProcessingInstruction

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Document/createRange

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Document/createTextNode

In all current engines.

Firefox1+Safari1+Chrome1+
Opera7+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Document/createTreeWalker

In all current engines.

Firefox1+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Document/doctype

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE6+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Document/documentElement

In all current engines.

Firefox1+Safari1+Chrome1+
Opera7+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Document/documentURI

In all current engines.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Document/evaluate

In all current engines.

Firefox1+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile10.1+

XPathEvaluator/evaluate

In all current engines.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Document/firstElementChild

In all current engines.

Firefox25+Safari9+Chrome29+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

DocumentFragment/firstElementChild

In all current engines.

Firefox25+Safari9+Chrome29+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Element/firstElementChild

In all current engines.

Firefox3.5+Safari4+Chrome2+
Opera10+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile10.1+
MDN

Document/getElementById

In all current engines.

Firefox1+Safari1+Chrome1+
Opera7+Edge79+
Edge (Legacy)12+IE5.5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Document/getElementsByClassName

In all current engines.

Firefox3+Safari3.1+Chrome1+
Opera9.5+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Document/getElementsByTagName

In all current engines.

Firefox1+Safari1+Chrome1+
Opera5.1+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Document/getElementsByTagNameNS

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Document/implementation

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE6+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Document/importNode

In all current engines.

Firefox1+Safari1+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Document/lastElementChild

In all current engines.

Firefox25+Safari9+Chrome29+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

DocumentFragment/lastElementChild

In all current engines.

Firefox25+Safari9+Chrome29+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Element/lastElementChild

In all current engines.

Firefox3.5+Safari4+Chrome2+
Opera10+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile10.1+
MDN

Document/prepend

In all current engines.

Firefox49+Safari10+Chrome54+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

DocumentFragment/prepend

In all current engines.

Firefox49+Safari10+Chrome54+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Element/prepend

In all current engines.

Firefox49+Safari10+Chrome54+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Document/querySelector

In all current engines.

Firefox3.5+Safari3.1+Chrome1+
Opera10+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+

DocumentFragment/querySelector

In all current engines.

Firefox3.5+Safari4+Chrome2+
Opera10+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile10.1+
MDN

Document/querySelectorAll

In all current engines.

Firefox3.5+Safari3.1+Chrome1+
Opera10+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+

DocumentFragment/querySelectorAll

In all current engines.

Firefox3.5+Safari4+Chrome2+
Opera10+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile10.1+

Element/querySelector

In all current engines.

Firefox3.5+Safari3.1+Chrome1+
Opera10+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+

Element/querySelectorAll

In all current engines.

Firefox3.5+Safari3.1+Chrome1+
Opera10+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Document/replaceChildren

In all current engines.

Firefox78+Safari14+Chrome86+
Opera?Edge86+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

DocumentFragment/replaceChildren

In all current engines.

Firefox78+Safari14+Chrome86+
Opera?Edge86+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Element/replaceChildren

In all current engines.

Firefox78+Safari14+Chrome86+
Opera?Edge86+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Document

In all current engines.

Firefox1+Safari1+Chrome1+
Opera3+Edge79+
Edge (Legacy)12+IE4+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile10.1+
MDN

DocumentFragment/DocumentFragment

In all current engines.

Firefox24+Safari8+Chrome29+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

DocumentFragment/getElementById

In all current engines.

Firefox28+Safari9+Chrome36+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

DocumentFragment

In all current engines.

Firefox1+Safari3+Chrome1+
Opera8+Edge79+
Edge (Legacy)12+IE6+
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

DocumentType/name

In all current engines.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

DocumentType/publicId

In all current engines.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

DocumentType/systemId

In all current engines.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

DocumentType

In all current engines.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

Element/assignedSlot

In all current engines.

Firefox63+Safari10+Chrome53+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Text/assignedSlot

In all current engines.

Firefox63+Safari10+Chrome53+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Element/attachShadow

In all current engines.

Firefox63+Safari10+Chrome53+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Element/attributes

In all current engines.

Firefox1+Safari1+Chrome1+
Opera8+Edge79+
Edge (Legacy)12+IE5.5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Element/classList

In all current engines.

Firefox3.6+Safari7+Chrome22+
Opera11.5+Edge79+
Edge (Legacy)16+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4+Samsung Internet?Opera Mobile11.5+
MDN

Element/className

In all current engines.

Firefox1+Safari1+Chrome22+
Opera8+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Element/closest

In all current engines.

Firefox35+Safari6+Chrome41+
Opera?Edge79+
Edge (Legacy)15+IENone
Firefox for Android?iOS Safari9+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Element/getAttribute

In all current engines.

Firefox1+Safari1+Chrome1+
Opera8+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Element/getAttributeNames

In all current engines.

Firefox45+Safari10.1+Chrome61+
Opera?Edge79+
Edge (Legacy)18IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Element/getAttributeNode

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE6+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Element/getAttributeNodeNS

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Element/getAttributeNS

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Element/getElementsByClassName

In all current engines.

Firefox3+Safari3.1+Chrome1+
Opera9.5+Edge79+
Edge (Legacy)16+IENone
Firefox for Android4+iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Element/getElementsByTagName

In all current engines.

Firefox1+Safari1+Chrome1+
Opera8+Edge79+
Edge (Legacy)12+IE5.5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Element/getElementsByTagNameNS

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android4+iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Element/hasAttribute

In all current engines.

Firefox1+Safari1+Chrome1+
Opera8+Edge79+
Edge (Legacy)12+IE8+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Element/hasAttributeNS

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Element/hasAttributes

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE8+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Element/id

In all current engines.

Firefox1+Safari1+Chrome23+
Opera12.1+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Element/insertAdjacentElement

In all current engines.

Firefox48+Safari3+Chrome1+
Opera8+Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Element/insertAdjacentText

In all current engines.

Firefox48+Safari4+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari4+Chrome for Android?Android WebView2.2+Samsung Internet?Opera Mobile12.1+
MDN

Element/localName

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Element/matches

In all current engines.

Firefox34+Safari8+Chrome33+
Opera21+Edge79+
Edge (Legacy)15+IENone
Firefox for Android34+iOS Safari?Chrome for Android?Android WebView4.4+Samsung Internet?Opera Mobile21+
MDN

Element/namespaceURI

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Element/prefix

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Element/removeAttribute

In all current engines.

Firefox1+Safari1+Chrome1+
Opera8+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Element/removeAttributeNode

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE6+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Element/removeAttributeNS

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Element/setAttribute

In all current engines.

Firefox1+Safari1+Chrome1+
Opera8+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Element/setAttributeNode

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE6+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Element/setAttributeNodeNS

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Element/setAttributeNS

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Element/shadowRoot

In all current engines.

Firefox63+Safari10+Chrome35+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Element/slot

In all current engines.

Firefox63+Safari10+Chrome53+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Global_attributes/slot

In all current engines.

Firefox63+Safari10+Chrome53+
Opera?Edge79+
Edge (Legacy)NoneIE?
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Element/tagName

In all current engines.

Firefox1+Safari1+Chrome1+
Opera8+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Element/toggleAttribute

In all current engines.

Firefox63+Safari12+Chrome69+
Opera?Edge79+
Edge (Legacy)18IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Element

In all current engines.

Firefox1+Safari1+Chrome1+
Opera8+Edge79+
Edge (Legacy)12+IE4+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile10.1+
MDN

Event/Event

In all current engines.

Firefox11+Safari6+Chrome15+
Opera11.6+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12+
Node.js15.0.0+
MDN

Event/bubbles

In all current engines.

Firefox1.5+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
Node.js14.5.0+
MDN

Event/cancelable

In all current engines.

Firefox1.5+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
Node.js14.5.0+
MDN

Event/composed

In all current engines.

Firefox52+Safari10+Chrome53+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js14.5.0+
MDN

Event/composedPath

In all current engines.

Firefox59+Safari10+Chrome53+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js14.5.0+
MDN

Event/currentTarget

In all current engines.

Firefox1+Safari1+Chrome1+
Opera7+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
Node.js14.5.0+
MDN

Event/defaultPrevented

In all current engines.

Firefox6+Safari5+Chrome5+
Opera11+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari5+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile11+
Node.js14.5.0+
MDN

Event/eventPhase

In all current engines.

Firefox1.5+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
Node.js14.5.0+
MDN

Event/isTrusted

In all current engines.

Firefox1.5+Safari10+Chrome46+
Opera33+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView46+Samsung Internet?Opera Mobile33+
Node.js14.5.0+
MDN

Event/preventDefault

In all current engines.

Firefox1+Safari1+Chrome1+
Opera7+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
Node.js14.5.0+
MDN

Event/stopImmediatePropagation

In all current engines.

Firefox10+Safari5+Chrome5+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari5+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
Node.js14.5.0+
MDN

Event/stopPropagation

In all current engines.

Firefox1+Safari1+Chrome1+
Opera7+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
Node.js14.5.0+
MDN

Event/target

In all current engines.

Firefox1+Safari1+Chrome1+
Opera7+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
Node.js14.5.0+
MDN

Event/timeStamp

In all current engines.

Firefox1.5+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView1+Samsung Internet?Opera Mobile12.1+
Node.js14.5.0+
MDN

Event/type

In all current engines.

Firefox1.5+Safari1+Chrome1+
Opera7+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
Node.js14.5.0+
MDN

Event

In all current engines.

Firefox1+Safari1+Chrome1+
Opera4+Edge79+
Edge (Legacy)12+IE6+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile10.1+
Node.js14.5.0+
MDN

EventTarget/EventTarget

In all current engines.

Firefox59+Safari14+Chrome64+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js15.0.0+
MDN

EventTarget/addEventListener

In all current engines.

Firefox1+Safari1+Chrome1+
Opera7+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView1+Samsung Internet?Opera Mobile10.1+
Node.js14.5.0+
MDN

EventTarget/dispatchEvent

In all current engines.

Firefox2+Safari3.1+Chrome4+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView4+Samsung Internet?Opera Mobile10.1+
Node.js14.5.0+
MDN

EventTarget/removeEventListener

In all current engines.

Firefox1+Safari1+Chrome1+
Opera7+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
Node.js14.5.0+
MDN

EventTarget

In all current engines.

Firefox1+Safari1+Chrome1+
Opera7+Edge79+
Edge (Legacy)12+IE6+
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile10.1+
Node.js14.5.0+
MDN

HTMLCollection/item

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE8+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

HTMLCollection/length

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE8+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

HTMLCollection/namedItem

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE8+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

HTMLCollection

In all current engines.

Firefox1+Safari1+Chrome1+
Opera8+Edge79+
Edge (Legacy)12+IE8+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

HTMLSlotElement/slotchange_event

In all current engines.

Firefox63+Safari10.1+Chrome53+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

MutationObserver/MutationObserver

In all current engines.

Firefox14+Safari7+Chrome26+
Opera15+Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4+Samsung Internet?Opera Mobile14+
MDN

MutationObserver/disconnect

In all current engines.

Firefox14+Safari6+Chrome18+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

MutationObserver/observe

In all current engines.

Firefox14+Safari6+Chrome18+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari6+Chrome for Android?Android WebView4.4+Samsung Internet?Opera Mobile?
MDN

MutationObserver/takeRecords

In all current engines.

Firefox14+Safari6+Chrome20+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

MutationObserver

In all current engines.

Firefox14+Safari7+Chrome26+
Opera15+Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4+Samsung Internet?Opera Mobile14+
MDN

MutationRecord/addedNodes

In all current engines.

Firefox14+Safari7+Chrome16+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

MutationRecord/attributeName

In all current engines.

Firefox14+Safari7+Chrome16+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

MutationRecord/attributeNamespace

In all current engines.

Firefox14+Safari7+Chrome16+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

MutationRecord/nextSibling

In all current engines.

Firefox14+Safari7+Chrome16+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

MutationRecord/oldValue

In all current engines.

Firefox14+Safari7+Chrome16+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

MutationRecord/previousSibling

In all current engines.

Firefox14+Safari7+Chrome16+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

MutationRecord/removedNodes

In all current engines.

Firefox14+Safari7+Chrome16+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

MutationRecord/target

In all current engines.

Firefox14+Safari7+Chrome16+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

MutationRecord/type

In all current engines.

Firefox14+Safari7+Chrome16+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

MutationRecord

In all current engines.

Firefox14+Safari7+Chrome16+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

NamedNodeMap/getNamedItem

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE6+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

NamedNodeMap/getNamedItemNS

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

NamedNodeMap/item

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

NamedNodeMap/length

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

NamedNodeMap/removeNamedItem

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE6+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

NamedNodeMap/removeNamedItemNS

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

NamedNodeMap/setNamedItem

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE6+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

NamedNodeMap/setNamedItemNS

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

NamedNodeMap

In all current engines.

Firefox34+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Node/appendChild

In all current engines.

Firefox1+Safari1.1+Chrome1+
Opera7+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Node/baseURI

In all current engines.

Firefox1+Safari4+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Node/childNodes

In all current engines.

Firefox1+Safari1.2+Chrome1+
Opera7+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Node/cloneNode

In all current engines.

Firefox1+Safari1.1+Chrome1+
Opera7+Edge79+
Edge (Legacy)12+IE6+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Node/compareDocumentPosition

In all current engines.

Firefox1+Safari4+Chrome2+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

Node/contains

In all current engines.

Firefox9+Safari1.1+Chrome16+
Opera7+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Node/firstChild

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE6+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Node/getRootNode

In all current engines.

Firefox53+Safari10.1+Chrome54+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Node/hasChildNodes

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE6+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Node/insertBefore

In all current engines.

Firefox1+Safari1.1+Chrome1+
Opera7+Edge79+
Edge (Legacy)12+IE6+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Node/isConnected

In all current engines.

Firefox49+Safari10+Chrome51+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet6.0+Opera Mobile?
MDN

Node/isDefaultNamespace

In all current engines.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Node/isEqualNode

In all current engines.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Node/isSameNode

In all current engines.

Firefox48+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Node/lastChild

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE6+
Firefox for Android45+iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Node/lookupNamespaceURI

In all current engines.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Node/lookupPrefix

In all current engines.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Node/nextSibling

In all current engines.

Firefox1+Safari1.1+Chrome1+
Opera7+Edge79+
Edge (Legacy)12+IE5.5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Node/nodeName

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE6+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Node/nodeType

In all current engines.

Firefox1+Safari1.1+Chrome1+
Opera7+Edge79+
Edge (Legacy)12+IE6+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Node/nodeValue

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE6+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Node/normalize

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Node/ownerDocument

In all current engines.

Firefox9+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE6+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Node/parentElement

In all current engines.

Firefox9+Safari1.1+Chrome1+
Opera7+Edge79+
Edge (Legacy)12+IE8+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Node/parentNode

In all current engines.

Firefox1+Safari1.1+Chrome1+
Opera7+Edge79+
Edge (Legacy)12+IE5.5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Node/previousSibling

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE5.5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Node/removeChild

In all current engines.

Firefox1+Safari1.1+Chrome1+
Opera7+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Node/replaceChild

In all current engines.

Firefox1+Safari1.1+Chrome1+
Opera7+Edge79+
Edge (Legacy)12+IE6+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Node/textContent

In all current engines.

Firefox1+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Node

In all current engines.

Firefox1+Safari1+Chrome1+
Opera7+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile10.1+
MDN

NodeIterator/filter

In all current engines.

Firefox3.5+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

NodeIterator/nextNode

In all current engines.

Firefox3.5+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

NodeIterator/pointerBeforeReferenceNode

In all current engines.

Firefox3.5+Safari3+Chrome1+
Opera15+Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile14+
MDN

NodeIterator/previousNode

In all current engines.

Firefox3.5+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

NodeIterator/referenceNode

In all current engines.

Firefox3.5+Safari3+Chrome1+
Opera15+Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile14+
MDN

NodeIterator/root

In all current engines.

Firefox3.5+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

NodeIterator/whatToShow

In all current engines.

Firefox3.5+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

NodeIterator

In all current engines.

Firefox3.5+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

NodeList/forEach

In all current engines.

Firefox50+Safari10+Chrome51+
Opera?Edge79+
Edge (Legacy)16+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Reference/Global_Objects/Array/@@iterator

In all current engines.

Firefox36+Safari10+Chrome51+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

NodeList

In all current engines.

Firefox1+Safari1+Chrome1+
Opera8+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

NodeList/item

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

NodeList/length

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

ProcessingInstruction/target

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

ProcessingInstruction

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Range/Range

In all current engines.

Firefox24+Safari8+Chrome29+
Opera?Edge79+
Edge (Legacy)15+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Range/cloneContents

In all current engines.

Firefox1+Safari1+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Range/cloneRange

In all current engines.

Firefox1+Safari1+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Range/collapse

In all current engines.

Firefox1+Safari1+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Range/commonAncestorContainer

In all current engines.

Firefox1+Safari1+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Range/compareBoundaryPoints

In all current engines.

Firefox1+Safari1+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Range/comparePoint

In all current engines.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Range/deleteContents

In all current engines.

Firefox1+Safari1+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Range/detach

Firefox1–15Safari1+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Range/extractContents

In all current engines.

Firefox1+Safari1+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Range/insertNode

In all current engines.

Firefox1+Safari1+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Range/intersectsNode

In all current engines.

Firefox17+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)17+IENone
Firefox for Android19+iOS Safari1+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Range/isPointInRange

In all current engines.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)15+IENone
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Range/selectNode

In all current engines.

Firefox1+Safari1+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Range/selectNodeContents

In all current engines.

Firefox1+Safari1+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Range/setEnd

In all current engines.

Firefox1+Safari1+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Range/setEndAfter

In all current engines.

Firefox1+Safari1+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Range/setEndBefore

In all current engines.

Firefox1+Safari1+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Range/setStart

In all current engines.

Firefox1+Safari1+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Range/setStartAfter

In all current engines.

Firefox1+Safari1+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Range/setStartBefore

In all current engines.

Firefox1+Safari1+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Range/surroundContents

In all current engines.

Firefox1+Safari1+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Range/toString

In all current engines.

Firefox1+Safari1+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Range

In all current engines.

Firefox1+Safari1+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

ShadowRoot/delegatesFocus

In all current engines.

Firefox94+Safari15+Chrome53+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

ShadowRoot/host

In all current engines.

Firefox63+Safari10+Chrome53+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

ShadowRoot/mode

In all current engines.

Firefox63+Safari10.1+Chrome53+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

ShadowRoot/slotAssignment

In all current engines.

Firefox92+Safari16.4+Chrome86+
Opera?Edge86+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

ShadowRoot

In all current engines.

Firefox63+Safari10+Chrome53+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

StaticRange/StaticRange

In all current engines.

Firefox71+Safari13.1+Chrome90+
Opera?Edge90+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

StaticRange

In all current engines.

Firefox69+Safari10.1+Chrome60+
Opera?Edge79+
Edge (Legacy)18IENone
Firefox for Android79+iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Text/Text

In all current engines.

Firefox24+Safari8+Chrome29+
Opera?Edge79+
Edge (Legacy)16+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Text/splitText

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView1+Samsung Internet?Opera Mobile12.1+
MDN

Text/wholeText

In all current engines.

Firefox3.5+Safari4+Chrome2+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Text

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

TreeWalker/currentNode

In all current engines.

Firefox4+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile10.1+
MDN

TreeWalker/filter

In all current engines.

Firefox4+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile10.1+
MDN

TreeWalker/firstChild

In all current engines.

Firefox4+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile10.1+
MDN

TreeWalker/lastChild

In all current engines.

Firefox4+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile10.1+
MDN

TreeWalker/nextNode

In all current engines.

Firefox4+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile10.1+
MDN

TreeWalker/nextSibling

In all current engines.

Firefox4+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile10.1+
MDN

TreeWalker/parentNode

In all current engines.

Firefox4+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile10.1+
MDN

TreeWalker/previousNode

In all current engines.

Firefox4+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile10.1+
MDN

TreeWalker/previousSibling

In all current engines.

Firefox4+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile10.1+
MDN

TreeWalker/root

In all current engines.

Firefox4+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile10.1+
MDN

TreeWalker/whatToShow

In all current engines.

Firefox4+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile10.1+
MDN

TreeWalker

In all current engines.

Firefox4+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile10.1+
MDN

XMLDocument

In all current engines.

Firefox1+Safari10+Chrome34+
Opera21+Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari10+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile21+
MDN

XPathEvaluator/XPathEvaluator

In all current engines.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

XPathEvaluator

In all current engines.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

XPathExpression/evaluate

In all current engines.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

XPathExpression

In all current engines.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

XPathResult/booleanValue

In all current engines.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

XPathResult/invalidIteratorState

In all current engines.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

XPathResult/iterateNext

In all current engines.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

XPathResult/numberValue

In all current engines.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

XPathResult/resultType

In all current engines.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

XPathResult/singleNodeValue

In all current engines.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

XPathResult/snapshotItem

In all current engines.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

XPathResult/snapshotLength

In all current engines.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

XPathResult/stringValue

In all current engines.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

XPathResult

In all current engines.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

XSLTProcessor/XSLTProcessor

In all current engines.

Firefox1+Safari3.1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile12.1+
MDN

XSLTProcessor/clearParameters

In all current engines.

Firefox1+Safari3.1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile12.1+
MDN

XSLTProcessor/getParameter

In all current engines.

Firefox1+Safari3.1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile12.1+
MDN

XSLTProcessor/importStylesheet

In all current engines.

Firefox1+Safari3.1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile12.1+
MDN

XSLTProcessor/removeParameter

In all current engines.

Firefox1+Safari3.1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile12.1+
MDN

XSLTProcessor/reset

In all current engines.

Firefox1+Safari3.1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile12.1+
MDN

XSLTProcessor/setParameter

In all current engines.

Firefox1+Safari3.1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile12.1+
MDN

XSLTProcessor/transformToDocument

In all current engines.

Firefox1+Safari3.1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile12.1+
MDN

XSLTProcessor/transformToFragment

In all current engines.

Firefox1+Safari3.1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile12.1+
MDN

XSLTProcessor

In all current engines.

Firefox1+Safari3.1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile12.1+
MDN

Element/slot

In all current engines.

Firefox63+Safari10+Chrome53+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?