DOM

现行标准 — 最后更新

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

摘要

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

1. 基础设施

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

本规范中使用的一些术语定义在编码选择器Web IDLXMLXML中的命名空间中。[ENCODING][SELECTORS4][WEBIDL][XML][XML-NAMES]

当需要扩展时,可以相应地更新 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. s解析选择器selectors的结果。[SELECTORS4]

  2. 如果s失败,则抛出一个"SyntaxError"DOMException

  3. 返回将选择器与树匹配的结果,其中snode使用范围根node[SELECTORS4]

选择器中的命名空间不计划支持,也不会添加。

1.4. 命名空间

验证qualifiedName,如果qualifiedName不符合QName生成规则,则抛出一个"InvalidCharacterError"DOMException

验证并提取namespacequalifiedName,请执行以下步骤:

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

  2. 验证qualifiedName

  3. prefix设为null。

  4. localName设为qualifiedName

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

    1. splitResult设为运行严格分割后得到的结果,参数为qualifiedName和U+003A (:)。

    2. prefix设置为splitResult[0]。

    3. localName设置为splitResult[1]。

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

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

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

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

  10. 返回namespaceprefixlocalName

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对象)、一个在 shadow 树中的调用目标(一个布尔值)、一个shadow 调整后的目标(一个潜在事件目标)、一个相关目标(一个潜在事件目标)、一个触摸目标列表(一个列表,包含潜在事件目标)、一个关闭树的根(一个布尔值)和一个关闭树中的插槽(一个布尔值)。一个路径最初为空列表。

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. path成为this路径

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

  4. currentTarget成为thiscurrentTarget属性值。

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

  6. 追加currentTargetcomposedPath

  7. currentTargetIndex设为 0。

  8. currentTargetHiddenSubtreeLevel设为 0。

  9. index设为path大小 - 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. currentHiddenLevelmaxHiddenLevel设为currentTargetHiddenSubtreeLevel

  12. index设为currentTargetIndex - 1。

  13. index大于或等于 0 时:

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

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

    3. 如果 path[index] 的 slot-in-closed-tree 为 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] 的 root-of-closed-tree 为 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,并且它没有激活行为遗留预激活行为, 或遗留取消激活行为

将来我们可能会允许自定义获取父级算法。请告诉我们 这对您的程序是否有用。目前,所有作者创建的EventTarget 不参与树结构。

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

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

  2. 返回false。

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

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

  2. listener信号不为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对象,并且它的服务工作者要处理的事件类型集合包含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进行讨论。)

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

  1. callbacks为« »。

  2. 对于每个 listenerglobal事件监听器列表

    1. 如果listener类型为"fetch",且 listener回调不为null,则追加 listener回调callbacks

  3. 返回callbacks

2.9. 分发事件

要将一个事件分发给一个目标,可选带有legacy target override flaglegacyOutputDidListenersThrowFlag,请按以下步骤操作:

  1. 设置event分发标志

  2. 如果未给出legacy target override flag,则将targetOverride设置为目标,否则设置为目标关联的文档[HTML]

    legacy target override flag仅由HTML使用,且仅当目标是一个窗口对象时使用。

  3. activationTarget设置为null。

  4. relatedTarget设置为针对目标重新定位eventrelatedTarget的结果。

  5. clearTargets 为 false。

  6. 如果 target 不是 relatedTarget 或者 targeteventrelatedTarget

    1. touchTargets设置为一个新的列表

    2. 对于每个touchTarget,它在event触摸目标列表中,追加针对目标重新定位touchTarget的结果到touchTargets中。

    3. 通过event目标targetOverriderelatedTargettouchTargets,并设置为false,附加到事件路径

    4. 如果event是一个鼠标事件对象,且event类型属性为"click",则isActivationEvent为true;否则为false。

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

    6. 如果目标是一个slottable且已分配,则将slottable设置为目标,否则为null。

    7. slot-in-closed-tree设置为false。

    8. parent设置为调用目标获取父项结果的event

    9. parent非空时:

      1. 如果slottable非空:

        1. 断言:parent是一个插槽

        2. slottable设置为null。

        3. 如果parent是一个影子根,且它的模式是"closed",则将slot-in-closed-tree设置为true。

      2. 如果parent是一个slottable且已分配,则将slottable设置为parent

      3. relatedTarget设置为针对parent重新定位eventrelatedTarget的结果。

      4. touchTargets设置为一个新的列表

      5. 对于每个touchTarget ,它在event触摸目标列表中,追加针对parent重新定位touchTarget的结果到touchTargets中。

      6. 如果parent是一个窗口对象,或parent是一个节点目标parent包括影子在内的包容性祖先,则:

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

        2. 附加到事件路径通过eventparent、null、relatedTargettouchTargets,并设置slot-in-closed-tree

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

      8. 否则:

        1. 目标设置为parent

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

        3. 附加到事件路径通过eventparent目标relatedTargettouchTargets,并设置slot-in-closed-tree

      9. 如果parent非空,则将parent设置为调用parent获取父项结果的event

      10. slot-in-closed-tree设置为false。

    10. clearTargetsStruct设置为event路径中的最后一个结构,其影子调整目标非空。

    11. 如果 clearTargetsStructshadow-adjusted targetclearTargetsStructrelatedTarget,或 clearTargetsStructtouch target list 中的 EventTarget 对象是一个节点,其是一个影子根:则将 clearTargets 设置为 true。

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

    13. 对于 eventpath 中的每个 struct,按相反顺序:

      1. 如果struct影子调整目标非空,则 将event事件阶段属性设置为AT_TARGET

      2. 否则,将event事件阶段属性设置为CAPTURING_PHASE

      3. 调用通过structevent、"捕获",以及如果给出的话legacyOutputDidListenersThrowFlag

    14. 对于 eventpath 中的每个 struct

      1. 如果struct影子调整目标非空,则 将event事件阶段属性设置为AT_TARGET

      2. 否则:

        1. 如果event冒泡属性为false,则继续

        2. event事件阶段属性设置为BUBBLING_PHASE

      3. 调用通过structevent、"冒泡",以及如果给出的话legacyOutputDidListenersThrowFlag

  7. event事件阶段属性设置为NONE

  8. event当前目标属性设置为null。

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

  10. 取消设置event分发标志停止传播标志,以及立即停止传播标志

  11. 如果 clearTargets 为 true:

    1. event目标设置为null。

    2. eventrelatedTarget设置为null。

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

  12. 如果activationTarget非空:

    1. 如果event取消标志未设置,则使用event运行activationTarget激活行为

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

  13. 如果event取消标志已设置,则返回false;否则返回true。

附加到事件路径,给定一个eventinvocationTargetshadowAdjustedTargetrelatedTargettouchTargets,以及slot-in-closed-tree,请运行这些步骤:

  1. invocationTargetInShadowTree设置为false。

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

  3. root-of-closed-tree设置为false。

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

  5. 追加一个新的结构event路径,其调用目标invocationTarget调用目标在影子树中invocationTargetInShadowTree影子调整目标shadowAdjustedTargetrelatedTargetrelatedTarget触摸目标列表touchTargets关闭树的根root-of-closed-tree,以及slot-in-closed-treeslot-in-closed-tree

调用,给定一个structevent阶段,以及可选的legacyOutputDidListenersThrowFlag,请运行这些步骤:

  1. event目标设置为event路径中的最后一个结构,其影子调整目标非空,且为structstruct之前的结构。

  2. eventrelatedTarget设置为structrelatedTarget

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

  4. 如果event停止传播标志已设置,则返回。

  5. 初始化event当前目标属性为struct调用目标

  6. listeners设置为event当前目标属性值的事件侦听器列表克隆

    这避免了在此点之后添加的事件侦听器被运行。请注意,由于已删除字段,移除仍然有影响。

  7. invocationTargetInShadowTree设置为struct调用目标在影子树中

  8. found设置为运行内部调用通过eventlisteners阶段invocationTargetInShadowTree,以及如果给出的话legacyOutputDidListenersThrowFlag的结果。

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

    1. originalEventType设置为event类型属性值。

    2. 如果event类型属性值匹配下表中的任意字符串,将event类型属性值设置为同一行匹配字符串旁的字符串,否则返回。

      事件类型 旧式事件类型
      "animationend" "webkitAnimationEnd"
      "animationiteration" "webkitAnimationIteration"
      "animationstart" "webkitAnimationStart"
      "transitionend" "webkitTransitionEnd"
    3. 内部调用通过eventlisteners阶段invocationTargetInShadowTree,以及如果给出的话legacyOutputDidListenersThrowFlag

    4. event类型属性值设置为originalEventType

内部调用,给定一个eventlisteners阶段invocationTargetInShadowTree,以及可选的legacyOutputDidListenersThrowFlag,请运行这些步骤:

  1. found 为 false。

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

    1. 如果 eventtype 属性值不是 listener类型,则 继续

    2. found 设为 true。

    3. 如果 phase 是 "capturing" 并且 listenercapture 为 false,则 继续

    4. 如果 phase 是 "bubbling" 并且 listenercapture 为 true,则 继续

    5. 如果 listeneronce 为 true,则根据 eventcurrentTarget 属性值和 listener 移除一个事件侦听器

    6. global 成为 listener回调关联的领域全局对象

    7. currentEvent 为 undefined。

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

      1. currentEvent 设为 global当前事件

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

    9. 如果 listenerpassive 为 true,则设定 event被动监听器标志

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

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

      1. 报告 exception,用于 listener回调的相应 JavaScript 对象的 关联领域全局对象

      2. 设置 legacyOutputDidListenersThrowFlag(如果提供)。

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

    12. 取消设定 event被动监听器标志

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

    14. 如果 event停止立即传播标志已设置,则中断

  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" 是创建、初始化和分派一个事件的缩写。Fire an event 使得这个过程更容易表达。

如果事件需要其 bubblescancelable 属性初始化, 可以这样写:“fire an event named submit at target with its cancelable attribute initialized to true”。

或者,当需要自定义构造函数时,可以这样写:“fire an event named click at target using MouseEvent with its detail attribute initialized to 1”。

有时返回值很重要:

  1. doAction 成为 firing an event named like at target 的结果。

  2. 如果 doAction 为真,那么……

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节点参与一个的历史原因;它们从不具有(非空)父节点或任何子节点,因此在一个中是孤立的。

要确定节点node长度,请执行以下步骤:

  1. 如果nodeDocumentTypeAttr节点,则返回0。

  2. 如果nodeCharacterData节点,则返回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 中,位于节点 child 之前:

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

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

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

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

  5. 如果 node 是一个 Text 节点parent 是一个文档,或者 node 是一个文档类型parent 不是一个文档,则抛出一个“HierarchyRequestErrorDOMException

  6. 如果 parent 是一个文档,并且以下根据 node 实现的接口切换的任何语句为真,则抛出一个“HierarchyRequestErrorDOMException

    DocumentFragment

    如果 node 有多个元素子节点或有一个 Text 节点子节点

    否则,如果 node 有一个元素子节点,并且 parent 有一个元素子节点,或者 child 是一个文档类型,或者 child 非空且一个文档类型跟随 child

    Element

    parent 有一个元素子节点child 是一个文档类型,或者 child 非空且一个文档类型跟随 child

    DocumentType

    parent 有一个文档类型子节点child 非空且一个元素位于 child 之前,或者 child 为空且 parent 有一个元素子节点

要将一个 node 预插入parent 中,位于 child 之前,请执行以下步骤:

  1. 确保预插入有效性,即将 node 插入到 parent 中,位于 child 之前。

  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)'; // Logs 'rgb(255, 0, 0)'
style.innerText = 'h1 {color: rgb(255, 0, 0);}';

document.body.append(fragment);

上例中的脚本记录了'rgb(255, 0, 0)',因为以下事件按顺序发生:

  1. 运行了插入算法,该算法会按顺序插入scriptstyle元素。

    1. HTML 标准的插入步骤script元素运行;它们什么都不做。[HTML]

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

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

规范还可以为所有或部分节点定义连接后步骤。如下面的插入算法所示,该算法传递了 connectedNode

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

规范可以为所有或部分节点定义子节点更改步骤。该算法不传递任何参数,并从插入移除替换数据中调用。

要将节点插入到父节点中的子节点之前,并带有一个可选的抑制观察者标志,请运行以下步骤:

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

  2. countnodes大小

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

  4. 如果 node 是一个 DocumentFragment 节点

    1. 设置抑制观察者标志移除子节点

    2. node 排队一个树突变记录,其中包含 « »、nodes、null 和 null。

      此步骤有意不关注抑制观察者标志

  5. 如果 child 非空:

    1. 对于每个活动范围,其起始节点parent起始偏移量大于 child索引,将其起始偏移量增加 count

    2. 对于每个活动范围,其结束节点parent结束偏移量大于 child索引,将其结束偏移量增加 count

  6. previousSiblingchild前一个兄弟节点,如果 child 为 null,则为 parent最后一个子节点

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

    1. node 采纳parent节点文档中。

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

    3. 否则,在 parent子节点中,在 child索引之前插入 node

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

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

    6. 使用 node运行为树分配可插入对象

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

      1. 使用 inclusiveDescendant 运行插入步骤

      2. 如果 inclusiveDescendant连接,则继续

      3. 如果 inclusiveDescendant 是一个元素

        1. 如果 inclusiveDescendant自定义元素注册表为 null,则将 inclusiveDescendant自定义元素注册表设置为查找自定义元素注册表的结果,给定 inclusiveDescendant父节点

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

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

        4. 否则,尝试升级 inclusiveDescendant

          如果此操作成功升级了 inclusiveDescendant,则其 connectedCallback 将在升级元素算法期间自动排队。

      4. 否则,如果 inclusiveDescendant 是一个影子根

        1. 如果 inclusiveDescendant自定义元素注册表为 null 且 inclusiveDescendant保持自定义元素注册表为 null 为 false,则将 inclusiveDescendant自定义元素注册表设置为查找自定义元素注册表的结果,给定 inclusiveDescendant宿主

        2. 否则,如果 inclusiveDescendant自定义元素注册表非 null 且 inclusiveDescendant自定义元素注册表作用域为 true,则将 inclusiveDescendant节点文档追加inclusiveDescendant自定义元素注册表作用域文档集

  8. 如果抑制观察者标志未设置,则为 parent 排队一个树突变记录,其中包含 nodes、« »、previousSiblingchild

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

  10. staticNodeList 为一个列表,其中包含节点,初始值为 « »。

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

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

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

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

规范可以为所有或部分节点定义移动步骤。 如下面的移动算法所示,该算法传递了一个节点 movedNode 和一个节点或 null 的 oldParent。与插入步骤类似,这些步骤不得修改 movedNode 参与节点树,不得创建浏览上下文触发事件或以其他方式执行 JavaScript。但是,这些步骤可以将任务排入队列以异步执行这些操作。

移动一个节点 node 到一个节点 newParent 中,位于一个节点或 null 的 child 之前:

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

    这具有确保仅当 newParent已连接状态与 node已连接状态相同时才执行移动的副作用。

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

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

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

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

  6. 如果 newParent 是一个文档node 是一个 Element 节点,并且或者 newParent 有一个元素子节点child 是一个文档类型,或者 child 非空且一个文档类型跟随 child,则抛出一个 “HierarchyRequestErrorDOMException

  7. oldParentnode父节点

  8. 断言oldParent 非空。

  9. 运行活动范围预移除步骤,给定 node

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

  11. oldPreviousSiblingnode前一个兄弟节点

  12. oldNextSiblingnode下一个兄弟节点

  13. oldParent子节点移除 node

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

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

  16. 如果 node 有一个作为插槽包含后代

    1. 使用 oldParent运行为树分配可插入对象

    2. 使用 node 运行为树分配可插入对象

  17. 如果 child 非空:

    1. 对于每个活动范围,其起始节点newParent起始偏移量大于 child索引,将其起始偏移量增加 1。

    2. 对于每个活动范围,其结束节点newParent结束偏移量大于 child索引,将其结束偏移量增加 1。

  18. newPreviousSiblingchild前一个兄弟节点(如果 child 非空),否则为 newParent最后一个子节点

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

  20. 否则,在 newParent子节点中,在 child索引之前插入 node

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

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

  23. 使用 node运行为树分配可插入对象

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

    1. 如果 inclusiveDescendantnode,则使用 inclusiveDescendantoldParent 运行移动步骤。否则,使用 inclusiveDescendant 和 null 运行移动步骤

      因为移动算法是独立于插入移除的原语,所以它不会为 inclusiveDescendant 调用传统的插入步骤移除步骤

    2. 如果 inclusiveDescendant自定义的newParent 已连接,则使用 inclusiveDescendant、回调名称 “connectedMoveCallback” 和 « » 将自定义元素回调反应排入队列

  25. oldParent 排队一个树突变记录,其中包含 « »、« node »、oldPreviousSiblingoldNextSibling

  26. newParent 排队一个树突变记录,其中包含 « node »、« »、newPreviousSiblingchild

要将节点追加到父节点,请将节点预插入到父节点的空之前。

要用节点替换父节点内的子节点,请运行以下步骤:

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

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

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

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

  5. 如果 node 是一个 Text 节点parent 是一个文档,或者 node 是一个文档类型parent 不是一个文档,则抛出一个“HierarchyRequestErrorDOMException

  6. 如果 parent 是一个文档,并且以下根据 node 实现的接口切换的任何语句为真,则抛出一个 “HierarchyRequestErrorDOMException

    DocumentFragment

    如果 node 有多个元素子节点或有一个 Text 节点子节点

    否则,如果 node 有一个元素子节点,并且或者 parent 有一个不是 child元素子节点,或者一个文档类型跟随 child

    Element

    parent 有一个不是 child元素子节点,或者一个文档类型跟随 child

    DocumentType

    parent 有一个不是 child文档类型子节点,或者一个元素位于 child 之前。

    以上语句与预插入算法不同。

  7. referenceChildchild下一个兄弟节点

  8. 如果 referenceChildnode,则将 referenceChild 设置为 node下一个兄弟节点

  9. previousSiblingchild前一个兄弟节点

  10. removedNodes 为空集。

  11. 如果 child父节点非空:

    1. removedNodes 设置为 « child »。

    2. 设置抑制观察者标志移除 child

    仅当 childnode 时,以上才可能为 false。

  12. nodesnode子节点(如果 node 是一个 DocumentFragment 节点);否则为 « node »。

  13. 设置抑制观察者标志并将 node 插入parent 中,位于 referenceChild 之前。

  14. parent 排队一个树突变记录,其中包含 nodesremovedNodespreviousSiblingreferenceChild

  15. 返回 child

要在父节点内用节点替换全部,请运行以下步骤:

  1. removedNodesparent子节点

  2. addedNodes 为空集。

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

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

  5. 设置抑制观察者标志,按树顺序移除 parent 的所有子节点

  6. 如果 node 非空,则设置抑制观察者标志,在 null 之前将 node 插入parent 中。

  7. 如果 addedNodesremovedNodes 不为空, 则为 parent 排队一个树突变记录,其中包含 addedNodesremovedNodes、null 和 null。

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

要从 parent预移除一个 child,请执行以下步骤:

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

  2. 移除 child

  3. 返回 child

规范可以为所有或部分节点定义移除步骤。 如下面的移除算法所示,该算法传递了一个节点 removedNode 和一个节点或 null 的 oldParent

移除一个节点 node(可选抑制观察者标志),请执行以下步骤:

  1. parentnode父节点

  2. 断言:parent 非空。

  3. 运行活动范围预移除步骤,给定 node

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

  5. oldPreviousSiblingnode前一个兄弟节点

  6. oldNextSiblingnode下一个兄弟节点

  7. 从其 parent子节点移除 node

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

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

  10. 如果 node 有一个作为插槽包含后代

    1. 使用 parent运行为树分配可插入对象

    2. 使用 node 运行为树分配可插入对象

  11. 使用 nodeparent 运行移除步骤

  12. isParentConnectedparent已连接状态。

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

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

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

    1. 使用 descendant 和 null 运行移除步骤

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

  15. 对于 parent 的每个包含祖先 inclusiveAncestor,然后对于 inclusiveAncestor已注册观察者列表中的每个 registered,如果 registered选项["subtree"] 为 true,则将一个新的瞬态已注册观察者(其观察者registered观察者选项registered选项,并且来源registered追加node已注册观察者列表

  16. 如果抑制观察者标志未设置,则为 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 的第一个元素

getElementById(elementId) 方法的步骤是:返回此对象后代中,按树顺序IDelementId 的第一个元素;否则,如果没有这样的元素,则返回 null。

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. 如果此对象是一个文档, 则返回此对象自定义元素注册表

  2. 断言此对象是一个 ShadowRoot 节点

  3. 返回此对象自定义元素注册表

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

4.2.6. Mixin ParentNode

将节点转换为单个节点,给定 nodesdocument,请执行以下步骤:

  1. node 为 null。

  2. nodes 中的每个字符串替换为一个新的 Text 节点,其数据为该字符串,节点文档document

  3. 如果 nodes 包含一个节点,则将 node 设置为 nodes[0]。

  4. 否则,将 node 设置为一个新的 DocumentFragment 节点,其节点文档document,然后将 nodes 中的每个节点(如果存在)追加到其中。

  5. 返回 node

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)

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

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

node . append(nodes)

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

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

node . replaceChildren(nodes)

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

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

node . moveBefore(movedNode, child)

如果 child 非空,则将 movedNode 移动(不先移除)到 nodechild 之后;否则移动到 node最后一个子节点之后。此方法保留与 movedNode 关联的状态。

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

node . querySelector(selectors)

返回 node后代中与 selectors 匹配的第一个元素

node . querySelectorAll(selectors)

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

children getter 的步骤是返回一个以此对象为根的 HTMLCollection 集合,仅匹配元素子节点

firstElementChild getter 的步骤是返回第一个作为元素子节点;否则返回 null。

lastElementChild getter 的步骤是返回最后一个作为元素子节点;否则返回 null。

childElementCount getter 的步骤是返回此对象的作为元素子节点的数量。

prepend(nodes) 方法的步骤是:

  1. node 为给定 nodes此对象节点文档将节点转换为单个节点的结果。

  2. 此对象第一个子节点之前,将 node 预插入此对象中。

append(nodes) 方法的步骤是:

  1. node 为给定 nodes此对象节点文档将节点转换为单个节点的结果。

  2. node 追加此对象

replaceChildren(nodes) 方法的步骤是:

  1. node 为给定 nodes此对象节点文档将节点转换为单个节点的结果。

  2. 在 null 之前,确保将 node 预插入此对象的有效性。

  3. 此对象内,用 node 替换所有内容

moveBefore(node, child) 方法的步骤是:

  1. referenceChildchild

  2. 如果 referenceChildnode,则将 referenceChild 设置为 node下一个兄弟节点

  3. referenceChild 之前,将 node 移动此对象中。

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

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

4.2.7. 混入 NonDocumentTypeChildNode

Web 兼容性阻止了 previousElementSiblingnextElementSibling 特性在文档类型上公开(因此也在 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)

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

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

node . after(...nodes)

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

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

node . replaceWith(...nodes)

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

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

node . remove()
移除 node

before(nodes) 方法的步骤为:

  1. parent此对象父节点

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

  3. viablePreviousSibling此对象的第一个不在 nodes 中的前置兄弟节点;否则为 null。

  4. node 为给定 nodes此对象节点文档将节点转换为单个节点的结果。

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

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

after(nodes) 方法的步骤为:

  1. parent此对象父节点

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

  3. viableNextSibling此对象的第一个不在 nodes 中的后续兄弟节点;否则为 null。

  4. node 为给定 nodes此对象节点文档将节点转换为单个节点的结果。

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

replaceWith(nodes) 方法的步骤是:

  1. parent此对象父节点

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

  3. viableNextSibling此对象的第一个不在 nodes 中的后续兄弟节点;否则为 null。

  4. node 为给定 nodes此对象节点文档将节点转换为单个节点的结果。

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

    此对象可能已被插入到 node 中。

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

remove() 方法的步骤是:

  1. 如果此对象父节点为 null,则返回。

  2. 移除此对象

4.2.9. 混入 Slottable

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

assignedSlot getter 的步骤是返回给定此对象和 true 的查找插槽的结果。

4.2.10. 旧式集合:NodeListHTMLCollection

集合是一个表示节点列表的对象。一个集合可以是动态的,也可以是静态的。除非另有说明,否则集合必须是动态的

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

集合创建时,会与其关联一个过滤器和根。

然后,集合 表示以集合的根为根的子树的视图,仅包含符合给定过滤器的节点。该视图是线性的。在没有特定要求的情况下,集合中的节点必须按树顺序排序。

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]
从集合中返回ID 或名称为 name 的第一个元素

对象的支持的属性索引是从零到元素数量减一的范围内的数字由集合表示。如果没有这样的元素,那么就没有支持的属性索引

length获取器步骤应返回由集合表示的节点数量。

item(index) 方法的步骤是:返回集合中的第 index元素。如果集合中没有第 index元素,则该方法必须返回 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. recordsmo记录队列的克隆。

    2. 清空mo记录队列

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

    4. 如果 records 不为空,则使用 « records, mo » 和 "report" 调用 mo回调,并将回调 this 值设为 mo

  7. 对于 signalSet 中的每个 slot,在 slot触发一个名为 slotchange 的事件,并将其 bubbles 属性设置为 true。


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

一个注册观察者由一个观察者(一个MutationObserver对象)和选项(一个MutationObserverInit字典)组成。

一个瞬态注册观察者是一个注册观察者,它还包括一个(一个注册观察者)。

瞬态注册观察者用于在节点被移除后跟踪给定节点后代中的突变,这样当节点父节点上的 subtree 设置为 true 时,它们不会丢失。

4.3.1. 接口 MutationObserver

[Exposed=Window]
interface MutationObserver {
  constructor(MutationCallback callback);

  undefined observe(Node target, optional MutationObserverInit options = {});
  undefined disconnect();
  sequence<MutationRecord> takeRecords();
};

callback MutationCallback = undefined (sequence<MutationRecord> mutations, MutationObserver observer);

dictionary MutationObserverInit {
  boolean childList = false;
  boolean attributes;
  boolean characterData;
  boolean subtree = false;
  boolean attributeOldValue;
  boolean characterDataOldValue;
  sequence<DOMString> attributeFilter;
};

一个 MutationObserver 对象可用于观察节点的突变。

每个 MutationObserver 对象都有这些关联的概念:

observer = new MutationObserver(callback)
构造一个 MutationObserver 对象并将其回调设置为 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) 构造函数的步骤是:将此对象回调设置为 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观察者此对象

    1. 对于此对象节点列表中的每个 node,从 node注册观察者列表移除所有其来源registered瞬态注册观察者

    2. registered选项设置为 options

  8. 否则:

    1. 将一个新的注册观察者(其观察者此对象选项options追加target注册观察者列表

    2. 将对 target 的弱引用追加此对象节点列表

disconnect() 方法的步骤是:

  1. 对于此对象节点列表中的每个 node,从 node注册观察者列表移除任何注册观察者,其中此对象是其观察者

  2. 清空此对象记录队列

takeRecords() 方法的步骤是:

  1. records此对象记录队列克隆

  2. 清空此对象记录队列

  3. 返回 records

4.3.2. 排队突变记录

要为 typetargetnamenamespaceoldValueaddedNodesremovedNodespreviousSiblingnextSibling 排队一个突变记录,请执行以下步骤:

  1. interestedObservers 为一个空的有序映射

  2. nodestarget包含祖先

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

    1. optionsregistered选项

    2. 如果以下条件均不为真:

      则:

      1. moregistered观察者

      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 追加周围代理待处理突变观察者

  5. 将突变观察者微任务排队

要为 target 以及 addedNodesremovedNodespreviousSiblingnextSibling 排队一个树突变记录,请执行以下步骤:

  1. 断言:addedNodesremovedNodes 不为空

  2. target 将一个 "childList" 类型的突变记录排队,附带 null、null、null、addedNodesremovedNodespreviousSiblingnextSibling

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 的情况下,如果节点已分配的,则返回该节点已分配插槽;否则返回该节点父节点

每个节点还有一个注册观察者列表


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 getter 的步骤是返回第一个匹配的语句,具体取决于此对象实现的接口:

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 getter 的步骤是返回第一个匹配的语句,具体取决于此对象实现的接口:

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

node . baseURI
返回 node节点文档文档基本 URL

baseURI getter 的步骤是返回此对象节点文档文档基本 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 getter 的步骤是:如果此对象已连接的,则返回 true;否则返回 false。

ownerDocument getter 的步骤是:如果此对象是一个文档,则返回 null;否则返回此对象节点文档

一个文档节点文档就是该文档本身。所有节点始终都有一个节点文档

getRootNode(options) 方法的步骤是:如果 options["composed"] 为 true,则返回此对象包含阴影的根节点;否则返回此对象根节点

parentNode getter 的步骤是返回此对象父节点

parentElement getter 的步骤是返回此对象父元素

hasChildNodes() 方法的步骤是:如果此对象子节点,则返回 true;否则返回 false。

childNodes getter 的步骤是返回一个以此对象为根且仅匹配子节点NodeList

firstChild getter 的步骤是返回此对象第一个子节点

lastChild getter 的步骤是返回此对象最后一个子节点

previousSibling getter 的步骤是返回此对象前一个兄弟节点

nextSibling getter 的步骤是返回此对象下一个兄弟节点


nodeValue getter 的步骤是返回以下内容,具体取决于此对象实现的接口:

Attr
此对象
CharacterData
此对象数据
其他情况
Null。

nodeValue setter 的步骤是,如果给定值为 null,则视为空字符串,然后执行以下描述的操作,具体取决于此对象实现的接口:

Attr

使用此对象和给定值设置现有特性值

CharacterData

使用节点此对象、偏移量 0、计数此对象长度以及给定值作为数据,替换数据

其他情况

不执行任何操作。

使用节点 node 获取文本内容的步骤是返回以下内容,具体取决于 node 实现的接口:

DocumentFragment
Element
node后代文本内容
Attr
node
CharacterData
node数据
其他情况
Null。

textContent getter 的步骤是返回使用此对象运行获取文本内容的结果。

节点 parent 内使用字符串 string 字符串替换所有内容的步骤如下:

  1. node 为 null。

  2. 如果 string 不是空字符串,则将 node 设置为一个新的 Text 节点,其数据string节点文档parent节点文档

  3. parent 内使用 node 替换所有内容

使用节点 node 和字符串 value 设置文本内容的步骤如下,具体取决于 node 实现的接口:

DocumentFragment
Element

node 内使用 value 字符串替换所有内容

Attr

使用 nodevalue 设置现有特性值

CharacterData

使用节点 node、偏移量 0、计数 node长度以及数据 value 替换数据

其他情况

不执行任何操作。

textContent setter 的步骤是,如果给定值为 null,则视为空字符串,然后使用此对象和给定值运行设置文本内容


node . normalize()
移除空的专属 Text 节点,并将剩余的连续专属 Text 节点数据连接到它们节点中的第一个。

normalize() 方法的步骤是为此对象的每个后代专属 Text 节点 node 执行以下步骤:

  1. lengthnode长度
  2. 如果 length 为零,则移除 node 并继续处理下一个专属 Text 节点(如果存在)。
  3. datanode连续专属 Text 节点(不包括其自身)的数据树顺序连接的结果。
  4. 使用节点 node、偏移量 length、计数 0 和数据 data 替换数据
  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 设置为 document,将 subtree 设置为 subtree,将 parent 设置为 copy,并将 fallbackRegistry 设置为 fallbackRegistry

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

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

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

    3. 使用 copynode影子根模式、true、node影子根可序列化性node影子根焦点委托node影子根插槽分配shadowRootRegistry 附加一个影子根

    4. copy影子根声明性设置为 node影子根声明性

    5. 对于 node影子根子节点中的每个 child,按树顺序克隆一个节点,给定 child,并将 document 设置为 document,将 subtree 设置为 subtree,并将 parent 设置为 copy影子根

      这有意不传递 fallbackRegistry 参数。

  7. 返回 copy

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

  1. copy 为 null。

  2. 如果 node 是一个元素

    1. registrynode自定义元素注册表

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

    3. copy 设置为创建元素的结果,给定 documentnode本地名称node命名空间node命名空间前缀nodeis、false 和 registry

    4. 对于 node特性列表中的每个 attribute

      1. copyAttribute 为给定 attributedocument 和 null 克隆单个节点的结果。

      2. copyAttribute 追加copy

  3. 否则,将 copy 设置为一个节点,该节点实现node 相同的接口,并满足以下附加要求,具体取决于 node 实现的接口:

    Document

    copy编码内容类型URL类型模式自定义元素注册表设置为 node 的相应值。

    DocumentType

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

    Attr

    copy命名空间命名空间前缀本地名称设置为 node 的相应值。

    Text
    Comment

    copy数据设置为 node 的数据。

    ProcessingInstruction

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

    其他情况

    不执行任何操作。

  4. 断言copy 是一个节点

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

  6. copy节点文档设置为 document

  7. 返回 copy

cloneNode(subtree) 方法的步骤如下:

  1. 如果此对象是一个影子根,则抛出一个 "NotSupportedError" DOMException

  2. 返回给定此对象并将 subtree 设置为 subtree克隆节点的结果。

一个节点 A 等于一个节点 B,如果以下所有条件都为真:

isEqualNode(otherNode) 方法的步骤是:如果 otherNode 不为 null 且此对象等于 otherNode,则返回 true;否则返回 false。

isSameNode(otherNode) 方法的步骤是:如果 otherNode此对象,则返回 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. 如果此对象other,则返回零。

  2. node1othernode2此对象

  3. attr1attr2 为 null。

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

  5. 如果 node2 是一个特性

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

    2. 如果 attr1node1 非 null,并且 node2node1

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

        1. 如果 attr 等于 attr1,则返回 DOCUMENT_POSITION_IMPLEMENTATION_SPECIFICDOCUMENT_POSITION_PRECEDING 相加的结果。

        2. 如果 attr 等于 attr2,则返回 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) 方法的步骤是:如果 other此对象包含后代,则返回 true;否则返回 false(包括当 other 为 null 时)。


要为一个使用namespaceelement 定位命名空间前缀,请执行以下步骤:

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

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

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

  4. 返回 null。

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

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

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

  3. 如果其命名空间非空,且其命名空间前缀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. 根据此对象实现的接口进行切换:

    Element

    返回为此对象使用 namespace 定位命名空间前缀的结果。

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

    2. 返回为此对象文档元素使用 namespace 定位命名空间前缀的结果。

    DocumentType
    DocumentFragment

    返回 null。

    Attr
    1. 如果此对象元素为 null,则返回 null。

    2. 返回为此对象元素使用 namespace 定位命名空间前缀的结果。

    其他情况
    1. 如果此对象父元素为 null,则返回 null。

    2. 返回为此对象父元素使用 namespace 定位命名空间前缀的结果。

方法lookupNamespaceURI(prefix)的步骤如下:

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

  2. 返回使用 prefix此对象定位命名空间的结果。

方法isDefaultNamespace(namespace)的步骤如下:

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

  2. defaultNamespace 为对此对象使用 null 定位命名空间的结果。

  3. 如果 defaultNamespacenamespace 相同,则返回 true;否则返回 false。


insertBefore(node, child) 方法的步骤是返回将 node 预插入此对象child 之前的结果。

appendChild(node) 方法的步骤是返回将 node 追加此对象的结果。

replaceChild(node, child) 方法的步骤是返回在此对象内用 node 替换 child 的结果。

removeChild(child) 方法的步骤是返回从此对象预移除 child 的结果。


对于节点 root具有限定名 qualifiedName 的元素列表是由以下算法返回的 HTMLCollection

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

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

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

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

对于节点 root具有命名空间 namespace 和本地名称 localName 的元素列表是由以下算法返回的 HTMLCollection

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

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

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

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

  5. 返回一个以 root 为根的 HTMLCollection,其过滤器匹配后代元素,这些元素的命名空间namespace本地名称localName

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

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

  1. classes 为对 classNames 运行有序集合解析器的结果。
  2. 如果 classes 是空集,则返回一个空的 HTMLCollection
  3. 返回一个以 root 为根的 HTMLCollection,其过滤器匹配后代元素,这些元素在 classes 中拥有其所有的

    如果 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;否则返回文档相关全局对象


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() 构造函数的步骤是将此对象设置为当前全局对象关联 Document[HTML]

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

implementation getter 的步骤是返回与此对象关联的 DOMImplementation 对象。

URLdocumentURI getter 的步骤是返回此对象URL序列化后)。

compatMode getter 的步骤是:如果此对象模式是“quirks”,则返回“BackCompat”;否则返回“CSS1Compat”。

characterSetcharsetinputEncoding getter 的步骤是返回此对象编码名称

contentType getter 的步骤是返回此对象内容类型


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)

返回调用该方法的对象(一个文档或一个元素)中所有具有 classNames 给定类的元素HTMLCollectionclassNames 参数被解释为空格分隔的类列表。

doctype getter 的步骤是返回此对象中作为文档类型子节点;否则返回 null。

documentElement getter 的步骤是返回此对象文档元素

getElementsByTagName(qualifiedName) 方法的步骤是返回此对象具有限定名 qualifiedName 的元素列表

因此,在 HTML 文档中,document.getElementsByTagName("FOO") 将匹配不在HTML 命名空间中的 <FOO> 元素,以及在HTML 命名空间中的 <foo> 元素,但不匹配在HTML 命名空间中的 <FOO> 元素。

getElementsByTagNameNS(namespace, localName) 方法的步骤是返回此对象具有命名空间 namespace 和本地名称 localName 的元素列表

getElementsByClassName(classNames) 方法的步骤是返回此对象具有类名 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")将返回一个包含两个段落p1p2HTMLCollection

调用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 可用于创建一个自定义的内置元素

如果 localNameName 产生式不匹配,则会抛出“InvalidCharacterErrorDOMException

当同时提供 optionscustomElementRegistryoptionsis 时, 将抛出“NotSupportedErrorDOMException

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

返回一个元素,其命名空间namespace。其命名空间前缀将是 qualifiedName 中 U+003A (:) 之前的所有内容,或者为 null。其本地名称将是 qualifiedName 中 U+003A (:) 之后的所有内容,或者就是 qualifiedName

如果提供了 options,其 customElementRegistry 可用于设置 CustomElementRegistry

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

如果 qualifiedNameQName 产生式不匹配,则会抛出“InvalidCharacterErrorDOMException

如果以下任一条件为真,则会抛出“NamespaceErrorDOMException

当同时提供 optionscustomElementRegistryoptionsis 时, 将抛出“NotSupportedErrorDOMException

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

任何 namenamespace元素接口都是 Element,除非另有说明。

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

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

  1. 如果 localNameName 产生式不匹配,则抛出一个“InvalidCharacterErrorDOMException

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

  3. registryis 为给定 options此对象扁平化元素创建选项的结果。

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

  5. 返回给定此对象localNamenamespace、null、is、true 和 registry 创建元素的结果。

内部 createElementNS 步骤,给定 documentnamespacequalifiedNameoptions,如下所示:

  1. namespaceprefixlocalName 为将 namespacequalifiedName 传递给验证和提取的结果。

  2. registryis 为给定 options此对象扁平化元素创建选项的结果。

  3. 返回给定 documentlocalNamenamespaceprefixis、true 和 registry 创建元素的结果。

createElementNS(namespace, qualifiedName, options) 方法的步骤是返回运行内部 createElementNS 步骤的结果,给定此对象namespacequalifiedNameoptions

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

  1. registry 为 null。

  2. is 为 null。

  3. 如果 options 是一个字典:

    1. 如果 options["customElementRegistry"] 存在,则将 registry 设置为其值。

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

    3. 如果 registry 非 null 且 is 非 null,则抛出一个 “NotSupportedErrorDOMException

  4. 如果 registry 为 null,则将 registry 设置为给定 document 查找自定义元素注册表的结果。

  5. 返回 registryis

createElement()createElementNS()options 参数允许为字符串以实现 Web 兼容性。

createDocumentFragment() 方法的步骤是返回一个新的 DocumentFragment 节点,其节点文档此对象

createTextNode(data) 方法的步骤是返回一个新的 Text 节点,其数据data节点文档此对象

不检查 data 是否由与 Char 产生式匹配的字符组成。

createCDATASection(data) 方法的步骤如下:

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

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

  3. 返回一个新的 CDATASection 节点,其数据设置为 data节点文档设置为此对象

createComment(data) 方法的步骤是返回一个新的 Comment 节点,其数据data节点文档此对象

不检查 data 是否由与 Char 产生式匹配的字符组成,也不检查其是否包含两个相邻的连字符或以连字符结尾。

createProcessingInstruction(target, data) 方法的步骤如下:

  1. 如果 targetName 产生式不匹配, 则抛出一个“InvalidCharacterErrorDOMException
  2. 如果 data 包含字符串 “?>”,则抛出一个 “InvalidCharacterErrorDOMException
  3. 返回一个新的 ProcessingInstruction 节点,其目标设置为 target数据设置为 data节点文档设置为此对象

不检查 target 是否包含 “xml”或“:”,也不检查 data 是否包含与 Char 产生式匹配的字符。


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 设置为其值。

  6. 如果 registry 为 null,则将 registry 设置为给定此对象查找自定义元素注册表的结果。

  7. 返回给定 node 克隆节点的结果,其中文档设置为此对象子树设置为 subtree回退注册表设置为 registry

规范可以为所有或部分节点定义采纳步骤。如采纳算法中所示,该算法传递 nodeoldDocument

要将一个 node 采纳到一个 document 中,请执行以下步骤:

  1. oldDocumentnode节点文档

  2. 如果 node父节点非 null,则移除 node

  3. 如果 document 不是 oldDocument

    1. 对于 node包含阴影的包含性后代中的每个 inclusiveDescendant

      1. inclusiveDescendant节点文档设置为 document

      2. 如果 inclusiveDescendant 是一个元素,则将 inclusiveDescendant属性列表中每个属性节点文档设置为 document

    2. 对于 node包含阴影的包含性后代中每个自定义inclusiveDescendant将自定义元素回调反应入队,其中 inclusiveDescendant,回调名称为“adoptedCallback”,参数为 « oldDocument, document »。

    3. 对于 node包含阴影的包含性后代中的每个 inclusiveDescendant(按包含阴影的树顺序),使用 inclusiveDescendantoldDocument 运行采纳步骤

adoptNode(node) 方法的步骤如下:

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

  2. 如果 node 是一个影子根,则抛出一个 “HierarchyRequestErrorDOMException

  3. 如果 node 是一个 DocumentFragment 节点且其宿主非 null,则返回。

  4. node 采纳此对象中。

  5. 返回 node


createAttribute(localName)方法步骤如下:

  1. 如果 localName 与 XML 中的 Name 产生式不匹配, 则抛出一个“InvalidCharacterErrorDOMException

  2. 如果此对象是 一个HTML 文档,则将 localName 设置为 localNameASCII 小写形式。
  3. 返回一个新的属性,其本地名称localName节点文档此对象

createAttributeNS(namespace, qualifiedName) 方法的步骤是:

  1. namespaceprefixlocalName 为 将 namespacequalifiedName 传递给验证和提取的结果。

  2. 返回一个新的属性,其命名空间namespace命名空间前缀prefix本地名称localName,且节点文档此对象


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 指示的接口未在此对象相关全局对象上公开,则抛出一个 “NotSupportedErrorDOMException

    通常用户代理会在某些配置中禁用对触摸事件的支持,在这种情况下,对于接口 TouchEvent,将触发此子句。

  5. event 为给定 constructor 创建事件的结果。

  6. eventtype 属性初始化为空字符串。

  7. eventtimeStamp 属性初始化为使用此对象相关全局对象调用当前高精度时间的结果。

  8. eventisTrusted 属性初始化为 false。

  9. 取消设置 event初始化标志

  10. 返回 event

Event构造器应该被使用。


createRange() 方法的步骤是返回一个新的动态范围,以 (this, 0) 作为其起始点结束点

Range()构造器可以被使用。


createNodeIterator(root, whatToShow, filter)方法步骤如下:

  1. iterator 为一个新的 NodeIterator 对象。

  2. iterator根节点iterator引用节点设置为 root

  3. iterator引用前指针设置为 true。

  4. iteratorwhatToShow 设置为 whatToShow

  5. iterator过滤器设置为 filter

  6. 返回 iterator

createTreeWalker(root, whatToShow, filter) 方法的步骤是:

  1. walker 为一个新的 TreeWalker 对象。

  2. walker根节点walker当前节点设置为 root

  3. walkerwhatToShow 设置为 whatToShow

  4. walker过滤器设置为 filter

  5. 返回 walker

4.5.1.接口 DOMImplementation

用户代理必须在创建文档时创建一个 DOMImplementation 对象,并将其与该文档相关联。

[Exposed=Window]
interface DOMImplementation {
  [NewObject] DocumentType createDocumentType(DOMString qualifiedName, DOMString publicId, DOMString systemId);
  [NewObject] XMLDocument createDocument(DOMString? namespace, [LegacyNullToEmptyString] DOMString qualifiedName, optional DocumentType? doctype = null);
  [NewObject] Document createHTMLDocument(optional DOMString title);

  boolean hasFeature(); // useless; always returns true
};
doctype = document . implementation . createDocumentType(qualifiedName, publicId, systemId)
返回一个文档类型,具有给定的 qualifiedNamepublicIdsystemId。如果 qualifiedNameName 产生式不匹配,则抛出“InvalidCharacterErrorDOMException;如果与 QName 产生式不匹配,则抛出“NamespaceErrorDOMException
doc = document . implementation . createDocument(namespace, qualifiedName [, doctype = null])
返回一个 XMLDocument,其文档元素本地名称qualifiedName命名空间namespace(除非 qualifiedName 为空字符串),并且如果给定了 doctype,则将其作为其文档类型

当使用 namespacequalifiedName 调用时,此方法会抛出与 createElementNS() 方法相同的异常。

doc = document . implementation . createHTMLDocument([title])
返回一个文档,其中已构建了一个基本的,包括一个 title 元素,除非省略了 title 参数。

createDocumentType(qualifiedName, publicId, systemId) 方法的步骤是:

  1. 验证 qualifiedName

  2. 返回一个新的文档类型,其名称qualifiedName公共 IDpublicId系统 IDsystemId,并且其节点文档设置为此对象的关联文档

不检查 publicId 的代码点是否匹配 PubidChar 产生式,也不检查 systemId 是否同时包含 '"' 和 "'"。

createDocument(namespace, qualifiedName, doctype) 方法的步骤是:

  1. document 为一个新的 XMLDocument

  2. element 为 null。

  3. 如果 qualifiedName 不是空字符串,则将 element 设置为 运行内部 createElementNS 步骤的结果,给定 documentnamespacequalifiedName 和一个空字典。

  4. 如果 doctype 非 null,则将 doctype 追加document

  5. 如果 element 非 null,则将 element 追加document

  6. document此对象的关联文档

  7. document内容类型namespace 决定:

    HTML 命名空间
    application/xhtml+xml
    SVG 命名空间
    image/svg+xml
    任何其他命名空间
    application/xml
  8. 返回 document

createHTMLDocument(title) 方法的步骤是:

  1. doc 为一个新的文档,它是一个HTML 文档

  2. doc内容类型设置为“text/html”。

  3. 将一个新的文档类型(其名称为“html”,其节点文档设置为 doc追加doc

  4. 将给定 doc、“html”和HTML 命名空间创建元素的结果追加doc

  5. 将给定 doc、“head”和HTML 命名空间创建元素的结果追加到先前创建的 html 元素。

  6. 如果给定了 title

    1. 将给定 doc、“title”和HTML 命名空间创建元素的结果追加到先前创建的 head 元素。

    2. 将一个新的 Text 节点(其数据设置为 title(可能为空字符串),其节点文档设置为 doc追加到先前创建的 title 元素。

  7. 将给定 doc、“body”和HTML 命名空间创建元素的结果追加到先前创建的 html 元素。

  8. doc此对象的关联文档

  9. 返回 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

创建文档类型时,总是会给出其名称。除非在创建文档类型时明确指定,否则其公共 ID系统 ID 均为空字符串。

name getter 的步骤是返回此对象名称

publicId getter 的步骤是返回此对象公共 ID

systemId getter 的步骤是返回此对象系统 ID

4.7. 接口DocumentFragment

[Exposed=Window]
interface DocumentFragment : Node {
  constructor();
};

DocumentFragment 节点有一个关联的宿主(null 或不同节点树中的元素)。除非另有说明,否则它为 null。

如果对象 A 是对象 B包含性祖先,或者如果 B根节点具有非 null 的宿主并且 AB根节点宿主包含宿主的包含性祖先,则对象 A 是对象 B包含宿主的包含性祖先

DocumentFragment 节点宿主概念对于 HTML 的 template 元素和影子根很有用,并且会影响预插入替换算法。

tree = new DocumentFragment()
返回一个新的 DocumentFragment 节点

new DocumentFragment() 构造函数的步骤是将此对象节点文档设置为当前全局对象关联的 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 getter 的步骤是返回此对象模式

delegatesFocus getter 的步骤是返回此对象委托焦点

slotAssignment getter 的步骤是返回此对象插槽分配

clonable getter 的步骤是返回此对象可克隆

serializable getter 的步骤是返回此对象可序列化

host getter 的步骤是返回此对象宿主


onslotchange 属性是一个事件处理程序 IDL 属性,用于onslotchange 事件处理程序,其事件处理程序事件类型slotchange


包含影子的树顺序节点树包含影子的先序深度优先遍历节点树 tree包含影子的先序深度优先遍历tree 的先序深度优先遍历,对于在 tree 中遇到的每个影子宿主,在其遇到之后立即对该元素影子根节点树进行包含影子的先序深度优先遍历

一个对象的包含影子的根是其宿主包含影子的根(如果该对象的是一个影子根);否则是其

如果对象 A 是对象 B后代,或者 A是一个影子根并且 A宿主B包含影子的包含性后代,则对象 A 是对象 B包含影子的后代

包含影子的包含性后代是一个对象或其包含影子的后代之一。

当且仅当 BA包含影子的后代时,对象 A 是对象 B包含影子的祖先

包含影子的包含性祖先是一个对象或其包含影子的祖先之一。

如果以下所有条件都为真,则节点 A 对于节点 B闭合影子隐藏的:

要针对对象 B 重定向对象 A,请重复这些步骤,直到它们返回一个对象:

  1. 如果以下情况之一为真:

    则返回 A

  2. A 设置为 A宿主

重定向算法被事件分派以及其他规范(例如 Fullscreen)使用。[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, DOMString value);
  [CEReactions] undefined setAttributeNS(DOMString? namespace, DOMString qualifiedName, 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;
};

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() intentionally omitted for this example
    }
  })
</script>

<!-- "undefined" (not defined, not custom) -->
<sw-han></sw-han>
<p is="sw-luke"></p>
<p is="asdf"></p>

<!-- "failed" (not defined, not custom) -->
<sw-kylo></sw-kylo>

<!-- "uncustomized" (defined, not custom) -->
<p></p>
<asdf></asdf>

<!-- "custom" (defined, custom) -->
<sw-rey></sw-rey>
<p is="sw-finn"></p>

元素还有一个关联的影子根(null 或一个影子根)。除非另有说明,否则它为 null。如果一个元素影子根非 null,则该元素是一个影子宿主

一个元素限定名是其本地名称(如果其命名空间前缀为 null);否则是其命名空间前缀,后跟“:”,再后跟其本地名称

一个元素HTML 大写限定名是以下步骤的返回值:

  1. qualifiedName此对象限定名

  2. 如果此对象HTML 命名空间中,并且其节点文档是一个HTML 文档,则将 qualifiedName 设置为 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 对象的关联领域全局对象报告 exception

      2. result自定义元素状态设置为 "failed"。

    4. 否则,给定 resultdefinition 将自定义元素升级反应加入队列

  5. 否则,如果 definition 非 null:

    1. 如果 synchronousCustomElements 为 true:

      1. Cdefinition构造函数

      2. 设置周围代理活动自定义元素构造函数映射[C] 为 registry

      3. 在捕获任何异常的同时运行这些步骤:

        1. result 设置为构造 C(无参数)的结果。

        2. 断言:result自定义元素状态自定义元素定义已初始化。

        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 对象的关联领域全局对象报告 exception

        2. result 设置为给定 documentHTMLUnknownElementlocalNameHTML 命名空间prefix、"failed"、null 和 registry 创建元素内部的结果。

      4. 移除周围代理活动自定义元素构造函数映射[C]。

        在正常情况下,此时它已经被移除了。

    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 为一个实现 interface 的新元素,其命名空间设置为 namespace命名空间前缀设置为 prefix本地名称设置为 localName自定义元素注册表设置为 registry自定义元素状态设置为 state自定义元素定义设置为 null,is设置为 is节点文档设置为 document

  2. 断言element属性列表为空

  3. 返回 element

元素还有一个属性列表,它是一个通过 NamedNodeMap 公开的列表。除非在创建元素时明确指定,否则其属性列表为空

如果一个元素属性列表包含属性 A,则该元素拥有属性 A

本规范和其他适用规范可以为元素定义属性更改步骤。该算法传递 elementlocalNameoldValuevaluenamespace

要为一个属性 attribute(具有 elementoldValuenewValue处理属性更改,请运行以下步骤:

  1. element 将一个突变记录加入队列,类型为 "attributes",具有 attribute本地名称attribute命名空间oldValue、« »、« »、null 和 null。

  2. 如果 element自定义的,则将一个自定义元素回调反应加入队列,其中包含 element,回调名称为 "attributeChangedCallback",参数为 « attribute本地名称oldValuenewValueattribute命名空间 »。

  3. 使用 elementattribute本地名称oldValuenewValueattribute命名空间运行属性更改步骤

要将一个属性 attribute 更改value,请运行以下步骤:

  1. oldValueattribute

  2. attribute设置为 value

  3. attribute(具有 attribute元素oldValuevalue处理属性更改

要将一个属性 attribute 追加到一个元素 element,请运行以下步骤:

  1. attribute 追加element属性列表

  2. attribute元素设置为 element

  3. attribute节点文档设置为 element节点文档

  4. attribute(具有 element、null 和 attribute处理属性更改

移除一个属性 attribute,请运行以下步骤:

  1. elementattribute元素

  2. element属性列表移除 attribute

  3. attribute元素设置为 null。

  4. attribute(具有 elementattribute和 null)处理属性更改

要用一个属性 newAttribute 替换一个属性 oldAttribute

  1. elementoldAttribute元素

  2. element属性列表中用 newAttribute 替换 oldAttribute

  3. newAttribute元素设置为 element

  4. newAttribute节点文档设置为 element节点文档

  5. oldAttribute元素设置为 null。

  6. oldAttribute(具有 elementoldAttributenewAttribute处理属性更改


要通过给定字符串 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. 如果 attr元素既不为 null 也不为 element,则抛出一个“InUseAttributeErrorDOMException

  2. oldAttr 为通过给定 attr命名空间attr本地名称element 获取特性的结果。

  3. 如果 oldAttrattr,则返回 attr

  4. 如果 oldAttr 非 null,则用 attr 替换 oldAttr

  5. 否则,将 attr 追加element

  6. 返回 oldAttr

要通过给定一个元素 element、一个字符串 localName、一个字符串 value、一个可选的 null 或字符串 prefix(默认为 null)以及一个可选的 null 或字符串 namespace(默认为 null)设置特性值

  1. attribute 为通过给定 namespacelocalNameelement 获取特性的结果。
  2. 如果 attribute 为 null,则创建一个特性,其命名空间namespace命名空间前缀prefix本地名称localNamevalue,并且节点文档element节点文档,然后将此特性追加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

  1. 如果 localNameidnamespace 是 null,并且 value 是 null 或空字符串,则取消设置 elementID

  2. 否则,如果 localNameidnamespace 是 null,则将 elementID设置为 value

虽然本规范定义了任何元素classidslot 特性的要求,但它并未声明使用它们是否符合规范。


一个节点的类型为 Element父节点被称为其父元素。如果节点具有不同类型的父节点,则其父元素为 null。


namespace = element . namespaceURI
返回命名空间
prefix = element . prefix
返回命名空间前缀
localName = element . localName
返回本地名称
qualifiedName = element . tagName
返回HTML 大写限定名

namespaceURI getter 的步骤是返回此对象命名空间

prefix getter 的步骤是返回此对象命名空间前缀

localName getter 的步骤是返回此对象本地名称

tagName getter 的步骤是返回此对象HTML 大写限定名


element . id [ = value ]

返回 elementid 内容特性的值。可以设置以更改它。

element . className [ = value ]

返回 elementclass 内容特性的值。可以设置以更改它。

element . classList

允许通过 DOMTokenList 对象将 elementclass 内容特性作为一组以空格分隔的标记进行操作。

element . slot [ = value ]

返回 elementslot 内容特性的值。可以设置以更改它。

定义为反映字符串 name 的 IDL 特性必须具有以下 getter 和 setter 步骤:

getter 步骤

返回运行获取特性值(给定此对象name)的结果。

setter 步骤

此对象设置属性值,使用 name 和给定值。

id 特性必须反映 "id"。

className 特性必须反映 "class"。

classList getter 的步骤是返回一个 DOMTokenList 对象,其关联的元素此对象,并且其关联的特性本地名称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 的第一个特性(其限定名qualifiedName)的设置为 value

element . setAttributeNS(namespace, localName, value)

element特性(其命名空间namespace本地名称localName)的设置为 value

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。

hasAttributes() 方法的步骤是:如果此对象特性列表为空,则返回 false;否则返回 true。

attributes getter 的步骤是返回关联的 NamedNodeMap

getAttributeNames() 方法的步骤是按顺序返回此对象特性列表特性限定名;否则返回一个新的列表

这些不保证是唯一的。

getAttribute(qualifiedName) 方法的步骤是:

  1. attr 为通过给定 qualifiedName此对象获取特性的结果。

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

  3. 返回 attr

getAttributeNS(namespace, localName) 方法的步骤是:

  1. attr 为通过给定 namespacelocalName此对象获取特性的结果。

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

  3. 返回 attr

setAttribute(qualifiedName, value) 方法的步骤是:

  1. 如果 qualifiedName 与 XML 中的 Name产生式不匹配,则抛出一个“InvalidCharacterErrorDOMException

  2. 如果此对象位于HTML 命名空间中,并且其节点文档是一个HTML 文档,则将 qualifiedName 设置为 qualifiedNameASCII 小写形式。

  3. attribute此对象特性列表中第一个特性,其限定名qualifiedName;否则为 null。

  4. 如果 attribute 为 null,则创建一个特性,其本地名称qualifiedNamevalue,并且节点文档此对象节点文档,然后将此特性追加此对象,然后返回。

  5. attribute 更改value

setAttributeNS(namespace, qualifiedName, value) 方法的步骤是:

  1. namespaceprefixlocalName 为将 namespacequalifiedName 传递给验证和提取的结果。

  2. 此对象设置属性值,使用 localNamevalue,以及 prefixnamespace

removeAttribute(qualifiedName) 方法的步骤是:通过给定 qualifiedName此对象移除特性,然后返回 undefined。

removeAttributeNS(namespace, localName) 方法的步骤是:通过给定 namespacelocalName此对象移除特性,然后返回 undefined。

hasAttribute(qualifiedName) 方法的步骤是:

  1. 如果此对象位于HTML 命名空间中,并且其节点文档是一个HTML 文档,则将 qualifiedName 设置为 qualifiedNameASCII 小写形式。

  2. 如果此对象具有一个特性,其限定名qualifiedName,则返回 true;否则返回 false。

toggleAttribute(qualifiedName, force) 方法的步骤是:

  1. 如果 qualifiedName 与 XML 中的 Name产生式不匹配,则抛出一个“InvalidCharacterErrorDOMException

  2. 如果此对象位于HTML 命名空间中,并且其节点文档是一个HTML 文档,则将 qualifiedName 设置为 qualifiedNameASCII 小写形式。

  3. attribute此对象特性列表中第一个特性,其限定名qualifiedName;否则为 null。

  4. 如果 attribute 为 null:

    1. 如果未给出 forceforce 为 true,则创建一个特性,其本地名称qualifiedName为空字符串,并且节点文档此对象节点文档,然后将此特性追加此对象,然后返回 true。

    2. 返回 false。

  5. 否则,如果未给出 forceforce 为 false,则通过给定 qualifiedName此对象移除特性,然后返回 false。

  6. 返回 true。

hasAttributeNS(namespace, localName) 方法的步骤是:

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

  2. 如果此对象具有一个特性,其命名空间namespace本地名称localName,则返回 true;否则返回 false。

getAttributeNode(qualifiedName) 方法的步骤是返回通过给定 qualifiedName此对象获取特性的结果。

getAttributeNodeNS(namespace, localName) 方法的步骤是返回通过给定 namespacelocalName此对象获取特性的结果。

setAttributeNode(attr)setAttributeNodeNS(attr) 方法的步骤是返回通过给定 attr此对象设置特性的结果。

removeAttributeNode(attr) 方法的步骤是:

  1. 如果此对象特性列表包含 attr,则抛出一个“NotFoundErrorDOMException

  2. 移除 attr

  3. 返回 attr


shadow = element . attachShadow(init)

element 创建一个影子根并返回它。

shadow = element . shadowRoot

返回 element影子根(如果存在),并且如果影子根模式是 "open";否则返回 null。

一个有效的影子宿主名称是:

attachShadow(init) 方法的步骤是:

  1. registry此对象自定义元素注册表

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

  3. 使用此对象init["mode"]、init["clonable"]、init["serializable"]、init["delegatesFocus"]、init["slotAssignment"] 和 registry 运行附加影子根

  4. 返回此对象影子根

附加影子根,给定一个元素 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

      抛出一个“NotSupportedErrorDOMException

    3. 否则:

      1. 树顺序移除 currentShadowRoot 的所有子节点

      2. currentShadowRoot声明性设置为 false。

      3. 返回。

  5. shadow 为一个新的影子根,其节点文档element节点文档宿主element模式mode

  6. shadow委托焦点设置为 delegatesFocus

  7. 如果 element自定义元素状态是 "precustomized" 或 "custom",则将 shadow对元素内部可用设置为 true。

  8. shadow插槽分配设置为 slotAssignment

  9. shadow声明性设置为 false。

  10. shadow可克隆性设置为 clonable

  11. shadow可序列化性设置为 serializable

  12. shadow自定义元素注册表设置为 registry

  13. element影子根设置为 shadow

shadowRoot getter 的步骤是:

  1. shadow此对象影子根

  2. 如果 shadow 为 null 或其模式为 "closed",则返回 null。

  3. 返回 shadow


registry = element . customElementRegistry

返回 elementCustomElementRegistry 对象(如果存在);否则返回 null。

customElementRegistry getter 的步骤是返回此对象自定义元素注册表


element . closest(selectors)
返回第一个(从 element 开始)匹配 selectors包含祖先;否则返回 null。
element . matches(selectors)
如果针对 element匹配 selectors 得到 element,则返回 true;否则返回 false。

closest(selectors) 方法的步骤是:

  1. s 为从 selectors 解析选择器的结果。[SELECTORS4]

  2. 如果 s 失败,则抛出一个“SyntaxErrorDOMException

  3. elements此对象包含祖先中属于元素的部分,按反向树顺序排列。

  4. 对于 elements 中的每个 element,如果使用 selement作用域根此对象针对元素匹配选择器返回成功,则返回 element[SELECTORS4]

  5. 返回 null。

matches(selectors)webkitMatchesSelector(selectors) 方法的步骤是:

  1. s 为从 selectors 解析选择器的结果。[SELECTORS4]

  2. 如果 s 失败,则抛出一个“SyntaxErrorDOMException

  3. 如果使用 s此对象作用域根此对象针对元素匹配选择器的结果返回成功,则返回 true;否则返回 false。[SELECTORS4]


getElementsByTagName(qualifiedName) 方法的步骤是返回此对象具有限定名 qualifiedName 的元素列表

getElementsByTagNameNS(namespace, localName) 方法的步骤是返回此对象具有命名空间 namespace 和本地名称 localName 的元素列表

getElementsByClassName(classNames) 方法的步骤是返回此对象具有类名 classNames 的元素列表


插入相邻内容,给定一个元素 element、字符串 where 和一个节点 node,运行与 where 的第一个ASCII 不区分大小写匹配关联的步骤:

"beforebegin"

如果 element父节点为 null,则返回 null。

返回将 node 预插入element父节点element 之前的结果。

"afterbegin"

返回将 node 预插入elementelement第一个子节点之前的结果。

"beforeend"

返回将 node 预插入element 中 null 之前的结果。

"afterend"

如果 element父节点为 null,则返回 null。

返回将 node 预插入element父节点element下一个兄弟节点之前的结果。

否则

抛出一个“SyntaxErrorDOMException

insertAdjacentElement(where, element) 方法的步骤是返回运行插入相邻(给定此对象whereelement)的结果。

insertAdjacentText(where, data) 方法的步骤是:

  1. text 为一个新的 Text 节点,其数据data节点文档此对象节点文档

  2. 运行插入相邻(给定此对象wheretext)。

此方法不返回任何内容,因为在我们有机会设计它之前它就已经存在了。

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 对象的支持的属性索引是指从零到其属性列表大小减一范围内的数字,除非该属性列表为空,在这种情况下,没有支持的属性索引

length getter 的步骤是返回该属性列表大小

item(index) 方法的步骤是:

  1. 如果 index 等于或大于此对象属性列表大小,则返回 null。

  2. 否则,返回此对象属性列表[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; // useless; always returns true
};

Attr 节点通常被称为属性。它们有时被称为内容属性,以避免与 IDL 属性混淆。

属性具有命名空间(null 或非空字符串)、命名空间前缀(null 或非空字符串)、本地名称(非空字符串)、(一个字符串)和元素(null 或一个元素)。

如果今天设计,它们将只具有名称和值。☹

一个属性限定名称是其本地名称(如果其命名空间前缀为 null),否则是其命名空间前缀,后跟“:”,再后跟其本地名称

用户代理可以将此作为内部槽以进行优化。

当创建属性时,会给出其本地名称。除非在创建属性时明确给出,否则其命名空间命名空间前缀元素将设置为空,并且其将设置为空字符串。

一个A 属性是一个属性,其本地名称A,并且其命名空间命名空间前缀为空。


namespaceURI getter 的步骤是返回此对象命名空间

prefix getter 的步骤是返回此对象命名空间前缀

localName getter 的步骤是返回此对象本地名称

name getter 的步骤是返回此对象限定名称

value getter 的步骤是返回此对象

设置现有属性值,给定一个属性 attribute 和字符串 value,请运行以下步骤:

  1. 如果 attribute元素为 null,则将 attribute设置为 value

  2. 否则,将 attribute 更改value

value setter 的步骤是使用此对象和给定值设置现有属性值


ownerElement getter 的步骤是返回此对象元素


specified getter 的步骤是返回 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 接口的节点都有一个关联的可变字符串,称为data

替换数据(节点 node,偏移量 offset,计数 count,数据 data),请执行以下步骤:

  1. lengthnode长度
  2. 如果 offset 大于 length,则抛出一个“IndexSizeErrorDOMException
  3. 如果 offset 加上 count 大于 length,则将 count 设置为 length 减去 offset
  4. node 加入一个突变记录队列,类型为“characterData”,属性为 null、null、nodedata、« »、« »、null 和 null。

  5. nodedata 中,在 offset代码单元之后插入 data
  6. delete offsetoffset + data长度
  7. delete offset代码单元开始,从 nodedata 中移除 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父节点非空,则为 node父节点运行子节点更改步骤

获取子字符串数据(节点 node,偏移量 offset,计数 count),请执行以下步骤:

  1. lengthnode长度
  2. 如果 offset 大于 length,则抛出一个“IndexSizeErrorDOMException
  3. 如果 offset 加上 count 大于 length,则返回一个字符串,其值为从 nodedata 中第 offset代码单元到末尾的代码单元,然后返回。
  4. 返回一个字符串,其值为 nodedata 中从第 offset代码单元到第 offset+count代码单元代码单元

data getter 的步骤是返回此对象data。其 setter 必须使用节点此对象、偏移量 0、计数此对象长度和数据新值来替换数据

length getter 的步骤是返回此对象长度

substringData(offset, count) 方法的步骤是返回运行获取子字符串数据(节点此对象,偏移量 offset,计数 count)的结果。

appendData(data) 方法的步骤是使用节点此对象、偏移量此对象长度、计数 0 和数据 data替换数据

insertData(offset, data) 方法的步骤是使用节点此对象、偏移量 offset、计数 0 和数据 data替换数据

deleteData(offset, count) 方法的步骤是使用节点此对象、偏移量 offset、计数 count 和数据空字符串来替换数据

replaceData(offset, count, data) 方法的步骤是使用节点此对象、偏移量 offset、计数 count 和数据 data替换数据

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 节点,其 datadata
text . splitText(offset)
在给定的 offset 处分割 data,并将余下部分作为 Text 节点返回。
text . wholeText
返回所有直接 Text 节点 兄弟节点的组合 data

一个排他的 Text 节点是一个Text 节点,它不是一个 CDATASection 节点

一个节点 node连续 Text 节点包括 node 本身,node前一个兄弟 Text 节点(如果存在)及其连续的 Text 节点,以及 node后一个兄弟 Text 节点(如果存在)及其连续的 Text 节点,并避免任何重复。

一个节点 node连续排他的 Text 节点包括 node 本身,node前一个兄弟排他的 Text 节点(如果存在)及其连续排他的 Text 节点,以及 node后一个兄弟排他的 Text 节点(如果存在)及其连续排他的 Text 节点,并避免任何重复。

一个节点 node子文本内容node 的所有 Text 节点 子节点data 按照树顺序连接的结果。

一个节点 node后代文本内容node 的所有 Text 节点 后代节点data 按照树顺序连接的结果。


new Text(data) 构造函数的步骤是将此对象data 设置为 data,并将此对象节点文档设置为当前全局对象关联的 Document

分割一个 Text 节点 node(偏移量为 offset),请执行以下步骤:

  1. lengthnode长度
  2. 如果 offset 大于 length,则抛出一个“IndexSizeErrorDOMException
  3. countlength 减去 offset
  4. new data 为使用节点 node、偏移量 offset 和计数 count 获取子字符串数据的结果。
  5. new node 为一个新的 Text 节点,其节点文档node 相同。将 new nodedata 设置为 new data
  6. parentnode父节点
  7. 如果 parent 不为 null:

    1. node后一个兄弟节点之前,将 new node 插入parent 中。

    2. 对于每个活动范围,如果其起始节点node 并且其起始偏移量大于 offset,则将其起始节点设置为 new node,并将其起始偏移量减去 offset

    3. 对于每个活动范围,如果其结束节点node 并且其结束偏移量大于 offset,则将其结束节点设置为 new node,并将其结束偏移量减去 offset

    4. 对于每个活动范围,如果其起始节点parent 并且其起始偏移量等于 node索引加 1,则将其起始偏移量增加 1。

    5. 对于每个活动范围,如果其结束节点parent 并且其结束偏移量等于 node索引加 1,则将其结束偏移量增加 1。

  8. 使用节点 node、偏移量 offset、计数 count 和数据空字符串替换数据
  9. 返回 new node

splitText(offset) 方法的步骤是使用偏移量 offset 分割此对象

wholeText getter 的步骤是返回此对象连续 Text 节点data 按照树顺序连接的结果。

4.12. 接口 CDATASection

[Exposed=Window]
interface CDATASection : Text {
};

4.13. 接口 ProcessingInstruction

[Exposed=Window]
interface ProcessingInstruction : CharacterData {
  readonly attribute DOMString target;
};

ProcessingInstruction 节点有一个关联的目标

target getter 的步骤是返回此对象目标

4.14. 接口 注释

[Exposed=Window]
interface Comment : CharacterData {
  constructor(optional DOMString data = "");
};
comment = new Comment([data = ""])
返回一个新的 Comment 节点,其 datadata

new Comment(data) 构造函数的步骤是将此对象data 设置为 data,并将此对象节点文档设置为当前全局对象关联的 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) // do not forget the leading space
range.setEnd(secondText, 4)
// range now stringifies to the aforementioned quote

像上面节点树中的 srcalt 这样的属性不能用范围来表示。范围仅对节点有用。

Range 对象与 StaticRange 对象不同,它会受到节点树突变的影响。因此它们也被称为活动范围。此类突变不会使其失效,并将尝试确保它仍然表示相同的内容片段。必要时,当例如它所表示的部分内容发生突变时,活动范围本身可能会作为节点树突变的一部分而被修改。

有关详细信息,请参阅插入移除算法、normalize() 方法以及替换数据分割算法。

响应节点树突变来更新活动范围的成本可能很高。对于节点树的每次更改,所有受影响的 Range 对象都需要更新。即使应用程序对某些活动范围不感兴趣,当发生突变时,它仍然必须支付保持它们最新的成本。

一个 StaticRange 对象是一个轻量级的范围,当节点树发生突变时它不会更新。因此,它不像活动范围那样需要相同的维护成本。

5.2. Boundary points

一个边界点是一个由节点(一个节点)和一个偏移量(一个非负整数)组成的元组

一个正确的边界点偏移量将在 0 和该边界点节点长度之间(包含边界)。

一个边界点 (nodeA, offsetA) 相对于另一个边界点 (nodeB, offsetB) 的位置之前相等之后,具体由以下步骤返回:

  1. 断言:nodeAnodeB 具有相同的

  2. 如果 nodeAnodeB 相同,则如果 offsetAoffsetB 相同,则返回相等;如果 offsetA 小于 offsetB,则返回之前;如果 offsetA 大于 offsetB,则返回之后
  3. 如果 nodeA nodeB 之后,则如果 (nodeB, offsetB) 相对于 (nodeA, offsetA) 的位置之前,则返回之后;如果它是之后,则返回之前

  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 getter 的步骤是返回此对象起始节点

startOffset getter 的步骤是返回此对象起始偏移量

endContainer getter 的步骤是返回此对象结束节点

endOffset getter 的步骤是返回此对象结束偏移量

collapsed getter 的步骤是:如果此对象折叠的,则返回 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. 此对象起始点设置为 (init["startContainer"], init["startOffset"]),并将结束点设置为 (init["endContainer"], init["endOffset"])。

如果以下所有条件均为真,则 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 接口的对象被称为活动范围

修改的算法(特别是插入移除移动替换数据分割算法)会修改与该关联的活动范围

活动范围是其起始节点

如果一个节点 node活动范围 range相同,并且 (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() 构造函数的步骤是将此对象起始点结束点设置为 (当前全局对象关联的 Document, 0)。


container = range . commonAncestorContainer
返回距离文档最远,并且是 range起始节点结束节点祖先节点

commonAncestorContainer getter 的步骤是:

  1. container起始节点
  2. container 不是结束节点包含祖先时,令 containercontainer父节点
  3. 返回 container

要将range起始点或结束点设置为一个边界点 (node, offset),请执行以下步骤:

  1. 如果 node 是一个文档类型节点,则抛出一个“InvalidNodeTypeErrorDOMException
  2. 如果 offset 大于 node长度,则抛出一个“IndexSizeErrorDOMException
  3. bp边界点 (node, offset)。
  4. 如果这些步骤是作为“设置起始点”调用的
    1. 如果 range不等于 node,或者如果 bp range结束点之后,则将 range结束点设置为 bp
    2. range起始点设置为 bp
    如果这些步骤是作为“设置结束点”调用的
    1. 如果 range不等于 node,或者如果 bp range起始点之前,则将 range起始点设置为 bp
    2. range结束点设置为 bp

setStart(node, offset) 方法的步骤是将此对象起始点设置边界点 (node, offset)。

setEnd(node, offset) 方法的步骤是将此对象结束点设置边界点 (node, offset)。

setStartBefore(node) 方法的步骤是:

  1. parentnode父节点
  2. 如果 parent 为 null,则抛出一个“InvalidNodeTypeErrorDOMException
  3. 此对象起始点设置边界点 (parent, node索引)。

setStartAfter(node) 方法的步骤是:

  1. parentnode父节点

  2. 如果 parent 为 null,则抛出一个“InvalidNodeTypeErrorDOMException

  3. 此对象起始点设置边界点 (parent, node索引加 1)。

setEndBefore(node) 方法的步骤是:

  1. parentnode父节点
  2. 如果 parent 为 null,则抛出一个“InvalidNodeTypeErrorDOMException
  3. 此对象结束点设置边界点 (parent, node索引)。

setEndAfter(node) 方法的步骤是:

  1. parentnode父节点

  2. 如果 parent 为 null,则抛出一个“InvalidNodeTypeErrorDOMException

  3. 此对象结束点设置边界点 (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) 方法的步骤是在此对象选择 node

selectNodeContents(node) 方法的步骤是:

  1. 如果 node 是一个文档类型节点,则抛出一个“InvalidNodeTypeErrorDOMException

  2. lengthnode长度

  3. 起始点设置为边界点 (node, 0)。

  4. 结束点设置为边界点 (node, length)。


compareBoundaryPoints(how, sourceRange) 方法的步骤是:

  1. 如果 how 不是以下之一:

    抛出一个“NotSupportedErrorDOMException

  2. 如果此对象sourceRange不同,则抛出一个“WrongDocumentErrorDOMException
  3. 如果 how 是:
    START_TO_START
    this point此对象起始点。 令 other pointsourceRange起始点
    START_TO_END
    this point此对象结束点。 令 other pointsourceRange起始点
    END_TO_END
    this point此对象结束点。 令 other pointsourceRange结束点
    END_TO_START
    this point此对象起始点。 令 other pointsourceRange结束点
  4. 如果 this point 相对于 other point位置是:

    之前
    返回 −1。
    相等
    返回 0。
    之后
    返回 1。

deleteContents() 方法的步骤是:

  1. 如果此对象折叠的,则返回。

  2. original start nodeoriginal start offsetoriginal end nodeoriginal end offset 分别为此对象起始节点起始偏移量结束节点结束偏移量
  3. 如果 original start nodeoriginal end node 相同且它是一个 CharacterData 节点,则使用节点 original start node、偏移量 original start offset、计数 original end offset 减去 original start offset 以及数据空字符串替换数据,然后返回。

  4. nodes to remove 为一个列表,其中包含所有包含在此对象中的节点,按树顺序排列,并省略任何其父节点包含在此对象中的节点
  5. 如果 original start nodeoriginal end node包含祖先,则将 new node 设置为 original start node,并将 new offset 设置为 original start offset
  6. 否则:
    1. reference node 等于 original start node
    2. reference node父节点不为 null 且不是 original end node包含祖先时,将 reference node 设置为其父节点
    3. new node 设置为 reference node父节点,并将 new offset 设置为 reference node索引加 1。

      如果 reference node父节点为 null,则它将是此对象,因此将是 original end node包含祖先,我们无法到达此点。

  7. 如果 original start node 是一个 CharacterData 节点,则使用节点 original start node、偏移量 original start offset、计数 original start node长度original start offset 以及数据空字符串替换数据

  8. 对于 nodes to remove 中的每个 node,按树顺序移除 node

  9. 如果 original end node 是一个 CharacterData 节点,则使用节点 original end node、偏移量 0、计数 original end offset 以及数据空字符串替换数据

  10. 起始点结束点设置为 (new node, new offset)。

提取一个活动范围 range,请执行以下步骤:

  1. fragment 为一个新的 DocumentFragment 节点,其节点文档range起始节点节点文档

  2. 如果 range折叠的,则返回 fragment

  3. original start nodeoriginal start offsetoriginal end nodeoriginal end offset 分别为 range起始节点起始偏移量结束节点结束偏移量
  4. 如果 original start nodeoriginal end node 相同且它是一个 CharacterData 节点

    1. cloneoriginal start node 的一个克隆
    2. clone数据设置为使用节点 original start node、偏移量 original start offset 以及计数 original end offset 减去 original start offset 获取子字符串数据的结果。
    3. clone 追加fragment
    4. 使用节点 original start node、偏移量 original start offset、计数 original end offset 减去 original start offset 以及数据空字符串替换数据
    5. 返回 fragment
  5. common ancestororiginal start node
  6. common ancestor 不是 original end node包含祖先时,将 common ancestor 设置为其自身的父节点
  7. first partially contained child 为 null。
  8. 如果 original start node 不是 original end node包含祖先,则将 first partially contained child 设置为 common ancestor 的第一个部分包含在 range 中的子节点
  9. last partially contained child 为 null。
  10. 如果 original end node 不是 original start node包含祖先,则将 last partially contained child 设置为 common ancestor 的最后一个部分包含在 range 中的子节点

    这些变量赋值实际上总是合理的。例如,如果 original start node 不是 original end node包含祖先,则 original start node 本身部分包含在 range 中,其所有祖先直到 common ancestor 的一个子节点也是如此。common ancestor 不能是 original start node,因为它必须是 original end node包含祖先。另一种情况类似。另外,请注意,如果两个子节点都已定义,则它们永远不会相等。

  11. contained children 为一个列表,其中包含 common ancestor 的所有包含在 range 中的子节点,按树顺序排列。
  12. 如果 contained children 中的任何成员是文档类型节点,则抛出一个“HierarchyRequestErrorDOMException

    我们不必担心第一个或最后一个部分包含的节点,因为文档类型节点永远不能部分包含。它不能是范围的边界点,也不能是任何东西的祖先。

  13. 如果 original start nodeoriginal end node包含祖先,则将 new node 设置为 original start node,并将 new offset 设置为 original start offset
  14. 否则:
    1. reference node 等于 original start node
    2. reference node父节点不为 null 且不是 original end node包含祖先时,将 reference node 设置为其父节点
    3. new node 设置为 reference node父节点,并将 new offset 设置为 reference node索引加 1。

      如果 reference node父节点为 null,则它将是 range,因此将是 original end node包含祖先,我们无法到达此点。

  15. 如果 first partially contained child 是一个 CharacterData 节点

    在这种情况下,first partially contained childoriginal start node

    1. cloneoriginal start node 的一个克隆

    2. clone数据设置为使用节点 original start node、偏移量 original start offset 以及计数 original start node长度original start offset 获取子字符串数据的结果。

    3. clone 追加fragment

    4. 使用节点 original start node、偏移量 original start offset、计数 original start node长度original start offset 以及数据空字符串替换数据

  16. 否则,如果 first partially contained child 不为 null:
    1. clonefirst partially contained child 的一个克隆
    2. clone 追加fragment
    3. subrange 为一个新的活动范围,其起始点为 (original start node, original start offset),其结束点为 (first partially contained child, first partially contained child长度)。
    4. subfragment提取 subrange 的结果。

    5. subfragment 追加clone
  17. 对于 contained children 中的每个 contained child,将 contained child 追加fragment
  18. 如果 last partially contained child 是一个 CharacterData 节点

    在这种情况下,last partially contained childoriginal end node

    1. cloneoriginal end node 的一个克隆
    2. clone数据设置为使用节点 original end node、偏移量 0 以及计数 original end offset 获取子字符串数据的结果。
    3. clone 追加fragment
    4. 使用节点 original end node、偏移量 0、计数 original end offset 以及数据空字符串替换数据
  19. 否则,如果 last partially contained child 不为 null:
    1. clonelast partially contained child 的一个克隆
    2. clone 追加fragment
    3. subrange 为一个新的活动范围,其起始点为 (last partially contained child, 0),其结束点为 (original end node, original end offset)。
    4. subfragment提取 subrange 的结果。

    5. subfragment 追加clone
  20. range起始点结束点设置为 (new node, new offset)。
  21. 返回 fragment

extractContents() 方法的步骤是返回提取此对象的结果。

克隆内容一个活动范围 range,请执行以下步骤:

  1. fragment 为一个新的 DocumentFragment 节点,其节点文档range起始节点节点文档

  2. 如果 range折叠的,则返回 fragment

  3. original start nodeoriginal start offsetoriginal end nodeoriginal end offset 分别为 range起始节点起始偏移量结束节点结束偏移量
  4. 如果 original start nodeoriginal end node 相同且它是一个 CharacterData 节点

    1. cloneoriginal start node 的一个克隆
    2. clone数据设置为使用节点 original start node、偏移量 original start offset 以及计数 original end offset 减去 original start offset 获取子字符串数据的结果。
    3. clone 追加fragment
    4. 返回 fragment
  5. common ancestororiginal start node
  6. common ancestor 不是 original end node包含祖先时,将 common ancestor 设置为其自身的父节点
  7. first partially contained child 为 null。
  8. 如果 original start node 不是 original end node包含祖先,则将 first partially contained child 设置为 common ancestor 的第一个部分包含在 range 中的子节点
  9. last partially contained child 为 null。
  10. 如果 original end node 不是 original start node包含祖先,则将 last partially contained child 设置为 common ancestor 的最后一个部分包含在 range 中的子节点

    这些变量赋值实际上总是合理的。例如,如果 original start node 不是 original end node包含祖先,则 original start node 本身部分包含在 range 中,其所有祖先直到 common ancestor 的一个子节点也是如此。common ancestor 不能是 original start node,因为它必须是 original end node包含祖先。另一种情况类似。另外,请注意,如果两个子节点都已定义,则它们永远不会相等。

  11. contained children 为一个列表,其中包含 common ancestor 的所有包含在 range 中的子节点,按树顺序排列。
  12. 如果 contained children 中的任何成员是文档类型节点,则抛出一个“HierarchyRequestErrorDOMException

    我们不必担心第一个或最后一个部分包含的节点,因为文档类型节点永远不能部分包含。它不能是范围的边界点,也不能是任何东西的祖先。

  13. 如果 first partially contained child 是一个 CharacterData 节点

    在这种情况下,first partially contained childoriginal start node

    1. cloneoriginal start node 的一个克隆

    2. clone数据设置为使用节点 original start node、偏移量 original start offset 以及计数 original start node长度original start offset 获取子字符串数据的结果。

    3. clone 追加fragment

  14. 否则,如果 first partially contained child 不为 null:
    1. clonefirst partially contained child 的一个克隆
    2. clone 追加fragment
    3. subrange 为一个新的活动范围,其起始点为 (original start node, original start offset),其结束点为 (first partially contained child, first partially contained child长度)。
    4. subfragment克隆内容 subrange 的结果。

    5. subfragment 追加clone
  15. 对于 contained children 中的每个 contained child
    1. clonecontained child 的一个克隆,并设置克隆子节点标志
    2. clone 追加fragment
  16. 如果 last partially contained child 是一个 CharacterData 节点

    在这种情况下,last partially contained childoriginal end node

    1. cloneoriginal end node 的一个克隆
    2. clone数据设置为使用节点 original end node、偏移量 0 以及计数 original end offset 获取子字符串数据的结果。
    3. clone 追加fragment
  17. 否则,如果 last partially contained child 不为 null:
    1. clonelast partially contained child 的一个克隆
    2. clone 追加fragment
    3. subrange 为一个新的活动范围,其起始点为 (last partially contained child, 0),其结束点为 (original end node, original end offset)。
    4. subfragment克隆内容 subrange 的结果。

    5. subfragment 追加clone
  18. 返回 fragment

cloneContents() 方法的步骤是返回克隆内容此对象的结果。

要将一个节点 node 插入到一个活动范围 range 中,请执行以下步骤:

  1. 如果 range起始节点是一个 ProcessingInstructionComment 节点,是一个父节点为 null 的 Text 节点,或者是 node,则抛出一个“HierarchyRequestErrorDOMException
  2. referenceNode 为 null。
  3. 如果 range起始节点是一个 Text 节点,则将 referenceNode 设置为该 Text 节点
  4. 否则,将 referenceNode 设置为起始节点索引起始偏移量子节点,如果不存在这样的子节点,则为 null。
  5. parent 为:如果 referenceNode 为 null,则为 range起始节点;否则为 referenceNode父节点
  6. referenceNode 之前,确保将 node 插入到 parent 中的预插入有效性
  7. 如果 range起始节点是一个 Text 节点,则将 referenceNode 设置为使用偏移量 range起始偏移量分割它的结果。
  8. 如果 nodereferenceNode,则将 referenceNode 设置为其下一个兄弟节点
  9. 如果 node父节点非空,则移除 node

  10. newOffset 为:如果 referenceNode 为 null,则为 parent长度;否则为 referenceNode索引

  11. 如果 node 是一个 DocumentFragment 节点,则将 newOffset 增加 node长度;否则增加 1。

  12. referenceNode 之前,将 node 预插入parent 中。
  13. 如果 range折叠的,则将 range结束点设置为 (parent, newOffset)。

insertNode(node) 方法的步骤是将 node 插入此对象中。

surroundContents(newParent) 方法的步骤是:

  1. 如果一个非 Text 节点部分包含在此对象中,则抛出一个“InvalidStateErrorDOMException

  2. 如果 newParent 是一个 DocumentDocumentTypeDocumentFragment 节点,则抛出一个“InvalidNodeTypeErrorDOMException

    由于历史原因,此处不检查 CharacterData 节点,并且最终会作为副作用稍后抛出异常。

  3. fragment提取此对象的结果。

  4. 如果 newParent子节点,则在 newParent 中用 null 替换所有

  5. newParent 插入此对象中。

  6. fragment 追加newParent

  7. 此对象选择 newParent

cloneRange() 方法的步骤是返回一个新的活动范围,其起始点结束点此对象相同。

detach() 方法的步骤是什么也不做。其功能(禁用 Range 对象)已被移除,但该方法本身为了兼容性而保留。


position = range . comparePoint(node, offset)
如果点在范围之前,则返回 −1;如果点在范围内,则返回 0;如果点在范围之后,则返回 1。
intersects = range . intersectsNode(node)
返回 range 是否与 node 相交。

isPointInRange(node, offset) 方法的步骤是:

  1. 如果 node此对象不同,则返回 false。
  2. 如果 node 是一个文档类型节点,则抛出一个“InvalidNodeTypeErrorDOMException
  3. 如果 offset 大于 node长度,则抛出一个“IndexSizeErrorDOMException

  4. 如果 (node, offset) 起始点之前或结束点之后,则返回 false。
  5. 返回 true。

comparePoint(node, offset) 方法的步骤是:

  1. 如果 node此对象不同,则抛出一个“WrongDocumentErrorDOMException
  2. 如果 node 是一个文档类型节点,则抛出一个“InvalidNodeTypeErrorDOMException
  3. 如果 offset 大于 node长度,则抛出一个“IndexSizeErrorDOMException

  4. 如果 (node, offset) 起始点之前,则返回 −1。
  5. 如果 (node, offset) 结束点之后,则返回 1。
  6. 返回 0。

intersectsNode(node) 方法的步骤是:

  1. 如果 node此对象不同,则返回 false。
  2. parentnode父节点
  3. 如果 parent 为 null,则返回 true。
  4. offsetnode索引
  5. 如果 (parent, offset) 结束点之前,并且 (parent, offset 加 1) 起始点之后,则返回 true。
  6. 返回 false。

字符串化行为必须执行以下步骤:

  1. s 为空字符串。

  2. 如果此对象起始节点此对象结束节点相同且它是一个 Text 节点,则返回该 Text 节点数据中从此对象起始偏移量开始到此对象结束偏移量结束的子字符串。

  3. 如果此对象起始节点是一个 Text 节点,则将该节点数据中从此对象起始偏移量到末尾的子字符串追加到 s

  4. 将所有包含在此对象中的 Text 节点数据树顺序连接起来,并追加到 s

  5. 如果此对象结束节点是一个 Text 节点,则将该节点数据中从其开始到此对象结束偏移量的子字符串追加到 s

  6. 返回 s


createContextualFragment()getClientRects()getBoundingClientRect() 方法在其他规范中定义。[DOM-Parsing] [CSSOM-VIEW]

6. 遍历

NodeIteratorTreeWalker 对象可用于过滤和遍历 节点

每个 NodeIteratorTreeWalker 对象都有一个关联的 活动标志,以避免递归调用。它最初是未设置的。

每个 NodeIteratorTreeWalker 对象还具有关联的 (一个 节点)、一个 whatToShow(一个位掩码)和一个 过滤器(一个回调)。

要在一个 NodeIteratorTreeWalker 对象 traverser过滤一个 节点 node,请运行以下步骤:

  1. 如果 traverser活动标志已设置,则抛出一个 "InvalidStateError" DOMException

  2. nnodenodeType 属性值 − 1。

  3. 如果 traverserwhatToShow 的第 nth 位(其中 0 是最低有效位)未设置,则返回 FILTER_SKIP

  4. 如果 traverser过滤器为 null,则返回 FILTER_ACCEPT

  5. 设置 traverser活动标志

  6. result 为使用 traverser过滤器、"acceptNode" 和 « node » 调用用户对象操作的返回值。如果这引发异常,则取消设置 traverser活动标志并重新抛出该异常。

  7. 取消设置 traverser活动标志

  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 对象还具有一个关联的 引用(一个 节点)和一个 引用前指针(一个布尔值)。

如前所述,NodeIterator 对象还具有关联的 活动标志whatToShow过滤器

NodeIterator 预移除步骤,给定一个 nodeIteratortoBeRemovedNode,如下所示:

  1. 如果 toBeRemovedNode 不是 nodeIterator引用包含性祖先,或者 toBeRemovedNodenodeIterator,则返回。

  2. 如果 nodeIterator引用前指针为 true:

    1. nexttoBeRemovedNode 的第一个后续 节点,该节点是 nodeIterator包含性后代,并且不是 toBeRemovedNode包含性后代,如果没有这样的 节点,则为 null。

    2. 如果 next 非 null,则将 nodeIterator引用设置为 next 并返回。

    3. 否则,将 nodeIterator引用前指针设置为 false。

      步骤在此处未终止。

  3. nodeIterator引用设置为 toBeRemovedNode父节点(如果 toBeRemovedNode前一个兄弟节点为 null),否则设置为 toBeRemovedNode前一个兄弟节点包含性后代中最后出现在树顺序中的那个节点。


root getter 的步骤是返回对象的

referenceNode getter 的步骤是返回对象的 引用

pointerBeforeReferenceNode getter 的步骤是返回对象的 引用前指针

whatToShow getter 的步骤是返回对象的 whatToShow

filter getter 的步骤是返回对象的 过滤器

遍历,给定一个 NodeIterator 对象 iterator 和一个方向 direction,请运行以下步骤:

  1. nodeiterator引用

  2. beforeNodeiterator引用前指针

  3. 当 true 时:

    1. 根据 direction 分支:

      next

      如果 beforeNode 为 false,则将 node 设置为 iterator迭代器集合跟随 node 的第一个 节点。如果没有这样的 节点,则返回 null。

      如果 beforeNode 为 true,则将其设置为 false。

      previous

      如果 beforeNode 为 true,则将 node 设置为 iterator迭代器集合先于 node 的第一个 节点。如果没有这样的 节点,则返回 null。

      如果 beforeNode 为 false,则将其设置为 true。

    2. result 为在 iterator过滤 node 的结果。

    3. 如果 resultFILTER_ACCEPT, 则 中断

  4. iterator引用设置为 node

  5. iterator引用前指针设置为 beforeNode

  6. 返回 node

nextNode() 方法的步骤是返回使用此对象和 next 遍历的结果。

previousNode() 方法的步骤是返回使用此对象和 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 对象可以使用 Document 对象上的 createTreeWalker() 方法创建。

每个 TreeWalker 对象都有一个关联的 当前节点(一个 节点)。

如前所述,TreeWalker 对象还具有关联的 whatToShow过滤器

root getter 的步骤是返回对象的

whatToShow getter 的步骤是返回对象的 whatToShow

filter getter 的步骤是返回对象的 过滤器

currentNode getter 的步骤是返回对象的 当前节点

currentNode setter 的步骤是将对象的 当前节点设置为给定值。


parentNode() 方法的步骤是:

  1. node对象的 当前节点

  2. node 非 null 且不是对象的 时:

    1. node 设置为 node父节点

    2. 如果 node 非 null 且在此对象过滤 node 返回 FILTER_ACCEPT, 则将对象的 当前节点设置为 node 并返回 node

  3. 返回 null。

遍历子节点,给定一个 walkertype,请运行以下步骤:

  1. nodewalker当前节点

  2. 如果 type 是 first,则将 node 设置为 node第一个子节点;如果 type 是 last,则设置为 node最后一个子节点

  3. node 非 null 时:

    1. result 为在 walker过滤 node 的结果。

    2. 如果 resultFILTER_ACCEPT, 则将 walker当前节点设置为 node 并返回 node

    3. 如果 resultFILTER_SKIP

      1. 如果 type 是 first,则令 childnode第一个子节点;如果 type 是 last,则为 node最后一个子节点

      2. 如果 child 非 null,则将 node 设置为 child继续

    4. node 非 null 时:

      1. 如果 type 是 first,则令 siblingnode下一个兄弟节点;如果 type 是 last,则为 node前一个兄弟节点

      2. 如果 sibling 非 null,则将 node 设置为 sibling中断

      3. parentnode父节点

      4. 如果 parent 为 null、walkerwalker当前节点,则返回 null。

      5. node 设置为 parent

  4. 返回 null。

firstChild() 方法的步骤是使用此对象和 first 遍历子节点

lastChild() 方法的步骤是使用此对象和 last 遍历子节点

遍历兄弟节点,给定一个 walkertype,请运行以下步骤:

  1. nodewalker当前节点

  2. 如果 node,则返回 null。

  3. 当 true 时:

    1. 如果 type 是 next,则令 siblingnode下一个兄弟节点;如果 type 是 previous,则为 node前一个兄弟节点

    2. sibling 非 null 时:

      1. node 设置为 sibling

      2. result 为在 walker过滤 node 的结果。

      3. 如果 resultFILTER_ACCEPT, 则将 walker当前节点设置为 node 并返回 node

      4. 如果 type 是 next,则将 sibling 设置为 node第一个子节点;如果 type 是 previous,则为 node最后一个子节点

      5. 如果 resultFILTER_REJECTsibling 为 null,则 如果 type 是 next,将 sibling 设置为 node下一个兄弟节点;如果 type 是 previous,则为 node前一个兄弟节点

    3. node 设置为 node父节点

    4. 如果 node 为 null 或 walker,则返回 null。

    5. 如果在 walker过滤 node 的返回值是 FILTER_ACCEPT, 则返回 null。

nextSibling() 方法的步骤是使用此对象和 next 遍历兄弟节点

previousSibling() 方法的步骤是使用此对象和 previous 遍历兄弟节点

previousNode() 方法的步骤是:

  1. node对象的 当前节点

  2. node 不是对象的 时:

    1. siblingnode前一个兄弟节点

    2. sibling 非 null 时:

      1. node 设置为 sibling

      2. result 为在此对象过滤 node 的结果。

      3. result 不是 FILTER_REJECTnode 有一个 子节点时:

        1. node 设置为 node最后一个子节点

        2. result 设置为在 此对象过滤 node 的结果。

      4. 如果 resultFILTER_ACCEPT, 则将对象的 当前节点设置为 node 并返回 node

      5. sibling 设置为 node前一个兄弟节点

    3. 如果 node对象的 node父节点为 null,则返回 null。

    4. node 设置为 node父节点

    5. 如果在此对象过滤 node 的返回值是 FILTER_ACCEPT, 则将对象的 当前节点设置为 node 并返回 node

  3. 返回 null。

nextNode() 方法的步骤是:

  1. node对象的 当前节点

  2. resultFILTER_ACCEPT

  3. 当 true 时:

    1. result 不是 FILTER_REJECTnode 有一个 子节点时:

      1. node 设置为其 第一个子节点

      2. result 设置为在此对象过滤 node 的结果。

      3. 如果 resultFILTER_ACCEPT, 则将对象的 当前节点设置为 node 并返回 node

    2. sibling 为 null。

    3. temporarynode

    4. temporary 非 null 时:

      1. 如果 temporary对象的 ,则返回 null。

      2. sibling 设置为 temporary下一个兄弟节点

      3. 如果 sibling 非 null,则将 node 设置为 sibling中断

      4. temporary 设置为 temporary父节点

    5. result 设置为在此对象过滤 node 的结果。

    6. 如果 resultFILTER_ACCEPT, 则将对象的 当前节点设置为 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 对象可以用作 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 对象的验证步骤(对于给定的 token)如下:

  1. 如果关联的属性本地名称没有定义支持的令牌,则抛出一个 TypeError

  2. lowercase tokentoken 的一个副本,转换为ASCII 小写

  3. 如果 lowercase token 存在于支持的令牌中,返回 true。

  4. 返回 false。

一个 DOMTokenList 对象的更新步骤如下:

  1. 如果关联的元素没有关联的属性令牌集为空,则返回。

  2. 使用关联的属性本地名称和运行令牌集有序集合序列化器的结果,为关联的元素设置属性值

一个 DOMTokenList 对象的序列化步骤是返回给定关联的元素和关联的属性本地名称运行获取属性值的结果。


一个 DOMTokenList 对象对其关联的元素具有这些属性更改步骤

  1. 如果 localName 是关联属性的本地名称namespace 为 null,且 value 为 null,则清空令牌集

  2. 否则,如果 localName 是关联属性的本地名称namespace 为 null,则将令牌集设置为 value已解析)。

当一个 DOMTokenList 对象被创建时,则:

  1. element 为关联的元素

  2. localName 为关联属性的本地名称

  3. value 为给定 elementlocalName 获取属性值的结果。

  4. elementlocalNamevaluevalue 和 null 运行属性更改步骤

tokenlist . length

返回令牌的数量。

tokenlist . item(index)
tokenlist[index]

返回索引为 index 的令牌。

tokenlist . contains(token)

如果存在 token,则返回 true;否则返回 false。

tokenlist . add(tokens…)

添加所有传递的参数,已存在的除外。

如果其中一个参数是空字符串,则抛出 "SyntaxError" DOMException

如果其中一个参数包含任何ASCII 空白字符,则抛出 "InvalidCharacterError" DOMException

tokenlist . remove(tokens…)

移除传递的参数(如果存在)。

如果其中一个参数是空字符串,则抛出 "SyntaxError" DOMException

如果其中一个参数包含任何ASCII 空白字符,则抛出 "InvalidCharacterError" DOMException

tokenlist . toggle(token [, force])

如果未给出 force,则“切换”token,如果存在则移除它,如果不存在则添加它。如果 force 为 true,则添加 token(与 add() 相同)。如果 force 为 false,则移除 token(与 remove() 相同)。

如果 token 现在存在,则返回 true;否则返回 false。

如果 token 为空,则抛出 "SyntaxError" DOMException

如果 token 包含任何空格,则抛出 "InvalidCharacterError" DOMException

tokenlist . replace(token, newToken)

newToken 替换 token

如果 tokennewToken 替换,则返回 true;否则返回 false。

如果其中一个参数是空字符串,则抛出 "SyntaxError" DOMException

如果其中一个参数包含任何ASCII 空白字符,则抛出 "InvalidCharacterError" DOMException

tokenlist . supports(token)

如果 token 在关联属性的支持的令牌中,则返回 true。否则返回 false。

如果关联属性没有定义支持的令牌,则抛出 TypeError

tokenlist . value

返回关联的集合作为字符串。

可以设置,以更改关联的属性。

length 属性的 getter 必须返回对象的令牌集大小

对象的支持的属性索引是范围从零到对象的令牌集大小减一的数字,除非令牌集为空, 在这种情况下,没有支持的属性索引

item(index) 方法的步骤是:

  1. 如果 index 等于或大于对象的令牌集大小,则返回 null。

  2. 返回对象的令牌集[index]。

contains(token) 方法的步骤是:如果对象的令牌集[token] 存在,则返回 true;否则返回 false。

add(tokens…) 方法的步骤是:

  1. 对于 tokens 中的每个 token

    1. 如果 token 是空字符串,则抛出一个 "SyntaxError" DOMException

    2. 如果 token 包含任何ASCII 空白字符,则抛出一个 "InvalidCharacterError" DOMException

  2. 对于 tokens 中的每个 token,将 token 追加对象的令牌集

  3. 运行更新步骤

remove(tokens…) 方法的步骤是:

  1. 对于 tokens 中的每个 token

    1. 如果 token 是空字符串,则抛出一个 "SyntaxError" DOMException

    2. 如果 token 包含任何ASCII 空白字符,则抛出一个 "InvalidCharacterError" DOMException

  2. 对于 tokens 中的每个 token,从对象的令牌集移除 token

  3. 运行更新步骤

toggle(token, force) 方法的步骤是:

  1. 如果 token 是空字符串,则抛出一个 "SyntaxError" DOMException

  2. 如果 token 包含任何ASCII 空白字符,则抛出一个 "InvalidCharacterError" DOMException

  3. 如果对象的令牌集[token] 存在

    1. 如果未给出 force 或者 force 为 false,则从对象的令牌集移除 token,运行更新步骤并返回 false。

    2. 返回 true。

  4. 否则,如果未给出 force 或者 force 为 true,则将 token 追加对象的令牌集,运行更新步骤,并返回 true。

  5. 返回 false。

为了 Web 兼容性,toggle()更新步骤并非总是运行。

replace(token, newToken) 方法的步骤是:

  1. 如果 tokennewToken 是空字符串,则抛出一个 "SyntaxError" DOMException

  2. 如果 tokennewToken 包含任何ASCII 空白字符,则抛出一个 "InvalidCharacterError" DOMException

  3. 如果对象的令牌集包含 token,则返回 false。

  4. 对象的令牌集中用 newToken 替换 token

  5. 运行更新步骤

  6. 返回 true。

为了 Web 兼容性,replace()更新步骤并非总是运行。

supports(token) 方法的步骤是:

  1. result 为使用 token 调用验证步骤的返回值。

  2. 返回 result

value 属性必须返回运行对象的序列化步骤的结果。

设置 value 属性必须使用关联的属性本地名称和给定值,为关联的元素设置属性值

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, 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, 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, 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, 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, annevk@annevk.nl)编写,并得到了Aryeh Gregor (ayg@aryeh.name)和Ms2ger (ms2ger@gmail.com)的实质性贡献。

知识产权

自定义元素相关的集成点的部分修订历史可以在 w3c/webcomponents 代码库中找到,该代码库根据 W3C 软件和文档许可证提供。

版权所有 © WHATWG (Apple, Google, Mozilla, Microsoft)。本作品根据知识共享署名 4.0 国际许可协议进行许可。如果其部分内容被整合到源代码中,则源代码中的这些部分将根据 BSD 3-Clause 许可证进行许可。

这是动态标准。那些对专利审查版本感兴趣的人应该查看动态标准审查草案

Index

Terms defined by this specification

Terms defined by reference

References

Normative References

[CONSOLE]
Dominic Farolino; Robert Kowalski; Terin Stock. Console Standard. Living Standard. URL: https://console.spec.whatwg.org/
[DEVICE-ORIENTATION]
Reilly Grant; Marcos Caceres. Device Orientation and Motion. URL: https://w3c.github.io/deviceorientation/
[ECMASCRIPT]
ECMAScript Language Specification. URL: https://tc39.es/ecma262/multipage/
[ENCODING]
Anne van Kesteren. Encoding Standard. Living Standard. URL: https://encoding.spec.whatwg.org/
[HR-TIME-3]
Yoav Weiss. High Resolution Time. URL: https://w3c.github.io/hr-time/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[LONG-ANIMATION-FRAMES]
Long Animation Frames API. Editor's Draft. URL: https://w3c.github.io/long-animation-frames/
[SELECTORS4]
Elika Etemad; Tab Atkins Jr.. Selectors Level 4. URL: https://drafts.csswg.org/selectors/
[SERVICE-WORKERS]
Yoshisato Yanagisawa; Monica CHINTALA. Service Workers. URL: https://w3c.github.io/ServiceWorker/
[TOUCH-EVENTS]
Doug Schepers; et al. Touch Events. URL: https://w3c.github.io/touch-events/
[UIEVENTS]
Gary Kacmarcik; Travis Leithead. UI Events. URL: https://w3c.github.io/uievents/
[URL]
Anne van Kesteren. URL Standard. Living Standard. URL: https://url.spec.whatwg.org/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/
[XML]
Tim Bray; et al. Extensible Markup Language (XML) 1.0 (Fifth Edition). 26 November 2008. REC. URL: https://www.w3.org/TR/xml/
[XML-NAMES]
Tim Bray; et al. Namespaces in XML 1.0 (Third Edition). 8 December 2009. REC. URL: https://www.w3.org/TR/xml-names/

Informative References

[CSSOM-VIEW]
Simon Pieters. CSSOM View Module. URL: https://drafts.csswg.org/cssom-view/
[DOM-Level-3-XPath]
Ray Whitmer. Document Object Model (DOM) Level 3 XPath Specification. 3 November 2020. NOTE. URL: https://www.w3.org/TR/DOM-Level-3-XPath/
[DOM-Parsing]
Travis Leithead. DOM Parsing and Serialization. URL: https://w3c.github.io/DOM-Parsing/
[FULLSCREEN]
Philip Jägenstedt. Fullscreen API Standard. Living Standard. URL: https://fullscreen.spec.whatwg.org/
[INDEXEDDB]
Nikunj Mehta; et al. Indexed Database API. URL: https://w3c.github.io/IndexedDB/
[XPath]
James Clark; Steven DeRose. XML Path Language (XPath) Version 1.0. 16 November 1999. REC. URL: https://www.w3.org/TR/xpath-10/
[XSLT]
James Clark. XSL Transformations (XSLT) Version 1.0. 16 November 1999. REC. URL: https://www.w3.org/TR/xslt-10/

IDL Index

[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 qualifiedName, DOMString publicId, DOMString systemId);
  [NewObject] XMLDocument createDocument(DOMString? namespace, [LegacyNullToEmptyString] DOMString qualifiedName, optional DocumentType? doctype = null);
  [NewObject] Document createHTMLDocument(optional DOMString title);

  boolean hasFeature(); // useless; 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, DOMString value);
  [CEReactions] undefined setAttributeNS(DOMString? namespace, DOMString qualifiedName, 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; // useless; 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 {
  readonly attribute DOMString target;
};
[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?