DOM

現行標準 — 最終更新

参加方法:
GitHub whatwg/dom新しいissueオープン中のissue
Matrixでチャット
コミット:
GitHub whatwg/dom/commits
このコミット時点のスナップショット
@thedomstandard
テスト:
web-platform-tests dom/進行中の作業
翻訳 (参考訳):
日本語
简体中文
한국어

概要

DOMは、イベント、アクティビティの中断、ノードツリーのためのプラットフォーム非依存のモデルを定義します。

1. 基盤

この仕様はInfra Standardに依存しています。[INFRA]

この仕様書で使用されている用語のいくつかは、EncodingSelectorsTrusted TypesWeb IDLXML、およびNamespaces in XMLで定義されています。 [ENCODING] [SELECTORS4] [TRUSTED-TYPES] [WEBIDL] [XML] [XML-NAMES]

拡張が必要な場合、DOM標準を適宜更新するか、他の仕様で提供される拡張フックに接続する新しい標準を作成できます。 適用可能な仕様

1.1. ツリー

ツリーは、有限階層構造のツリーです。 ツリー順は、 ツリーの前順・深さ優先の走査です。

ツリーに属する ツリーに属するオブジェクトは、(nullまたはオブジェクト)を持ち、(オブジェクトの順序付き集合)を持ちます。オブジェクトAがオブジェクトBであれば、ABです。

は、そのがnullなら自身であり、 そうでなければそのです。 ツリーは、そのツリーに属するオブジェクトのうち、がnullのものです。

オブジェクトAは、オブジェクトB子孫 であると言い、ABであるか、AがオブジェクトCであり、かつCB子孫である場合です。

包括的子孫は、オブジェクト自身またはその子孫です。

オブジェクトAは、オブジェクトB祖先 であると言い、BA子孫である場合のみ成立します。

包括的祖先は、オブジェクト自身またはその祖先です。

オブジェクトAは、オブジェクトB兄弟 であると言い、BAが同じ非nullのを持つ場合のみ成立します。

包括的兄弟は、オブジェクト自身またはその兄弟です。

オブジェクトAは、オブジェクトB前方 であると言い、ABが同じツリーに属し、 ABよりツリー順で前にある場合です。

オブジェクトAは、オブジェクトB後方 であると言い、ABが同じツリーに属し、 ABよりツリー順で後ろにある場合です。

最初の子は、オブジェクトの最初のであり、 がいなければnullです。

最後の子は、オブジェクトの最後のであり、 がいなければnullです。

前の兄弟は、オブジェクトの最初の前方兄弟であり、前方兄弟がいなければnullです。

次の兄弟は、オブジェクトの最初の後方兄弟であり、後方 兄弟がいなければnullです。

インデックスは、オブジェクトの前方 兄弟の数であり、いなければ0です。

1.2. 順序付き集合

順序付き集合パーサーは、文字列inputを受け取り、次の手順を実行します:

  1. inputTokensASCII空白で分割した結果とする。

  2. tokensを新しい順序付き集合とする。

  3. inputTokenstokenについて: tokenをtokensに追加する。

  4. tokensを返す。

順序付き集合シリアライザは、 setを受け取り、U+0020 SPACEで連結した結果を返します。

1.3. セレクター

セレクター文字列のスコープマッチを、文字列 selectorsノード node に対して行うには:

  1. selector を、セレクターを構文解析する selectors の結果とする。 [SELECTORS4]

  2. もし selector が失敗であれば、スローする "SyntaxError" DOMException を。

  3. selectornodeルートを使い、セレクターをツリーに対してマッチさせるを、スコーピングルート node で実行した結果を返す。[SELECTORS4]

セレクター内での名前空間のサポートは予定されておらず、追加されません。

1.4. 名前の検証

文字列有効な名前空間接頭辞であるのは、 その長さが1以上であり、 ASCII空白、U+0000 NULL、U+002F (/)、U+003E (>) を含まない場合である。

文字列有効な属性ローカル名であるのは、長さが1以上であり、 ASCII空白、U+0000 NULL、U+002F (/)、U+003D (=)、U+003E (>) を含まない場合である。

文字列 name有効な要素ローカル名であるのは、次の手順が true を返す場合である:

  1. もし name長さが0であれば、false を返す。

  2. もし name の0番目のコードポイントASCIIアルファベットであれば:

    1. もし nameASCII空白、U+0000 NULL、U+002F (/)、U+003E (>) を含む場合、false を返す。

    2. true を返す。

  3. もし name の0番目のコードポイントが U+003A (:)、U+005F (_) でなく、かつ U+0080 から U+10FFFF の範囲に含まれない場合、false を返す。

  4. もし name のそれ以降のコードポイント(もしあれば)がASCIIアルファベットASCII数字、 U+002D (-)、U+002E (.)、U+003A (:)、U+005F (_) または U+0080 から U+10FFFF の範囲に含まれない場合、false を返す。

  5. true を返す。

この概念は、DOM APIで生成される要素ローカル名の検証に使われます。HTMLパーサーで生成可能な名前を許容するのが意図であり(最初の符号位置ASCII英字の場合)、加えて歴史的な理由でASCII範囲では制限されているが、ASCII以外は何でも許容されます。

以下のJavaScript互換の正規表現は、 有効な要素ローカル名の実装例です:

/^(?:[A-Za-z][^\0\t\n\f\r\u0020/>]*|[:_\u0080-\u{10FFFF}][A-Za-z0-9-.:_\u0080-\u{10FFFF}]*)$/u

文字列は、 有効なDOCTYPE名であり、 ASCII空白、U+0000 NULL、U+003E (>) を含まない場合です。

空文字列も有効なDOCTYPE名です。

バリデートと抽出 namespacequalifiedNameを、contextを元に行うには:

  1. namespaceが空文字列なら、nullに設定する。

  2. prefixをnullにする。

  3. localNamequalifiedNameにする。

  4. qualifiedNameがU+003A (:) を含む場合:

    1. splitResultqualifiedNameをU+003A (:)で厳密分割した結果とする。

    2. prefixsplitResult[0]を設定する。

    3. localNamesplitResult[1]を設定する。

    4. prefix有効な名前空間プレフィックスでなければ、 throwし、 "InvalidCharacterError" DOMExceptionを投げる。

  5. Assertprefixはnullまたは有効な名前空間プレフィックスであること。

  6. contextが"attribute"で、localName有効な属性ローカル名でないなら、 throwし、"InvalidCharacterError" DOMExceptionを投げる。

  7. contextが"element"で、localName有効な要素ローカル名でないなら、 throwし、"InvalidCharacterError" DOMExceptionを投げる。

  8. prefixがnullでなく、namespaceがnullなら、 throwし、 "NamespaceError" DOMExceptionを投げる。

  9. prefixが"xml"で、namespaceXML名前空間でないなら、 throwし、 "NamespaceError" DOMExceptionを投げる。

  10. いずれかqualifiedNameまたはprefixが"xmlns"で、 namespaceXMLNS名前空間でないなら、 throwし、 "NamespaceError" DOMExceptionを投げる。

  11. namespaceXMLNS名前空間で、 qualifiedNameまたはprefixが"xmlns"でないなら、 throwし、 "NamespaceError" DOMExceptionを投げる。

  12. (namespace, prefix, localName) を返す。

この仕様の各APIは、名前空間プレフィックス、属性ローカル名、要素ローカル名、DOCTYPE名をより厳密に検証していました。これは様々なXML関連仕様に合わせたものでした(ただし全ての仕様のルールが適用されたわけではありません)。

しかし、HTMLパーサーで生成可能な名前がDOM APIでは生成できないことがあり、Web開発者にとって煩わしいことが判明したため、検証は上記のように緩和されました。

2. イベント

2.1. 「DOMイベント」の紹介

ウェブプラットフォーム全体で、イベントは、ネットワーク活動やユーザー操作などの発生を通知するためにオブジェクトに発行されます。これらのオブジェクトは EventTarget インターフェースを実装しているため、addEventListener() を呼び出すことでイベントリスナーを追加し、イベントを監視できます。

obj.addEventListener("load", imgFetched)

function imgFetched(ev) {
  // great success}

イベントリスナーは、 removeEventListener() メソッドを使って同じ引数を渡すことで削除できます。

また、AbortSignaladdEventListener() に渡し、そのシグナルを管理するコントローラーでabort() を呼ぶことでイベントリスナーを削除することもできます。

イベントもオブジェクトであり、 Eventインターフェース(または派生インターフェース)を実装します。上の例では evイベントです。 evイベントリスナーコールバック (通常はJavaScriptの関数)に引数として渡されます。 イベントリスナーは、 イベントtype 属性値(上の例では"load")をキーにします。 イベントtarget 属性値は イベント発行されたオブジェクト(上記ではobj)を返します。

通常イベントはユーザーエージェントによってユーザー操作やタスク完了の結果として発行されますが、アプリケーションから合成イベント(シンセティックイベント)として イベントを自分で発行することもできます:

// 適切なイベントリスナーを追加
obj.addEventListener("cat", function(e) { process(e.detail) })

// イベントを作成して発行
var event = new CustomEvent("cat", {"detail":{"hazcheeseburger":true}})
obj.dispatchEvent(event)

シグナリング以外にも、イベントは、 操作の次の処理をアプリケーション側で制御できるように使われることがあります。例えば、フォーム送信の一部として、 type属性値が "submit" であるイベント発行されます。 このイベントpreventDefault() メソッドが呼び出されると、フォーム送信は中止されます。この機能をイベント(アプリケーションで発行される、合成イベント)を通じて利用したい場合は、 dispatchEvent() メソッドの返り値を利用できます。

if(obj.dispatchEvent(event)) {
  // イベントはキャンセルされなかったので、何か魔法を実行}

イベントツリーに属するオブジェクト(例:要素)に発行された場合、 そのオブジェクトの祖先イベントリスナーにも到達することがあります。実際には、全ての包括的祖先イベントリスナーのうち、captureがtrueのものが ツリー順で呼ばれます。そして、イベントbubbles がtrueなら、今度は包括的祖先イベントリスナーのうちcaptureが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関数は2回呼ばれます。どちらの時もイベントtarget 属性値はspan 要素です。最初は currentTarget 属性値がdocument、2回目は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 オブジェクトです。

イベントには、target潜在的なイベントターゲット)が関連付けられています。特に記載がない限り、これは null です。

イベントには、relatedTarget潜在的なイベントターゲット)が関連付けられています。特に記載がない限り、これは null です。

他の仕様では relatedTarget を使って relatedTarget 属性を定義します。[UIEVENTS]

イベントには、touch target listリスト。0個以上の潜在的なイベントターゲット)が関連付けられています。特に記載がない限り、空リストです。

touch target listは、TouchEventインターフェースおよび関連インターフェースの定義専用です。[TOUCH-EVENTS]

イベントには、pathが関連付けられています。pathは、リストで、各構造体には、 invocation targetEventTarget オブジェクト)、 invocation-target-in-shadow-tree(真偽値)、 shadow-adjusted target潜在的なイベントターゲット)、 relatedTarget潜在的なイベントターゲット)、 touch target listリスト潜在的なイベントターゲット)、 root-of-closed-tree(真偽値)、 slot-in-closed-tree(真偽値)が含まれます。 pathは最初は空リストです。

event = new Event(type [, eventInitDict])
新しい event を返します。type属性値が type になります。eventInitDict 引数により、bubbles および cancelable属性を同名のオブジェクトメンバーで設定できます。
event . type
event のタイプ(例: "click"、"hashchange"、"submit")を返します。
event . target
event発行されたオブジェクト(target)を返します。
event . currentTarget
現在コールバックが実行されているイベントリスナーのオブジェクトを返します。
event . composedPath()
eventinvocation target オブジェクト(リスナーが呼ばれるオブジェクト)のリストを返します。ただし、eventcurrentTargetから到達できない closed モードの shadow root を持つ shadow tree 内のノードは除外されます。
event . eventPhase
event のフェーズを返します。値は NONECAPTURING_PHASEAT_TARGETBUBBLING_PHASE のいずれかです。
event . stopPropagation()
ツリー内で 発行された場合、このメソッドを呼ぶと event が現在のオブジェクト以外に到達しなくなります。
event . stopImmediatePropagation()
このメソッドを呼ぶと、現在のリスナー以降の登録済みイベントリスナーには到達せず、ツリー内で 発行された場合、他のオブジェクトにも到達しなくなります。
event . bubbles
event の初期化方法によって true または false を返します。true の場合、eventtarget祖先を逆ツリー順で辿ります。false の場合は辿りません。
event . cancelable
event の初期化方法によって true または false を返します。true の場合、event発行元の処理を preventDefault() メソッドでキャンセルできます。
event . preventDefault()
cancelable 属性値が true で、かつ event のリスナーの passive が false の場合、このメソッドを呼ぶと発行元の処理をキャンセルするよう指示します。
event . defaultPrevented
preventDefault() が正常に呼ばれキャンセル指示された場合は true、それ以外は false を返します。
event . composed
event の初期化方法によって true または false を返します。true の場合、eventroot である ShadowRoot ノードを越えてリスナーを呼びます。false の場合は越えません。
event . isTrusted
event がユーザーエージェントによって 発行された場合は true、それ以外は false を返します。
event . timeStamp
event の発生時刻(ミリ秒単位)を返します。

type属性は初期化された値を返さなければなりません。イベントが作成されたとき、この属性は空文字列で初期化されなければなりません。

targetゲッターの手順は、thistargetを返すことです。

srcElementゲッターの手順は、thistargetを返すことです。

currentTarget属性は初期化された値を返さなければなりません。イベントが作成されたとき、この属性はnullで初期化されなければなりません。

composedPath()メソッドの手順は以下の通りです:

  1. composedPathを空のリストとする。

  2. paththispathとする。

  3. pathなら、composedPathを返す。

  4. currentTargetthiscurrentTarget 属性値とする。

  5. AssertcurrentTargetEventTargetオブジェクトであること。

  6. AppendcurrentTargetcomposedPathに追加する。

  7. currentTargetIndexを0とする。

  8. currentTargetHiddenSubtreeLevelを0とする。

  9. indexpathサイズ−1とする。

  10. indexが0以上の間、繰り返す:

    1. path[index]のroot-of-closed-treeがtrueなら、 currentTargetHiddenSubtreeLevelを1増やす。

    2. path[index]のinvocation targetcurrentTargetなら、 currentTargetIndexindexに設定し、 breakする。

    3. path[index]のslot-in-closed-treeがtrueなら、 currentTargetHiddenSubtreeLevelを1減らす。

    4. indexを1減らす。

  11. currentHiddenLevelmaxHiddenLevelcurrentTargetHiddenSubtreeLevelとする。

  12. indexcurrentTargetIndex−1に設定する。

  13. indexが0以上の間、繰り返す:

    1. path[index]のroot-of-closed-treeがtrueなら、 currentHiddenLevelを1増やす。

    2. currentHiddenLevelmaxHiddenLevel以下なら、 prependpath[index]のinvocation targetcomposedPathの先頭に追加する。

    3. path[index]のslot-in-closed-treeがtrueなら:

      1. currentHiddenLevelを1減らす。

      2. currentHiddenLevelmaxHiddenLevel未満なら、 maxHiddenLevelcurrentHiddenLevelに設定する。

    4. indexを1減らす。

  14. currentHiddenLevelmaxHiddenLevelcurrentTargetHiddenSubtreeLevelに設定する。

  15. indexcurrentTargetIndex+1に設定する。

  16. indexpathサイズ未満の間、繰り返す:

    1. path[index]のslot-in-closed-treeがtrueなら、 currentHiddenLevelを1増やす。

    2. currentHiddenLevelmaxHiddenLevel以下なら、 appendpath[index]のinvocation targetcomposedPathに追加する。

    3. path[index]のroot-of-closed-treeがtrueなら:

      1. currentHiddenLevelを1減らす。

      2. currentHiddenLevelmaxHiddenLevel未満なら、 maxHiddenLevelcurrentHiddenLevelに設定する。

    4. indexを1増やす。

  17. composedPathを返す。

eventPhase属性は初期化された値を返さなければなりません。値は以下のいずれかです:

NONE(数値値 0)
現在イベント発行されていない場合はこのフェーズです。
CAPTURING_PHASE(数値値 1)
イベント発行され、ツリーに属するオブジェクトの場合、targetに到達する前はこのフェーズになります。
AT_TARGET(数値値 2)
イベント発行されたとき、target上ではこのフェーズになります。
BUBBLING_PHASE(数値値 3)
イベント発行され、ツリーに属するオブジェクトの場合、targetに到達した後はこのフェーズになります。

初期状態では、この属性はNONEで初期化されなければなりません。


イベントには、以下の関連フラグがあり、全て初期状態では未設定です:

stopPropagation()メソッドの手順は、thisstop propagation flagを設定することです。

cancelBubbleゲッターの手順は、thisstop propagation flagが設定されていればtrue、そうでなければfalseを返すことです。

cancelBubbleセッターの手順は、指定された値がtrueならthisstop propagation flagを設定し、そうでなければ何もしないことです。

stopImmediatePropagation()メソッドの手順は、thisstop propagation flagthisstop immediate propagation flagを設定することです。

bubblescancelable属性は、それぞれ初期化された値を返さなければなりません。

canceled flagを設定するには、event eventが、cancelable属性値がtrueであり、かつeventin passive listener flagが未設定なら、eventcanceled flagを設定し、そうでなければ何もしないことです。

returnValueゲッターの手順は、thiscanceled flagが設定されていればfalse、そうでなければtrueを返すことです。

returnValueセッターの手順は、指定された値がfalseならcanceled flagを設定するthisに対して)、そうでなければ何もしないことです。

preventDefault()メソッドの手順は、canceled flagを設定するthisに対して)。

preventDefault()を呼んでも効果がない場合があります。ユーザーエージェントは、開発者コンソールで正確な理由を記録し、デバッグを支援することが推奨されます。

defaultPreventedゲッターの手順は、thiscanceled flagが設定されていればtrue、そうでなければfalseを返すことです。

composedゲッターの手順は、thiscomposed flagが設定されていればtrue、そうでなければfalseを返すことです。


isTrusted属性は初期化された値を返さなければなりません。イベントが作成されたとき、この属性はfalseで初期化されなければなりません。

isTrustedは、イベントがユーザーエージェントによって発行されたか(dispatchEvent()によるものではないか)を示す便宜的なものです。唯一のレガシー例外はclick()で、これによりユーザーエージェントがisTrusted属性がfalseで初期化されたイベントを発行します。

timeStamp属性は初期化された値を返さなければなりません。


initializeするには、eventtypebubblescancelableを使って以下の手順を実行します:

  1. eventinitialized flagを設定する。

  2. eventstop propagation flagstop immediate propagation flagcanceled flagを未設定にする。

  3. eventisTrusted属性をfalseに設定する。

  4. eventtargetをnullに設定する。

  5. eventtype属性をtypeに設定する。

  6. eventbubbles属性をbubblesに設定する。

  7. eventcancelable属性をcancelableに設定する。

initEvent(type, bubbles, cancelable) メソッドの手順は以下の通りです:

  1. thisdispatch flagが設定されていれば、returnする。

  2. initializethistypebubblescancelableで初期化する。

initEvent()イベントのコンストラクタと重複しており、composedを設定できません。レガシーコンテンツのためにサポートが必要です。

2.3. Window インターフェースへのレガシー拡張

partial interface Window {
  [Replaceable] readonly attribute (Event or undefined) event; // legacy
};

Window オブジェクトは、current event(現在のイベント)(undefinedまたはEventオブジェクト)を持ちます。特に記載がない限りundefinedです。

eventゲッターの手順は、thiscurrent eventを返すことです。

Web開発者は、イベントリスナーに渡されるEventオブジェクトを使うことが強く推奨されます。その方が移植性の高いコードになります。この属性はworkersやworkletsでは利用できず、shadow tree内で発行されるイベントには正確ではありません。

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が設定されていれば、returnする。

  2. initializethistypebubblescancelableで初期化する。

  3. thisdetail属性をdetailに設定する。

2.5. イベントの構築

仕様は、すべてまたは一部のイベントのためのイベント構築手順を定義できます。アルゴリズムには、イベントeventEventIniteventInitDictが、内部イベント生成手順で示された通り渡されます。

この構造は、初期化辞書のメンバーとIDL属性が単純な1:1対応ではない、より複雑な構造を持つEventのサブクラスで利用できます。

Eventインターフェース、またはEventインターフェースを継承したインターフェースのconstructorが呼び出された時、typeeventInitDictを引数として、次の手順を実行します:

  1. eventを、thisインターフェース・null・現在時刻・eventInitDict内部イベント生成手順を実行した結果とする。

  2. eventtype属性をtypeで初期化する。

  3. eventを返す。

イベントを生成するには、eventInterface(必ずEventまたはそれを継承したインターフェース)、任意でrealmrealmを受け取り、以下の手順を実行します:

  1. realmが与えられていなければnullに設定する。

  2. dictionaryを、JavaScriptの値undefinedをeventInterfaceのコンストラクタが受け付ける辞書型に変換した結果とする。(この辞書型はEventInitか、それを継承した辞書型です。)

    メンバーが必須の場合は機能しません。whatwg/dom#600参照。

  3. eventを、eventInterfacerealm・イベントが通知する発生時刻・dictionary内部イベント生成手順を実行した結果とする。

    macOSでは、発生時刻はNSEventオブジェクトのtimestampプロパティで取得できます。

  4. eventisTrusted属性をtrueで初期化する。

  5. eventを返す。

イベントの生成は、他の仕様が単に発火するのではなく、イベントを個別に生成して発行する必要がある場面で利用します。これによりイベント属性が正しい初期値になることを保証します。

内部イベント生成手順は、eventInterfacerealmtimedictionaryを受け、以下の通りです:

  1. eventeventInterfaceを使って新しいオブジェクトとして生成する。realmがnullでなければそれを使い、そうでなければWeb IDLのデフォルト動作を使う。

    Web IDLは現時点でデフォルト動作を定義していません。whatwg/webidl#135参照。

  2. eventinitialized flagを設定する。

  3. eventtimeStamp属性を、相対高精度粗時間timeevent関連グローバルオブジェクトを使う)で初期化する。

  4. dictionarymembervalueで: eventmemberという識別子を持つ属性を持つなら、その属性をvalueで初期化する。

  5. イベント構築手順eventdictionaryで実行する。

  6. eventを返す。

2.6. イベントインターフェースの定義

一般的に、Eventを継承した新しいインターフェースを定義する際は、必ずWHATWGまたはW3C WebApps WGコミュニティに意見を求めてください。

CustomEvent インターフェースを出発点として使用できます。 ただし、init*Event()メソッドはコンストラクタと冗長であるため導入しないでください。Event インターフェースを継承するインターフェースでそのようなメソッドが存在するのは、歴史的な理由によるものだけです。

2.7. インターフェース EventTarget

[Exposed=*]
interface EventTarget {
  constructor();

  undefined addEventListener(DOMString type, EventListener? callback, optional (AddEventListenerOptions or boolean) options = {});
  undefined removeEventListener(DOMString type, EventListener? callback, optional (EventListenerOptions or boolean) options = {});
  boolean dispatchEvent(Event event);
};

callback interface EventListener {
  undefined handleEvent(Event event);
};

dictionary EventListenerOptions {
  boolean capture = false;
};

dictionary AddEventListenerOptions : EventListenerOptions {
  boolean passive;
  boolean once = false;
  AbortSignal signal;
};

EventTarget オブジェクトは、イベント発行されるターゲットを表します。

EventTarget オブジェクトには、関連付けられたイベントリスナーリスト(ゼロ個以上のイベントリスナーリスト)があります。初期状態では空のリストです。

イベントリスナー は、特定のイベントを監視するために使用され、次の要素から構成されます:

callbackEventListener オブジェクトですが、イベントリスナーは、上記のようにより広い概念です。

EventTarget オブジェクトには、関連付けられたget the parentアルゴリズムがあり、イベントeventを受け取り、EventTarget オブジェクトを返します。特に記載がない限り、nullを返します。

ノードシャドウルート、および ドキュメントは、get the parentアルゴリズムをオーバーライドしています。

EventTarget オブジェクトは、関連付けられたactivation behaviorアルゴリズムを持つことができます。この activation behaviorアルゴリズムは、イベントを引数として受け取り、dispatchアルゴリズムで示されています。

これは、特定のEventTarget オブジェクトに対してユーザーエージェントが特定のアクションを実行するために存在します。例えば、 area 要素では、合成されたMouseEvent イベントtype 属性がclickであるもの)に応答します。ウェブ互換性のためこれを削除することはできず、現在では何かをアクティブ化する方法として定義されています。[HTML]

関連付けられたactivation behaviorを持つ各EventTarget オブジェクトは、さらに(どちらか一方ではなく)legacy-pre-activation behaviorアルゴリズムと、 legacy-canceled-activation behavior アルゴリズムを持つことができます。

これらのアルゴリズムは、チェックボックスおよびラジオの input 要素に対してのみ存在し、それ以外の用途では使用しないでください。[HTML]

target = new EventTarget();

新しいEventTarget オブジェクトを作成します。これは、開発者がイベントを発行したり、イベントを監視するために使用できます。

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

イベントtype 属性値がtypeである場合に対応するイベントリスナーを追加します。callback引数は、イベント発行されたときに呼び出されるコールバックを設定します。

options引数はリスナー固有のオプションを設定します。互換性のため、これはブール値である場合もあり、その場合、このメソッドは値がoptionscaptureとして指定されたかのように動作します。

optionscapture がtrueに設定されている場合、イベントeventPhase 属性値がBUBBLING_PHASEのときにコールバックが呼び出されるのを防ぎます。false(または指定されていない場合)では、イベントeventPhase 属性値がCAPTURING_PHASEのときに呼び出されません。いずれの場合も、イベントeventPhase 属性値がAT_TARGETの場合はコールバックが呼び出されます。

optionspassive がtrueに設定されている場合、コールバックpreventDefault() を呼び出してイベントをキャンセルしないことを示します。これは、§ 2.8 Observing event listenersで説明されるパフォーマンス最適化を有効にするために使用されます。

optionsonce がtrueに設定されている場合、コールバックは一度だけ呼び出され、その後イベントリスナーが削除されます。

もしoptionssignalとしてAbortSignalが渡された場合、シグナルが中止されたときにイベントリスナーが削除されます。

イベントリスナーtargetイベントリスナーリストに追加されますが、同じtypecallback、およびcaptureを持つリスナーがすでに存在する場合は追加されません。

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

targetイベントリスナーリストにある、同じtypecallback、および optionsを持つイベントリスナーを削除します。

target . dispatchEvent(event)

targetに対して合成されたevent発行し、eventcancelable 属性値がfalseであるか、preventDefault() メソッドが呼び出されていない場合はtrueを返します。それ以外の場合はfalseを返します。

flattenoptionsを処理するには、次の手順を実行します:

  1. optionsがブール値の場合、optionsを返す。

  2. options["capture"]を返す。

flatten moreoptionsを処理するには、次の手順を実行します:

  1. captureを、flattening optionsの結果に設定する。

  2. onceをfalseに設定する。

  3. passivesignalをnullに設定する。

  4. options辞書である場合:

    1. onceoptions["once"]に設定する。

    2. options["passive"] が存在する場合passiveoptions["passive"]に設定する。

    3. options["signal"] が存在する場合signaloptions["signal"]に設定する。

  5. capturepassiveoncesignalを返す。

new EventTarget() コンストラクタ手順は何も行いません。

他の箇所で規定されたデフォルトのため、返されるEventTargetget the parentアルゴリズムはnullを返し、 activation behaviorlegacy-pre-activation behavior、 またはlegacy-canceled-activation behaviorを持ちません。

将来的にはカスタムget the parentアルゴリズムを許可する可能性があります。これがプログラムで有用である場合はお知らせください。 現時点では、作成されたすべてのEventTargetは ツリー構造に参加しません。

デフォルトのパッシブ値は、イベントタイプtypeEventTarget eventTargetを受け取り、以下のように決定されます:

  1. 以下のすべてが真である場合、trueを返す:

  2. falseを返す。

イベントリスナーを追加するには、EventTarget オブジェクトeventTargetイベントリスナーlistenerを受け取り、以下の手順を実行します:

  1. eventTargetServiceWorkerGlobalScope オブジェクトであり、そのサービスワーカースクリプトリソース評価済みフラグが設定されており、listenertypeが、いずれかのサービスワーカーイベントtype属性値に一致する場合、この結果が予期したものと異なる可能性があるとコンソールに警告を報告します。[SERVICE-WORKERS]

  2. もし listenersignal が null でなく、 かつ 中止されている 場合は、return する。

  3. listenercallbackがnullである場合、終了する。

  4. listenerpassiveがnullである場合、listenertypeeventTargetを用いてデフォルトのパッシブ値に設定する。

  5. eventTargetイベントリスナーリストに、含まれていない場合、そのtypelistenertypeであり、callbacklistenercallbackであり、capturelistenercaptureであるイベントリスナーがある場合、追加する。

  6. listenersignalがnullでない場合、次の中止手順を追加する:

    1. イベントリスナーを削除する、対象はeventTargetlistener

イベントリスナーを追加するの概念は、イベントハンドラーが同じコードパスを使用することを保証するために存在します。[HTML]

addEventListener(type, callback, options) メソッドの手順は以下の通りです:

  1. capturepassiveonce、およびsignalを、flattening more optionsの結果に設定する。

  2. イベントリスナーを追加する、対象はthisイベントリスナーであり、そのtypetypecallbackcallbackcapturecapturepassivepassiveonceonce、およびsignalsignalである。

イベントリスナーを削除するには、EventTarget オブジェクトeventTargetイベントリスナーlistenerを受け取り、以下の手順を実行します:

  1. eventTargetServiceWorkerGlobalScope オブジェクトであり、そのサービスワーカー処理するイベントタイプのセットlistenertype含む場合、コンソールに警告を報告する。[SERVICE-WORKERS]

  2. listenerremovedをtrueに設定し、eventTargetイベントリスナーリストから削除する。

HTMLではこれを使用してイベントハンドラーを定義します。[HTML]

すべてのイベントリスナーを削除するには、EventTarget オブジェクトeventTargetを受け取り: eventTargetイベントリスナーリストlistenerに対して: イベントリスナーを削除するを実行する。

HTMLではこれを使用してdocument.open()を定義します。[HTML]

removeEventListener(type, callback, options) メソッドの手順は以下の通りです:

  1. captureを、flattening optionsの結果に設定する。

  2. thisイベントリスナーリストに、含まれるtypetypeであり、callbackcallbackであり、capturecaptureであるイベントリスナーがある場合、イベントリスナーを削除する、対象はthisとそのイベントリスナー。

イベントリスナーリストには、同じtypecallback、およびcaptureを持つ複数のイベントリスナーが含まれないため、イベントリスナーを追加するがこれを防ぎます。

dispatchEvent(event) メソッドの手順は以下の通りです:

  1. eventdispatch flagが設定されている場合、またはそのinitialized flagが設定されていない場合、例外を投げる "InvalidStateError" DOMException

  2. eventisTrusted 属性をfalseに初期化する。

  3. dispatchingeventthisを用いて実行した結果を返す。

2.8. イベントリスナーの観察

一般的に、開発者はイベントリスナーの存在が観察可能であることを期待していません。 イベントリスナーの影響は、そのコールバックによって決定されます。つまり、 開発者が何もしないイベントリスナーを追加しても、副作用がないことを期待します。

しかしながら、一部のイベントAPIは効率的に実装するために イベントリスナーを観察する必要があるように設計されています。これにより、リスナーの存在が観察可能になり、 空のリスナーであってもアプリケーションの動作やパフォーマンスに大きな影響を与える可能性があります。 例えば、非同期スクロールをブロックするために使用されるタッチイベントやホイールイベントのような場合です。 この問題は、少なくとも1つの非passiveリスナーが存在する場合にのみ イベントをcancelableとして指定することで、軽減されることがあります。 例えば、非passive TouchEvent リスナーはスクロールをブロックする必要がありますが、すべてのリスナーがpassive である場合、並行してスクロールを開始できるよう、TouchEvent をキャンセル不可(preventDefault() の呼び出しを無視する)にすることができます。そのため、イベントを発行するコードは非passiveリスナーの有無を観察し、 発行されるイベントのcancelableプロパティをクリアすることができます。

理想的には、新しいイベントAPIはこの特性を必要としないように定義されるべきです。(議論についてはwhatwg/domを使用してください。)

レガシーなサービスワーカーのfetchイベントリスナーコールバックを取得するには、 ServiceWorkerGlobalScope globalを受け取り、以下の手順を実行します。これにより、リストとして EventListener オブジェクトが返されます。

  1. callbacks を « » とする。

  2. globalイベントリスナーリストlistener について:listenertype が "fetch" であり、listenercallback が null でなければ、 その listenercallbackcallbacks に追加する。

  3. callbacks を返す。

2.9. イベントのディスパッチ

dispatch を使って eventtarget に、オプションの legacy target override flag およびオプションの legacyOutputDidListenersThrowFlag とともにディスパッチするには、以下の手順を実行する:

  1. eventdispatch flag を設定する。

  2. targetOverridetarget に設定する。ただし legacy target override flag が指定されていない場合は target関連付けられた Document に設定する。 [HTML]

    legacy target override flag は HTML でのみ使用され、targetWindow オブジェクトの場合のみ使用される。

  3. activationTarget を null に設定する。

  4. relatedTargetretargeting により eventrelatedTargettarget に対して再ターゲットした結果に設定する。

  5. clearTargets を false に設定する。

  6. targetrelatedTarget でない、または targeteventrelatedTarget である場合:

    1. touchTargets を新しい リスト に設定する。

    2. touchTargeteventtouch target list から取り出し: retargeting により touchTargettarget に対して再ターゲットした結果を touchTargets追加する。

    3. イベントパスに追加event, target, targetOverride, relatedTarget, touchTargets, false で実行する。

    4. isActivationEvent を true に設定する。ただし eventMouseEvent オブジェクトであり、eventtype 属性が "click" の場合のみ。そうでなければ false。

    5. isActivationEvent が true かつ targetactivation behavior を持つ場合、activationTargettarget に設定する。

    6. slottabletarget に設定する。ただし targetslottable かつ assigned の場合のみ。そうでなければ null。

    7. slot-in-closed-tree を false に設定する。

    8. parenttargetget the parentevent で呼び出した結果に設定する。

    9. parent が null でない間:

      1. slottable が null でない場合:

        1. アサート:parentslot である。

        2. slottable を null に設定する。

        3. parentrootshadow root かつ mode が "closed" の場合、slot-in-closed-tree を true に設定する。

      2. parentslottable かつ assigned の場合、slottableparent に設定する。

      3. relatedTargetretargeting により eventrelatedTargetparent に対して再ターゲットした結果に設定する。

      4. touchTargets を新しい リスト に設定する。

      5. touchTargeteventtouch target list から取り出し: 追加する。retargeting により touchTargetparent に対して再ターゲットした結果を touchTargets に追加する。

      6. parentWindow オブジェクト、または parentnode かつ targetrootshadow-including inclusive ancestor である場合:

        1. isActivationEvent が true、eventbubbles 属性が true、activationTarget が null、かつ parentactivation behavior を持つ場合、activationTargetparent に設定する。

        2. イベントパスに追加event, parent, null, relatedTarget, touchTargets, slot-in-closed-tree で実行する。

      7. それ以外の場合、parentrelatedTarget であれば、parent を null に設定する。

      8. それ以外の場合:

        1. targetparent に設定する。

        2. isActivationEvent が true、activationTarget が null、かつ targetactivation behavior を持つ場合、activationTargettarget に設定する。

        3. イベントパスに追加event, parent, target, relatedTarget, touchTargets, slot-in-closed-tree で実行する。

      9. parent が null でない場合、parentparentget the parentevent で呼び出した結果に設定する。

      10. slot-in-closed-tree を false に設定する。

    10. clearTargetsStructeventpath のうち、shadow-adjusted target が null でない最後の構造体に設定する。

    11. clearTargetsStructshadow-adjusted targetclearTargetsStructrelatedTarget、または clearTargetsStructtouch target list 内の EventTarget オブジェクトが node であり、その rootshadow root である場合、clearTargets を true に設定する。

    12. activationTarget が null でなく、activationTargetlegacy-pre-activation behavior を持つ場合、activationTargetlegacy-pre-activation behavior を実行する。

    13. structeventpath の逆順で取り出す:

      1. structshadow-adjusted target が null でない場合、eventeventPhase 属性を AT_TARGET に設定する。

      2. それ以外の場合、eventeventPhase 属性を CAPTURING_PHASE に設定する。

      3. Invokestruct, event, "capturing", legacyOutputDidListenersThrowFlag(指定されていれば)で実行する。

    14. structeventpath から取り出す:

      1. structshadow-adjusted target が null でない場合、eventeventPhase 属性を AT_TARGET に設定する。

      2. それ以外の場合:

        1. eventbubbles 属性が false であれば、continue する。

        2. eventeventPhase 属性を BUBBLING_PHASE に設定する。

      3. Invokestruct, event, "bubbling", legacyOutputDidListenersThrowFlag(指定されていれば)で実行する。

  7. eventeventPhase 属性を NONE に設定する。

  8. eventcurrentTarget 属性を null に設定する。

  9. eventpath を空のリストに設定する。

  10. eventdispatch flagstop propagation flagstop immediate propagation flag を解除する。

  11. clearTargets が true の場合:

    1. eventtarget を null に設定する。

    2. eventrelatedTarget を null に設定する。

    3. eventtouch target list を空のリストに設定する。

  12. activationTarget が null でない場合:

    1. eventcanceled flag が解除されていれば、activationTargetactivation behaviorevent で実行する。

    2. それ以外の場合、activationTargetlegacy-canceled-activation behavior を持つ場合、activationTargetlegacy-canceled-activation behavior を実行する。

  13. eventcanceled flag が設定されていれば false を返す。そうでなければ true を返す。

イベントパスに追加するには、eventinvocationTargetshadowAdjustedTargetrelatedTargettouchTargets、および slot-in-closed-tree が与えられたとき、以下の手順を実行する:

  1. invocationTargetInShadowTree を false に設定する。

  2. もし invocationTargetノードであり、その ルートシャドウルート であるなら、invocationTargetInShadowTree を true に設定する。

  3. root-of-closed-tree を false に設定する。

  4. もし invocationTargetシャドウルートであり、その mode が "closed" であるなら、root-of-closed-tree を true に設定する。

  5. Append を使って新しい structeventpath に追加する。invocation targetinvocationTargetinvocation-target-in-shadow-treeinvocationTargetInShadowTreeshadow-adjusted targetshadowAdjustedTargetrelatedTargetrelatedTargettouch target listtouchTargetsroot-of-closed-treeroot-of-closed-treeslot-in-closed-treeslot-in-closed-tree

invokeするには、structeventphase、およびオプションの legacyOutputDidListenersThrowFlag が与えられたとき、以下の手順を実行する:

  1. eventtargeteventshadow-adjusted targetstructまたはそれ以前のstructのうち、shadow-adjusted target が null でない最後のもの)に設定する。

  2. eventrelatedTargetstructrelatedTarget に設定する。

  3. eventtouch target liststructtouch target list に設定する。

  4. eventstop propagation flag が設定されていれば、return する。

  5. eventcurrentTarget 属性を structinvocation target に初期化する。

  6. listenersclone した eventcurrentTarget 属性値の event listener list に設定する。

    これは、この時点以降に追加された event listener が実行されないようにするためである。削除は removed フィールドにより影響を受けることに注意。

  7. invocationTargetInShadowTreestructinvocation-target-in-shadow-tree に設定する。

  8. foundinner invokeeventlistenersphaseinvocationTargetInShadowTree、および legacyOutputDidListenersThrowFlag(指定されていれば)で実行した結果に設定する。

  9. found が false かつ eventisTrusted 属性が true の場合:

    1. originalEventTypeeventtype 属性値に設定する。

    2. eventtype 属性値が下記の表の第1列のいずれかの文字列と一致する場合、eventtype 属性値を同じ行の第2列の文字列に設定し、そうでなければ return する。

      イベントタイプ レガシーイベントタイプ
      "animationend" "webkitAnimationEnd"
      "animationiteration" "webkitAnimationIteration"
      "animationstart" "webkitAnimationStart"
      "transitionend" "webkitTransitionEnd"
    3. inner invokeeventlistenersphaseinvocationTargetInShadowTree、および legacyOutputDidListenersThrowFlag(指定されていれば)で実行する。

    4. eventtype 属性値を originalEventType に設定する。

inner invokeするには、eventlistenersphaseinvocationTargetInShadowTree、およびオプションの legacyOutputDidListenersThrowFlag が与えられたとき、以下の手順を実行する:

  1. found を false に設定する。

  2. listenerlisteners から取り出し、removed が false の場合:

    1. eventtype 属性値が listenertype と一致しない場合、continue する。

    2. found を true に設定する。

    3. phase が "capturing" かつ listenercapture が false の場合、continue する。

    4. phase が "bubbling" かつ listenercapture が true の場合、continue する。

    5. listeneronce が true の場合、remove an event listenereventcurrentTarget 属性値と listener で実行する。

    6. globallistenercallbackassociated realmglobal object に設定する。

    7. currentEvent を undefined に設定する。

    8. globalWindow オブジェクトの場合:

      1. currentEventglobalcurrent event に設定する。

      2. invocationTargetInShadowTree が false の場合、globalcurrent eventevent に設定する。

    9. listenerpassive が true の場合、eventin passive listener flag を設定する。

    10. globalWindow オブジェクトの場合、record timing info for event listenereventlistener で実行する。

    11. Call a user object’s operationlistenercallback、"handleEvent"、« event »、eventcurrentTarget 属性値で実行する。これが例外 exception を投げた場合:

      1. Report exceptionlistenercallback の対応する JavaScript オブジェクトの associated realmglobal object で報告する。

      2. legacyOutputDidListenersThrowFlag が指定されていれば設定する。

        legacyOutputDidListenersThrowFlag は Indexed Database API でのみ使用される。[INDEXEDDB]

    12. eventin passive listener flag を解除する。

    13. globalWindow オブジェクトの場合、globalcurrent eventcurrentEvent に設定する。

    14. eventstop immediate propagation flag が設定されていれば、break する。

  3. found を返す。

2.10. イベントの発火

fire an event を使って、e という名前のイベントを target で発火し、オプションで eventConstructor を使用し、IDL属性の初期化方法の説明と legacy target override flag を指定して、以下の手順を実行する:

  1. eventConstructor が指定されていなければ、eventConstructorEvent に設定する。

  2. eventcreating an eventeventConstructortargetrelevant realm で実行した結果に設定する。

  3. eventtype 属性を e に初期化する。

  4. その他の event の IDL 属性を、このアルゴリズムの呼び出し時の説明に従って初期化する。

    これにより isTrusted 属性を false に設定することもできる。

  5. dispatching を使って eventtarget で発火し、legacy target override flag が設定されていればそれを使い、その結果を返す。

DOM における fire は、creating、初期化、および dispatching をまとめて event に対して行うことを意味する。 fire an event はこの処理を簡潔に記述できるようにしている。

eventbubblescancelable 属性を初期化する必要がある場合は、"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. doActionfiring an event named like at target の結果に設定する。

  2. doAction が true なら …

2.11. アクションと発生の違い

event は「発生」を意味し、「アクション」ではない。言い換えると、アルゴリズムからの通知を表し、そのアルゴリズムの今後の進行に影響を与えるために使うことができる(例:preventDefault() の呼び出しなど)。 Events はアクションや何かのアルゴリズムを開始するためのものではない。それが目的ではない。

ここで特に説明する理由は、以前の DOM 仕様では events に「デフォルトアクション」という概念があり、誤解を招いていたためである。 Events はアクションを表したり引き起こしたりするものではなく、進行中のアクションにのみ影響を与えることができる。

3. 進行中のアクティビティの中断

Promise には組み込みの中断メカニズムはありませんが、多くの API では中断のセマンティクスが必要です。AbortController は、対応する AbortSignal オブジェクトの状態を切り替える abort() メソッドを提供することで、これらの要件をサポートすることを目的としています。 中断をサポートしたい API は AbortSignal オブジェクトを受け取り、その状態に応じて処理を決定できます。

AbortController を利用する API は、abort() に応答して、未解決の Promise を AbortSignalabort reason で reject することが推奨されます。

仮想の 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 は次のように実装できます:

function doAmazingness({signal}) {
    return new Promise((resolve, reject) => {
    signal.throwIfAborted();

    // 素晴らしい処理を開始し、完了時に resolve(result) を呼び出す。
    // また、シグナルも監視する:
    signal.addEventListener('abort', () => {
        // 素晴らしい処理を停止し、
        reject(signal.reason);
    });
    });
}

Promise を返さない API は、同等の方法で反応するか、AbortSignalabort reason を全く表に出さないこともできます。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 がこのオブジェクトの AbortSignalabort reason に保存され、関連するアクティビティが中断されることを監視者に通知する。reason が undefined の場合は "AbortError" DOMException が保存される。

AbortController オブジェクトには、関連付けられた signalAbortSignal オブジェクト)がある。

new AbortController() コンストラクタの手順:

  1. signal を新しい AbortSignal オブジェクトに設定する。

  2. thissignalsignal に設定する。

signal getter の手順は、thissignal を返すこと。

abort(reason) メソッドの手順は、reason が指定されていれば signal abortthisreason とともに実行すること。

signal abortAbortController controller で、オプションの reason とともに実行するには、controllersignalreason とともに signal abort を実行すること。

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 が undefined でない場合は 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 の値)があり、初期値は undefined である。

AbortSignal オブジェクトには、関連付けられた 中断アルゴリズム中断されたときに実行されるアルゴリズムの セット)があり、初期状態は空である。

中断アルゴリズムは、複雑な要件を持つ API が abort() に合理的な方法で反応できるようにする。たとえば、特定の API の 中断理由は、サービスワーカーなどのスレッド間の環境に伝播する必要がある場合がある。

AbortSignal オブジェクトには dependent(ブール値)があり、初期値は false である。

AbortSignal オブジェクトには、関連付けられた source signals(オブジェクトがその 中断された状態に依存する AbortSignal オブジェクトの弱い セット)があり、初期状態は空である。

AbortSignal オブジェクトには、関連付けられた dependent signals(オブジェクトにその 中断された状態を依存する AbortSignal オブジェクトの弱い セット)があり、初期状態は空である。


静的な abort(reason) メソッドのステップは次のとおりである:

  1. signal を新しい AbortSignal オブジェクトにする。

  2. signal中断理由を、reason が指定されている場合は reason に、そうでない場合は新しい "AbortError" DOMException に設定する。

  3. signal を返す。

静的な timeout(milliseconds) メソッドのステップは次のとおりである:

  1. signal を新しい AbortSignal オブジェクトにする。

  2. globalsignal関連するグローバルオブジェクトにする。

  3. タイムアウト後にステップを実行するを、global、"AbortSignal-timeout"、milliseconds、および次のステップで実行する:

    1. グローバルタスクをキューに入れるを、タイマータスクソース上で global を指定して、signal と新しい "TimeoutError" DOMException を指定して 中断を通知する

    このタイムアウトの間、signalabort イベントにイベントリスナーが登録されている場合、global から signal への強い参照がなければならない。

  4. signal を返す。

静的な any(signals) メソッドのステップは、signals から AbortSignal現在のレルムを使用して 依存する中断シグナルを作成する結果を返すことである。

aborted ゲッターのステップは、this中断されている場合は true を、そうでない場合は false を返すことである。

reason ゲッターのステップは、this中断理由を返すことである。

throwIfAborted() メソッドのステップは、this中断されている場合、this中断理由をスローすることである。

このメソッドは主に、AbortSignal を受け入れる関数が、AbortSignal を他のメソッドに渡す代わりに、特定のチェックポイントでスロー(または拒否された Promise を返す)したい場合に便利である。たとえば、次の関数は、条件をポーリングする各試行の間に中断を許可する。これにより、実際の非同期操作(つまり、await func())が AbortSignal を受け入れなくても、ポーリングプロセスを中断する機会が与えられる。

async function waitForCondition(func, targetValue, { signal } = {}) {
          while (true) {
            signal?.throwIfAborted();
        
            const result = await func();
            if (result === targetValue) {
              return;
            }
          }
        }
        

onabort 属性は、onabort イベントハンドラーイベントハンドラー IDL 属性であり、その イベントハンドラーイベントタイプabort である。

AbortSignal オブジェクトへの変更は、対応する AbortController オブジェクトの意図を表すが、AbortSignal オブジェクトを監視する API は、それらを無視することを選択できる。たとえば、操作がすでに完了している場合などである。


AbortSignal オブジェクトは、その 中断理由が undefined でない場合に 中断される

アルゴリズム algorithmAbortSignal オブジェクト signal追加するには:

  1. signal中断されている場合、return する。

  2. algorithmsignal中断アルゴリズム追加する

アルゴリズム algorithmAbortSignal signal から 削除するには、algorithmsignal中断アルゴリズムから 削除する

AbortSignal オブジェクト signal とオプションの reason を指定して 中断を通知するには:

  1. signal中断されている場合、return する。

  2. signal中断理由を、reason が指定されている場合は reason に、そうでない場合は新しい "AbortError" DOMException に設定する。

  3. dependentSignalsToAbort を新しい リストにする。

  4. signal依存シグナルの各 dependentSignal について 繰り返す

    1. dependentSignal中断されていない場合:

      1. dependentSignal中断理由signal中断理由に設定する。

      2. dependentSignaldependentSignalsToAbort追加する

  5. signal中断ステップを実行する

  6. dependentSignalsToAbort の各 dependentSignal について、繰り返しdependentSignal中断ステップを実行する

AbortSignal signal中断ステップを実行するには:

  1. signal中断アルゴリズムの各 algorithm について 繰り返すalgorithm を実行する。

  2. signal中断アルゴリズム空にする

  3. abort という名前の イベントを signal で発火する

AbortSignal オブジェクトのリスト signals から、signalInterfaceAbortSignal またはそれを継承するインターフェースでなければならない)と realm を使用して、依存する中断シグナルを作成するには:

  1. resultSignal を、realm を使用して signalInterface を実装する 新しいオブジェクトにする。

  2. signals の各 signal について 繰り返すsignal中断されている場合、resultSignal中断理由signal中断理由に設定し、resultSignal を返す。

  3. resultSignaldependent を true に設定する。

  4. signals の各 signal について 繰り返す

    1. signaldependent が false の場合:

      1. signalresultSignalsource signals追加する

      2. resultSignalsignaldependent signals追加する

    2. そうでない場合、signalsource signals の各 sourceSignal について 繰り返す

      1. 表明:sourceSignal中断されておらずdependent ではない。

      2. sourceSignalresultSignalsource signals追加する

      3. resultSignalsourceSignaldependent signals追加する

  5. resultSignal を返す。

3.2.1. ガベージコレクション

中断されていない dependentAbortSignal オブジェクトは、その source signals が空でなく、abort イベントに登録されたイベントリスナーがあるか、その 中断アルゴリズムが空でない間は、ガベージコレクションされてはならない。

3.3. API での AbortControllerAbortSignal オブジェクトの使用

中断可能な操作を表すために Promise を使用するウェブプラットフォーム API は、次に従わなければならない:

Promise を返すメソッド doAmazingness(options) のメソッドステップは次のようになる:

  1. globalthis関連するグローバルオブジェクトにする。

  2. p新しい Promise にする。

  3. options["signal"] が 存在する場合:

    1. signaloptions["signal"] にする。

    2. signal中断されている場合、signal中断理由p拒否しp を返す。

    3. 次の中断ステップを signal追加する

      1. 素晴らしいことをするのを停止する。

      2. signal中断理由p拒否する

  4. 次のステップを 並行して実行する:

    1. amazingResult を素晴らしいことをした結果にする。

    2. global を指定してアメージングタスクソース上で グローバルタスクをキューに入れamazingResultp解決する

  5. p を返す。

Promise を使用しない API も、可能な限り上記に従うべきである。

4. ノード

4.1. "The DOM" の概要

本来の意味において、"The DOM" は文書(特に HTML と XML 文書)にアクセスし操作するための API である。この仕様では、「文書」という用語は、短い静的文書から、リッチメディアを含む長いエッセイや報告書、さらには本格的なインタラクティブアプリケーションまで、あらゆるマークアップベースのリソースに使用される。

このような各文書は ノードツリーとして表される。ツリー内の ノードの一部は を持つことができるが、他は常にリーフである。

例として、この HTML 文書を考えてみる:

<!DOCTYPE html>
<html class=e>
    <head><title>Aliens?</title></head>
    <body>Why yes.</body>
</html>

これは次のように表される:

HTML パースの魔法により、すべての ASCII 空白文字Text ノードに変換されるわけではないが、一般的な概念は明確である。マークアップが入力され、ノードツリーが出力される。

優れた Live DOM Viewer を使用して、この件についてより詳細に調べることができる。

4.2. ノードツリー

ノードNode実装するオブジェクトである。 ノードツリー参加し、そのツリーは ノードツリーとして知られている。

実際には、より具体的なオブジェクトを扱う。

Node実装するオブジェクトは、継承されたインターフェースも実装する:DocumentDocumentTypeDocumentFragmentElementCharacterData、 または Attr

DocumentFragment を実装するオブジェクトは、時には ShadowRoot も実装する。

Element を実装するオブジェクトは、通常、HTMLAnchorElement などの継承されたインターフェースも実装する。

CharacterData を実装するオブジェクトは、継承されたインターフェースも実装する:TextProcessingInstruction、 または Comment

Text を実装するオブジェクトは、時には CDATASection も実装する。

したがって、すべてのノードプライマリインターフェースは次のいずれかである:DocumentDocumentTypeDocumentFragmentShadowRootElement または Element の継承されたインターフェース、 AttrTextCDATASectionProcessingInstruction、 または Comment

簡潔にするため、この仕様では Node と継承されたインターフェース NodeInterface実装するオブジェクトを、 NodeInterface ノードと呼ぶ。

ノードツリーは次のように制約される。これは ノードとその潜在的なの関係として表現される:

Document

ツリー順で:

  1. 0個以上の ProcessingInstruction または Comment ノード

  2. オプションで1つの DocumentType ノード

  3. 0個以上の ProcessingInstruction または Comment ノード

  4. オプションで1つの Element ノード

  5. 0個以上の ProcessingInstruction または Comment ノード

DocumentFragment
Element

0個以上の Element または CharacterData ノード

DocumentType
CharacterData
Attr

なし。

Attr ノードは歴史的な理由によりツリーに参加します。ただし、決して(非nullの)を持つことはなく、 そのため常にツリーの中で単独です。

ノード node長さを判定するには、次の手順を実行します:

  1. もしnodeDocumentType または Attr ノードであれば、0を返す。

  2. もしnodeCharacterData ノードであれば、nodedata長さを返す。

  3. nodeの数を返す。

ノードは、その 長さが0の場合、と見なされます。

4.2.1. 文書ツリー

文書ツリールート文書であるノードツリーである。

文書文書要素は、 そのがその文書である要素(存在する場合)、そうでない場合は null である。

ノードツリーの制約により、そのような要素は1つしか存在できない。

ノードルートドキュメントである場合、そのノードはドキュメントツリー内とみなす。

ノードドキュメントツリー内である場合、そのノードはドキュメント内とみなす。 ドキュメント内という用語は今後使用しないこととされている。これは、その用語を使っている標準がシャドウツリーに対応できていないことを示している。

4.2.2. シャドウツリー

シャドウツリールートシャドウルートであるノードツリーである。

シャドウルートは、その ホストを通じて、常に別のノードツリーに接続されている。したがってシャドウツリーは決して単独ではない。 シャドウルートホストノードツリーは、時にライトツリーと呼ばれる。

シャドウツリーに対応するライトツリーは、それ自体がシャドウツリーである場合もある。

ノードは、その シャドウを含むルート文書の場合、接続されている

4.2.2.1. スロット

シャドウツリーは、 スロットである0個以上の要素を含む。

スロットは、HTML の slot 要素を通じてのみ作成できる。

スロットには関連付けられた名前(文字列)がある。特に明記されていない限り、それは空文字列である。

スロット名前を更新するには、次の属性変更ステップを使用する:

  1. elementスロットで、localNamename で、 namespace が null の場合:

    1. valueoldValue の場合、return する。

    2. value が null で oldValue が空文字列の場合、return する。

    3. value が空文字列で oldValue が null の場合、return する。

    4. value が null または空文字列の場合、element名前を空文字列に設定する。

    5. そうでない場合、element名前value に設定する。

    6. elementルートを指定してツリーのスロット可能要素を割り当てるを実行する。

シャドウツリー内の、ツリー順で最初のスロットで、その 名前が空文字列であるものは、時に「デフォルトスロット」として知られる。

スロットには関連付けられた割り当てられたノードスロット可能要素のリスト)がある。特に明記されていない限り、それは空である。

4.2.2.2. スロット可能要素

ElementText ノードスロット可能要素である。

スロットスロット可能要素になることができる。

スロット可能要素には関連付けられた名前(文字列)がある。特に明記されていない限り、それは空文字列である。

スロット可能要素名前を更新するには、次の属性変更ステップを使用する:

  1. localNameslotnamespace が null の場合:

    1. valueoldValue の場合、return する。

    2. value が null で oldValue が空文字列の場合、return する。

    3. value が空文字列で oldValue が null の場合、return する。

    4. value が null または空文字列の場合、element名前を空文字列に設定する。

    5. そうでない場合、element名前value に設定する。

    6. element割り当てられている場合、element割り当てられたスロットに対してスロット可能要素を割り当てるを実行する。

    7. element に対してスロットを割り当てるを実行する。

スロット可能要素には関連付けられた 割り当てられたスロット(null またはスロット)がある。 特に明記されていない限り、それは null である。スロット可能要素は、その割り当てられたスロットが非 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 について繰り返しslottablehost の場合、slottableresult追加する

  6. そうでない場合、host の各スロット可能要素 slottable について、ツリー順で:

    1. foundSlotslottable を指定してスロットを見つけた結果にする。

    2. foundSlotslot の場合、slottableresult追加する

  7. result を返す。

指定されたスロット slot に対して平坦化されたスロット可能要素を見つけるには:

  1. result を « » にする。

  2. slotルートシャドウルートでない場合、result を返す。

  3. slottablesslot を指定してスロット可能要素を見つけた結果にする。

  4. slottables が空のリストの場合、slot の各スロット可能要素ツリー順slottables に追加する。

  5. slottables の各 node について:

    1. nodeルートシャドウルートスロットの場合:

      1. temporaryResultnode を指定して平坦化されたスロット可能要素を見つけた結果にする。

      2. temporaryResult の各スロット可能要素を順番に result に追加する。

    2. そうでない場合、noderesult に追加する。

  6. result を返す。

4.2.2.4. スロット可能要素とスロットの割り当て

スロット slot に対してスロット可能要素を割り当てるには:

  1. slottablesslot に対してスロット可能要素を見つけた結果にする。

  2. slottablesslot割り当てられたノードが同一でない場合、slot に対してスロット変更をシグナルするを実行する。

  3. slot割り当てられたノードslottables に設定する。

  4. slottables の各 slottable について: slottable割り当てられたスロットslot に設定する。

指定されたノード root に対してツリーのスロット可能要素を割り当てるには、 root包括的子孫の各スロットに対して、ツリー順スロット可能要素を割り当てるを実行する。

指定されたスロット可能要素 slottable に対してスロットを割り当てるには:

  1. slotslottable を指定してスロットを見つけた結果にする。

  2. slot が非 null の場合、slot に対してスロット可能要素を割り当てるを実行する。

4.2.2.5. スロット変更のシグナル

同一オリジンウィンドウエージェントにはシグナルスロットスロットセット)があり、これは最初は空である。[HTML]

スロット slot に対してスロット変更をシグナルするには:

  1. slotslot関連エージェントシグナルスロット追加する

  2. ミューテーションオブザーバー複合マイクロタスクをキューに入れる

4.2.3. 変更アルゴリズム

ノード pre-insert の妥当性を確保するために、 node nodenode parent の null または node child の前に挿入する際に行う手順:

  1. もし parentDocumentDocumentFragment、 または Element node でない場合、throw して "HierarchyRequestError" の DOMException とする。

  2. もし nodeparenthost-including inclusive ancestor である場合、throw して "HierarchyRequestError" の DOMException とする。

  3. もし child が null でなく、その parentparent でない場合、throw して "NotFoundError" の DOMException とする。

  4. もし nodeDocumentFragmentDocumentTypeElement、 または CharacterData node でない場合、throw して "HierarchyRequestError" の DOMException とする。

  5. もし nodeTextnode であり parentdocument である、または nodedoctypeparentdocument でない場合、throw して "HierarchyRequestError" の DOMException とする。

  6. もし parentdocument であり、以下のいずれか(interface nodeimplements しているものに応じて切り替える)が成り立つ場合、throw して "HierarchyRequestError" の DOMException とする。

    DocumentFragment

    もし node が要素 elementchild を 1 つより多く持つ、または Textnodechild を持つ場合。

    そうでない場合、もし node が要素 elementchild を 1 つ持ち、かつ parent が要素 elementchild を持つ、childdoctype である、または child が null でなくかつ doctypefollowing child である場合。

    Element

    parent が要素 elementchild を持つ、childdoctype である、または child が null でなくかつdoctypefollowing child である場合。

    DocumentType

    parentdoctypechild を持つ、child が null でなくて要素 elementpreceding child である、または child が null で parent が要素 elementchild を持つ場合。

ノード pre-insert を行うには、node nodenode parent の null または node child の前に挿入する手順:

  1. Ensure pre-insert validity を実行して、 nodeparentchild の前に挿入しても良いか確認する。

  2. referenceChildchild とする。

  3. もし referenceChildnode と同じであれば、referenceChildnodenext sibling に設定する。

  4. Insert を実行して nodeparentreferenceChild の前に挿入する。

  5. node を返す。

仕様 は、すべてまたは一部の node に対して insertion steps を定義することがある。 このアルゴリズムは下で示す insert アルゴリズムの通り、insertedNode を渡される。 これらのステップは insertedNode が参加する node tree を変更したり、ブラウジングコンテキストを作成したり、 イベントを発火したり、あるいは JavaScript を実行してはならない。ただし、これらを非同期的に行うために タスクをキュー することはできる。

insertion steps は 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. insert アルゴリズムが実行され、script 要素と style 要素が順に挿入される。

    1. HTML 標準の insertion stepsscript 要素に対して実行されるが、何もしない。[HTML]

    2. HTML 標準の insertion steps style 要素に対して実行され、そのスタイル規則が直ちに文書に適用される。[HTML]

    3. HTML 標準の post-connection stepsscript 要素に対して実行され、スクリプトが実行される。そのスクリプトは上のステップで適用されたスタイル規則を直ちに観測する。[HTML]

仕様 は、すべてまたは一部の nodes に対して post-connection steps を定義することがある。アルゴリズムには下で示される通り connectedNode が渡される。

post-connection steps の目的は、nodes に対して接続に関連する操作を行い、connectedNode が参加する node tree を変更したり、ブラウジングコンテキストを作成したり、あるいは JavaScript を実行したりする機会を提供することである。これらのステップは一括挿入に関する主要な副作用がすべて完了した後に、非同期的にタスクをキューしてそれらを行うことを許す。

仕様 は、すべてまたは一部の nodes に対して children changed steps を定義することがある。アルゴリズムは引数を取らず、insertremove、および replace data から呼び出される。

ノード insert を行うには、node nodenode parent の null または node child の前に挿入する。オプションのブール値 suppressObservers(デフォルト false)を受け取る:

  1. もし nodeDocumentFragment node であれば、nodesnodechildren とする。そうでなければ « node » とする。

  2. countnodessize とする。

  3. もし count が 0 であれば、戻る。

  4. もし nodeDocumentFragment node であれば:

    1. Remove を呼んで、その childrensuppressObservers を true にして削除する。

    2. Queue a tree mutation recordnode について、「« », nodes, null, null」を用いてキューする。

      このステップは意図的に suppressObservers を考慮しない。

  5. もし child が非 null であれば:

    1. live range について、その start nodeparent であり start offsetchildindex より大きい場合:その start offsetcount 増やす。

    2. live range について、その end nodeparent であり end offsetchildindex より大きい場合:その end offsetcount 増やす。

  6. previousSiblingchildprevious sibling、または child が null の場合は parentlast child とする。

  7. nodes の各 node について、tree order に従って次を行う:

    1. Adopt を呼んで、nodeparentnode document に適合させる。

    2. もし child が null であれば、append を用いて nodeparentchildren に追加する。

    3. そうでなければ、insert を用いて nodeparentchildrenchildindex の前に挿入する。

    4. もし parentshadow host で、その shadow rootslot assignment が "named" であり、かつ nodeslottable であれば、assign a slot を実行して node にスロットを割り当てる。

    5. もし parentrootshadow root であり、 parent がスロット slot で、その assigned nodes が空リストであれば、 signal a slot changeparent に対して実行する。

    6. assign slottables for a treenoderoot に対して実行する。

    7. node の各 shadow-including inclusive descendant inclusiveDescendant について、 shadow-including tree order に従って次を行う:

      1. insertion stepsinclusiveDescendant に対して実行する。

      2. もし inclusiveDescendantconnected でないなら、continue する。

      3. もし inclusiveDescendantelement で、かつ inclusiveDescendantcustom element registry が非 null であれば:

        1. もし inclusiveDescendantcustom element registryis scoped が true であれば、append を用いて inclusiveDescendantnode documentinclusiveDescendantcustom element registryscoped document set に追加する。

        2. もし inclusiveDescendantcustom であれば、enqueue a custom element callback reaction を呼び、 inclusiveDescendant、コールバック名 "connectedCallback"、および « » を渡す。

        3. それ以外の場合、try to upgradeinclusiveDescendant に対して試みる。

          もしこれによって inclusiveDescendant が成功裏にアップグレードされれば、その connectedCallback は自動的にキューに登録される。

      4. それ以外で、もし inclusiveDescendantshadow root で、 その custom element registry が非 null であり、 かつその custom element registryis scoped が true であれば、append を用いて inclusiveDescendantnode document を その custom element registryscoped document set に追加する。

  8. もし suppressObservers が false であれば、queue a tree mutation recordparent について、nodes、« »、previousSibling、および child を用いてキューする。

  9. children changed stepsparent に対して実行する。

  10. staticNodeList を最初は « » の list として用意する。

    post-connection steps をいずれかのノードに対して呼ぶ前に、全てのノードを 事前に 集める。この理由は、post-connection steps がツリー構造を変更し得るため、ライブな走査が安全でなくなり、同じノードに対して複数回 post-connection steps が呼ばれる可能性があるからである。

  11. nodes の各 node について、tree order に従って次を行う:

    1. shadow-including inclusive descendant inclusiveDescendant を、shadow-including tree order の順で staticNodeListappend する。

  12. For each node of staticNodeList: もし nodeconnected であれば、post-connection stepsnode に対して実行する。

ノード append を行うには、node nodenode parent に対して、 pre-insert を使って null の前に挿入する。


仕様は、すべてまたは一部のノードに対して 移動手順を定義してもよい。 このアルゴリズムには、ノード movedNode と、 ノードまたはnullの oldParent が、 下記moveアルゴリズムで示される通り渡される。 挿入手順と同様、 これら手順は ノードツリーmovedNode属しているもの)を変更してはならず、 閲覧コンテキストの生成や、 イベントの発火、 その他JavaScriptの実行を行ってはならない。ただし、これらの動作を非同期で行うためにタスクをキューイングすることは許されている。

ノード move を行うには、node nodenode newParent の null または node child の前に移動する手順:

  1. もし newParentshadow-including rootnodeshadow-including root と異なる場合、throw して "HierarchyRequestError" の DOMException とする。

    これにより、移動は newParentconnectednodeconnected と同じである場合にのみ実行される、という副作用がある。

  2. もし nodehost-including inclusive ancestornewParent の祖先であれば、 throw して "HierarchyRequestError" の DOMException とする。

  3. もし child が null でなく、その parentnewParent でない場合、throw して "NotFoundError" の DOMException とする。

  4. もし nodeElement または CharacterDatanode でない場合、throw して "HierarchyRequestError" の DOMException とする。

  5. もし nodeTextnode であり newParentdocument であれば、 throw して "HierarchyRequestError" の DOMException とする。

  6. もし newParentdocument で、かつ nodeElementnode であり、かつ newParent が要素 elementchild を持つ、childdoctype である、または child が null でなくかつ doctypefollowing child である場合、throw して "HierarchyRequestError" の DOMException とする。

  7. oldParentnodeparent とする。

  8. Assert: oldParent は非 null であることを確認する。

  9. live range pre-remove stepsnode に対して実行する。

  10. NodeIterator オブジェクト iterator について、その rootnode documentnodenode document と同じであれば、NodeIterator pre-remove stepsnodeiterator を渡して実行する。

  11. oldPreviousSiblingnodeprevious sibling とする。

  12. oldNextSiblingnodenext sibling とする。

  13. Remove を使って nodeoldParentchildren から削除する。

  14. もし nodeassigned であれば、assign slottablesnodeassigned slot に対して実行する。

  15. もし oldParentrootshadow root で、かつ oldParent がスロット slot で、その assigned nodes が空であれば、signal a slot changeoldParent に対して実行する。

  16. もし node がスロット slot を含む inclusive descendant を持つ場合:

    1. assign slottables for a treeoldParentroot に対して実行する。

    2. assign slottables for a treenode に対して実行する。

  17. もし child が非 null であれば:

    1. live range について、その start nodenewParent であり start offsetchildindex より大きい場合:その start offset を 1 増やす。

    2. live range について、その end nodenewParent であり end offsetchildindex より大きい場合:その end offset を 1 増やす。

  18. newPreviousSibling を、もし child が非 null であれば childprevious sibling、そうでなければ newParentlast child とする。

  19. もし child が null であれば、append を用いて nodenewParentchildren に追加する。

  20. そうでなければ、insert を用いて nodenewParentchildrenchildindex の前に挿入する。

  21. もし newParentshadow host で、その shadow rootslot assignment が "named" で nodeslottable であれば、assign a slot を実行して node にスロットを割り当てる。

  22. もし newParentrootshadow root で、 newParentslot で、その assigned nodes が空であれば、signal a slot changenewParent に対して実行する。

  23. assign slottables for a treenoderoot に対して実行する。

  24. node の各 shadow-including inclusive descendant inclusiveDescendant について、 shadow-including tree order に従って次を行う:

    1. もし inclusiveDescendantnode であれば、moving stepsinclusiveDescendantoldParent に対して実行する。そうでなければ、moving stepsinclusiveDescendant と null に対して実行する。

      move アルゴリズムは insertremove とは別のプリミティブであるため、inclusiveDescendant に対して従来の insertion stepsremoving steps を呼び出さない。

    2. もし inclusiveDescendantcustom であり、かつ newParentconnected であれば、enqueue a custom element callback reaction を呼んで、 inclusiveDescendant、コールバック名 "connectedMoveCallback"、および « » を渡す。

  25. Queue a tree mutation recordoldParent について、「« », « node », oldPreviousSibling, oldNextSibling」を用いてキューする。

  26. Queue a tree mutation recordnewParent について、「« node », « », newPreviousSibling, child」を用いてキューする。


ノード replace を行うには、node childnode node で置き換える手順(node parent 内):

  1. もし parentDocumentDocumentFragment、 または Element node でない場合、throw して "HierarchyRequestError" の DOMException とする。

  2. もし nodehost-including inclusive ancestorparent の祖先であれば、 throw して "HierarchyRequestError" の DOMException とする。

  3. もし childparentparent でない場合、throw して "NotFoundError" の DOMException とする。

  4. もし nodeDocumentFragmentDocumentTypeElement、 または CharacterData node でない場合、throw して "HierarchyRequestError" の DOMException とする。

  5. もし nodeTextnode であり parentdocument である、または nodedoctypeparentdocument でない場合、throw して "HierarchyRequestError" の DOMException とする。

  6. もし parentdocument であり、以下のいずれか(interface nodeimplements しているものに応じて切り替える)が成り立つ場合、throw して "HierarchyRequestError" の DOMException とする。

    DocumentFragment

    もし node が要素 elementchild を 1 つより多く持つ、または Textnodechild を持つ場合。

    そうでない場合、もし node が要素 elementchild を 1 つ持ち、かつ parent が要素 elementchild を持っており、それが child でないか、または doctypefollowing child である場合。

    Element

    parent が要素 elementchild を持っており、それが child でないか、または doctypefollowing child である場合。

    DocumentType

    parentdoctypechild を持っており、それが child でない、または要素 elementpreceding child である場合。

    上の条件は pre-insert アルゴリズムの条件とは異なる点がある。

  7. referenceChildchildnext sibling とする。

  8. もし referenceChildnode と同じであれば、referenceChildnodenext sibling に設定する。

  9. previousSiblingchildprevious sibling とする。

  10. removedNodes を空集合として用意する。

  11. もし childparent が非 null であれば:

    1. removedNodes を « child » に設定する。

    2. Remove を呼んで childsuppressObservers を true にして削除する。

    上の条件が偽になり得るのは childnode と同じ場合のみである。

  12. nodes を、もし nodeDocumentFragment node であればその children、そうでなければ « node » とする。

  13. Insert を呼んで nodeparentreferenceChild の前に挿入する(suppressObservers を true に設定して実行)。

  14. Queue a tree mutation recordparent について、 nodesremovedNodespreviousSibling、および referenceChild を用いてキューする。

  15. child を返す。

Node のための replace all を行うには、ノードまたは null の node nodenode parent 内で置き換える手順:

  1. removedNodesparentchildren とする。

  2. addedNodes を空集合とする。

  3. もし nodeDocumentFragment node であれば、addedNodesnodechildren に設定する。

  4. そうでなければ、もし node が非 null であれば addedNodes を « node » に設定する。

  5. Remove を呼んで parent の全ての children を、suppressObservers を true にしてツリー順に削除する。

  6. もし node が非 null であれば、insert を呼んで nodeparent の null の前に挿入する(suppressObservers を true に設定して実行)。

  7. もし addedNodes または removedNodes空でない 場合、queue a tree mutation recordparent について、addedNodesremovedNodes、null、null を用いてキューする。

このアルゴリズムは node tree の制約に関するチェックを行わない。仕様作成者はこれを注意して使用する必要がある。


ノード pre-remove を行うには、node childnode parent から削除する手順:

  1. もし childparentparent でない場合、throw して "NotFoundError" の DOMException とする。

  2. Remove を呼んで child を削除する。

  3. child を返す。

仕様 は、すべてまたは一部の nodes に対して removing steps を定義することがある。アルゴリズムは、下で示す remove アルゴリズムに従って node removedNode と ノードまたは null の oldParent を渡される。

ノード remove を行うには、node node を削除する。オプションのブール値 suppressObservers(デフォルト false)を受け取る:

  1. parentnodeparent とする。

  2. Assert: parent は非 null である。

  3. live range pre-remove stepsnode に対して実行する。

  4. NodeIterator オブジェクト iterator について、その rootnode documentnodenode document と同じであれば、NodeIterator pre-remove stepsnodeiterator を渡して実行する。

  5. oldPreviousSiblingnodeprevious sibling とする。

  6. oldNextSiblingnodenext sibling とする。

  7. Remove を使って node をその parentchildren から削除する。

  8. もし nodeassigned であれば、assign slottablesnodeassigned slot に対して実行する。

  9. もし parentrootshadow root で、かつ parent がスロット slot で、その assigned nodes が空であれば、 signal a slot changeparent に対して実行する。

  10. もし nodeinclusive descendant が存在し、それが slot である場合:

    1. assign slottables for a treeparentroot に対して実行する。

    2. assign slottables for a treenode に対して実行する。

  11. removing stepsnodeparent を渡して実行する。

  12. isParentConnectedparentconnected とする。

  13. もし nodecustom であり、かつ isParentConnected が true であれば、 enqueue a custom element callback reaction を呼んで、 node、コールバック名 "disconnectedCallback"、および « » を渡す。

    現時点では customelements に対して parent を渡さないようにしている。将来的に必要があれば変更される可能性がある。

  14. node の各 shadow-including descendant descendant について、 shadow-including tree order に従って次を行う:

    1. removing stepsdescendant と null を渡して実行する。

    2. もし descendantcustom であり、かつ isParentConnected が true であれば、enqueue a custom element callback reaction を呼んで、 descendant、コールバック名 "disconnectedCallback"、および « » を渡す。

  15. inclusive ancestor inclusiveAncestor について、 そして各 for each registeredinclusiveAncestorregistered observer list に含まれている場合、もし registeredoptions["subtree"] が true であれば、 append を用いて新しい transient registered observer を作り、その observerregisteredobserver にし、optionsregisteredoptions にし、 sourceregistered が属する noderegistered observer list にする。

  16. もし suppressObservers が false であれば、queue a tree mutation recordparent について、「« », « node », oldPreviousSibling, oldNextSibling」を用いてキューする。

  17. children changed stepsparent に対して実行する。

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) メソッドの手順は、 ツリー順this子孫の中から IDelementIdである 最初の要素を返します。 該当する要素がなければ、nullを返します。

4.2.5. ミックスイン DocumentOrShadowRoot

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

documentOrShadowRootCustomElementRegistry オブジェクトを返します(存在すれば)。なければnullを返します。

customElementRegistry ゲッターの手順は以下の通りです。

  1. thisドキュメントなら、 thisカスタム要素レジストリを返す。

  2. Assert: thisShadowRoot ノードである。

  3. thisカスタム要素レジストリを返す。

DocumentOrShadowRoot ミックスインは、ドキュメントシャドウルートの両方で 共有されるAPIを定義したい他の標準でも利用されることが期待されています。

4.2.6. ミックスイン ParentNode

ノード集合をノードへ変換するには、リストとしてのノードと文字列 nodes、およびdocument document を与える:

  1. nodes 内の各文字列を、新しい Text ノード に置き換える。その data はその文字列であり、 ノード文書document である。

  2. もし nodesサイズ が 1 であれば、nodes[0] を返す。

  3. fragment に新しい DocumentFragment ノード を設定し、その ノード文書document である。

  4. nodes の各 node について: append により nodefragment に追加する。

  5. fragment を返す。

interface mixin ParentNode {
  [SameObject] readonly attribute HTMLCollection children;
  readonly attribute Element? firstElementChild;
  readonly attribute Element? lastElementChild;
  readonly attribute unsigned long childElementCount;

  [CEReactions, Unscopable] undefined prepend((Node or DOMString)... nodes);
  [CEReactions, Unscopable] undefined append((Node or DOMString)... nodes);
  [CEReactions, Unscopable] undefined replaceChildren((Node or DOMString)... nodes);

  [CEReactions] undefined moveBefore(Node node, Node? child);

  Element? querySelector(DOMString selectors);
  [NewObject] NodeList querySelectorAll(DOMString selectors);
};
Document includes ParentNode;
DocumentFragment includes ParentNode;
Element includes ParentNode;
collection = node . children
要素を返します。
element = node . firstElementChild
最初のである要素を返します。そうでなければ null です。
element = node . lastElementChild
最後のである要素を返します。そうでなければ null です。
node . prepend(nodes)

nodesnode最初の子の前に挿入します。その際、nodes 内の文字列は同等の Text ノードに置き換えられます。

制約が違反した場合、"HierarchyRequestError" DOMException を投げます。対象はノードツリーです。

node . append(nodes)

nodesnode最後の子の後ろに挿入します。その際、nodes 内の文字列は同等の Text ノード に置き換えられます。

制約が違反した場合、"HierarchyRequestError" DOMException を投げます。対象はノードツリーです。

node . replaceChildren(nodes)

node のすべてのnodes に置き換えます。その際、nodes 内の文字列は同等の Text ノード に置き換えられます。

制約が違反した場合、"HierarchyRequestError" DOMException を投げます。対象はノードツリーです。

node . moveBefore(movedNode, child)

movedNodechild の後ろに、child が null の場合は node最後の子 の後ろに、削除せずに移動します。このメソッドは movedNode に紐付く状態を保持します。

制約が違反した場合、または移動ノードの状態が保持できない場合は、"HierarchyRequestError" DOMException を投げます。対象はノードツリーです。

node . querySelector(selectors)

node要素のうち selectors を満たす子孫で最初のものを返します。

node . querySelectorAll(selectors)

node要素 子孫 のうち selectors を満たすすべてを返します。

children のgetter手順は、HTMLCollection型のコレクションを返します。対象は this要素 です。

firstElementChild のgetter手順は、最初のである要素を返します。そうでなければ null です。

lastElementChild のgetter手順は、最後のである要素を返します。そうでなければ null です。

childElementCount のgetter手順は、のうちthisに属する要素の数を返します。

prepend(nodes) メソッドの手順は次の通りです:

  1. nodeノード集合をノードへ変換する の結果として、nodesthisノード文書を与えて得る。

  2. pre-insertnodethis に、最初の子 の前に挿入します。

append(nodes) メソッドの手順は次の通りです:

  1. nodeノード集合をノードへ変換する の結果として、nodesthisノード文書を与えて得る。

  2. appendnodethis へ追加する。

replaceChildren(nodes) メソッドの手順は次の通りです:

  1. nodeノード集合をノードへ変換する の結果として、nodesthisノード文書を与えて得る。

  2. pre-insertの妥当性nodethis, null で検証する。

  3. replace allにより、nodethis の中身を置き換える。

moveBefore(node, child) メソッドの手順は次の通りです:

  1. referenceChildchild に設定する。

  2. もし referenceChildnode なら、referenceChildnode次の兄弟に設定する。

  3. movenodethis 内の referenceChild の前に移動する。

querySelector(selectors) メソッドの手順は、selectors文字列をスコープマッチし、その結果の最初の要素(リストが空でなければ)を selectorsthis で返し、空なら null を返します。

querySelectorAll(selectors) メソッドの手順は、静的な結果として、selectors文字列をスコープマッチし、selectorsthis での結果を返します。

4.2.7. ミックスイン NonDocumentTypeChildNode

Web互換性のため、previousElementSibling および nextElementSibling 属性はdoctype(およびChildNode)で公開されません。

interface mixin NonDocumentTypeChildNode {
  readonly attribute Element? previousElementSibling;
  readonly attribute Element? nextElementSibling;
};
Element includes NonDocumentTypeChildNode;
CharacterData includes NonDocumentTypeChildNode;
element = node . previousElementSibling
最初の前の兄弟要素であるものを返します。なければnull。
element = node . nextElementSibling
最初の後の兄弟要素であるものを返します。なければnull。

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)

nodesnode の直前に挿入します。その際、nodes 内の文字列は同等の Text ノード に置換されます。

制約が違反した場合、"HierarchyRequestError" DOMException を投げます。対象はノードツリーです。

node . after(...nodes)

nodesnode の直後に挿入します。その際、nodes 内の文字列は同等の Text ノード に置換されます。

制約が違反した場合、"HierarchyRequestError" DOMException を投げます。対象はノードツリーです。

node . replaceWith(...nodes)

nodenodes で置き換えます。その際、nodes 内の文字列は同等の Text ノード に置換されます。

制約が違反した場合、"HierarchyRequestError" DOMException を投げます。対象はノードツリーです。

node . remove()
node を削除します。

before(nodes) メソッドの手順は次の通りです:

  1. parentthisとする。

  2. もし parent が null なら、何もせず終了する。

  3. viablePreviousSiblingthis先行する兄弟のうち nodes に含まれない最初のものとする。なければ null。

  4. nodeノード集合をノードへ変換する の結果として、nodesthisノード文書を与えて得る。

  5. もし viablePreviousSibling が null なら、それを parent最初の子とし、そうでなければ viablePreviousSibling次の兄弟とする。

  6. pre-insertnodeparentviablePreviousSibling の前へ挿入する。

after(nodes) メソッドの手順は次の通りです:

  1. parentthisとする。

  2. もし parent が null なら、何もせず終了する。

  3. viableNextSiblingthis後続する兄弟のうち nodes に含まれない最初のものとする。なければ null。

  4. nodeノード集合をノードへ変換する の結果として、nodesthisノード文書を与えて得る。

  5. pre-insertnodeparentviableNextSibling の前へ挿入する。

replaceWith(nodes) メソッドの手順は次の通りです:

  1. parentthisとする。

  2. もし parent が null なら、何もせず終了する。

  3. viableNextSiblingthis後続する兄弟のうち nodes に含まれない最初のものとする。なければ null。

  4. nodeノード集合をノードへ変換する の結果として、nodesthisノード文書を与えて得る。

  5. もし thisparent なら、replacethisparent の中で node で置き換える。

    thisnode の中に挿入されている可能性があります。

  6. それ以外の場合は、pre-insertnodeparentviableNextSibling の前へ挿入します。

remove() メソッドの手順は次の通りです:

  1. this が null なら、何もせず終了する。

  2. Removethis を削除する。

4.2.9. ミックスイン Slottable

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

assignedSlot のgetter手順は、find a slotthis と 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ノードを返します。ノードツリー順で並べられます。

このオブジェクトのサポートされるプロパティインデックスは、ノード数の範囲内(ゼロからコレクションで表されるノード数から1を引いた値までの数字)です。該当する要素がない場合、サポートされるプロパティインデックスはありません。

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]
コレクションの中から、nameというIDまたは名前を持つ最初の要素を返す。

オブジェクトのサポートされるプロパティインデックスは、要素の数が0〜(要素数-1)の範囲の数値です。 要素がなければサポートされるプロパティインデックスはありません。

lengthゲッターの手順は、 コレクションで表現されるノード数を返します。

item(index)メソッドの手順は、 コレクション内のindex番目の要素を返します。要素がなければnullを返します。

サポートされるプロパティ名は以下の手順で得られるリストの値です:

  1. resultを空リストとする。

  2. コレクションで表現されるelementについて、ツリー順で:

    1. もしelementresultに含まれていないIDを持つなら、 elementIDresultに追加する。

    2. もしelementHTML名前空間にあり、 name属性を持ち、 そのが空文字列ではなくresultにも含まれていなければ、 elementname属性resultに追加する。

  3. resultを返す。

namedItem(key)メソッドの手順は:

  1. keyが空文字列ならnullを返す。

  2. 以下のいずれかが真となるコレクション内の最初の要素を返す:

    該当する要素がなければnullを返します。

4.3. ミューテーションオブザーバー

同一オリジンウィンドウエージェントは、 mutation observer microtask queued (真偽値)を持ち、初期値はfalseです。[HTML]

同一オリジンウィンドウエージェントはさらに pending mutation observers(0個以上の集合で、MutationObserverオブジェクト)を持ち、初期値は空です。

ミューテーションオブザーバー・マイクロタスクをキューに入れるには、次のようにする:

  1. surrounding agentmutation observer microtask queued が true なら、何もしないで終了する。

  2. surrounding agentmutation observer microtask queued を true に設定する。

  3. microtaskキューイング し、ミューテーションオブザーバーに通知する。

ミューテーションオブザーバーに通知するには、次のようにする:

  1. surrounding agentmutation observer microtask queued を false に設定する。

  2. notifySetクローンした、surrounding agentpending mutation observers にする。

  3. 空にするsurrounding agentpending mutation observers を空にする。

  4. signalSetクローンした、surrounding agentsignal slots にする。

  5. 空にするsurrounding agentsignal slots を空にする。

  6. mo in notifySet について:

    1. recordsクローンした morecord queue にする。

    2. 空にするmorecord queue を空にする。

    3. node in monode list について:noderegistered observer list から transient registered observers のうち、 observermo であるものをすべて削除する。

    4. records空でない場合は、コールバック関数を呼び出すmocallback に « records, mo », "report" を渡し、 callback this valuemo に設定して呼び出す。

  7. slot in signalSet について:イベントを発火させる 名前は slotchangebubbles 属性を true に設定し、slot で発火させる。


ノードは、登録済みオブザーバーリストリスト、ゼロ個以上の登録済みオブザーバーからなる)を持ち、初期状態は空です。

registered observerは、 observerMutationObserverオブジェクト)と optionsMutationObserverInit辞書)で構成されます。

transient registered observerは、 registered observerであり、 さらにsourceregistered observer)を持ちます。

一時的登録済みオブザーバーは、特定のノードが削除された後でも、その子孫内の変化を追跡するために使われます。これは、subtreeノードでtrueに設定されている場合に、変更が失われないようにするためです。

4.3.1. インターフェース MutationObserver

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

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

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

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

MutationObserver オブジェクトは、ツリー内のノードの変化を監視するために利用できます。

MutationObserver オブジェクトには、以下の概念が関連付けられています:

observer = new MutationObserver(callback)
MutationObserver オブジェクトを生成し、そのコールバックcallback を設定します。callback は第一引数にMutationRecordオブジェクトのリスト、第二引数に生成済みMutationObserverオブジェクトが渡され、それぞれ登録済みobserve()メソッドで監視されていたノードが変化すると呼び出されます。
observer . observe(target, options)
ユーザーエージェントに、指定した targetノード)の変更をoptions(オブジェクト)で指定された条件に従い監視するよう指示します。

options 引数では、オブジェクトメンバーで監視内容を指定します。利用可能なメンバーは次の通りです:

childList
targetへの変更を監視する場合はtrueにします。
attributes
target属性への変更を監視する場合はtrueにします。attributeOldValueまたはattributeFilterが指定されている場合は省略可能です。
characterData
targetデータへの変更を監視する場合はtrueにします。characterDataOldValueが指定されている場合は省略可能です。
subtree
targetだけでなくtarget子孫への変更まで監視する場合はtrueにします。
attributeOldValue
attributesがtrueまたは省略時で、target属性(変更前)も記録する場合はtrueにします。
characterDataOldValue
characterDataがtrueまたは省略時で、targetデータ(変更前)も記録する場合はtrueにします。
attributeFilter
attributesがtrueまたは省略時で、すべての属性を監視しない場合は、監視したい属性ローカル名名前空間なし)のリストを指定します。
observer . disconnect()
observerによる監視を全て停止します。observe()メソッドが再度呼ばれるまで、observerコールバックは呼び出されません。
observer . takeRecords()
レコードキューを空にし、そこにあった内容を返します。

new MutationObserver(callback) コンストラクターの手順は、thiscallbackcallbackに設定すること。

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. targetregistered observer listregisteredについて、registeredobserverthisであれば:

    1. thisnode listnodeについて、noderegistered observer listから transient registered observersのうち sourceregisteredであるものをすべて削除する。

    2. registeredoptionsoptionsに設定する。

  8. それ以外の場合:

    1. 新しいregistered observerobserverthisoptionsoptions であるものをtargetregistered observer listに追加する。

    2. targetへの弱い参照をthisnode listに追加する。

disconnect() メソッドの手順は以下のとおり:

  1. thisnode listnodeについて:noderegistered observer のうち、 thisobserverであるものをすべて取り除く。

  2. thisrecord queue を空にする。

takeRecords() メソッドの手順は以下のとおり:

  1. recordsthisrecord queue のクローンに設定する。

  2. thisrecord queue を空にする。

  3. recordsを返す。

4.3.2. ミューテーションレコードのキューイング

ミューテーションレコードをキューに入れるには、typetargetnamenamespaceoldValueaddedNodesremovedNodespreviousSiblingnextSiblingを使って次を行う:

  1. interestedObservers を空の マップにする。

  2. nodestarget の包括的な祖先にする。

  3. nodesnode について、さらに noderegistered observer listregistered について:

    1. optionsregisteredoptionsにする。

    2. 次のいずれも真でない場合:

      ならば:

      1. moregisteredobserver にする。

      2. もし interestedObservers[mo] が 存在しなければinterestedObservers[mo] に null を設定する。

      3. type が "attributes" かつ options["attributeOldValue"] が true、または type が "characterData" かつ options["characterDataOldValue"] が true であれば、 interestedObservers[mo] に oldValue を設定する。

  4. interestedObservers の各 observermappedOldValue について:

    1. record を新しい MutationRecord オブジェクトにし、その typetypetargettargetattributeNamenameattributeNamespacenamespaceoldValuemappedOldValueaddedNodesaddedNodesremovedNodesremovedNodespreviousSiblingpreviousSiblingnextSiblingnextSibling を設定する。

    2. recordobserverrecord queue にキューする。

    3. observersurrounding agentpending mutation observers に追加する。

  5. ミューテーションオブザーバー・マイクロタスクをキューに入れる

ツリーミューテーションレコードをキューに入れるには、targetaddedNodesremovedNodespreviousSiblingnextSibling を使って次を行う:

  1. アサートaddedNodes または removedNodesのいずれかが 空でないこと。

  2. ミューテーションレコードをキューに入れるとき、"childList"・target・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 は、すべての ノード が利用する抽象インターフェイスです。直接インスタンス化することはできません。

ノードは、作成時に設定される ノード文書 を持ちます。これは文書です。

ノードノード文書は、adoptアルゴリズムによって変更されることがあります。

ノード親を取得するアルゴリズムは、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
target
Comment
"#comment"。
Document
"#document"。
DocumentType
name
DocumentFragment
"#document-fragment"。

nodeTypeゲッターの手順は、インターフェースthisimplementsする型によって最初に一致するものを返します:

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ゲッターの手順は、インターフェースthisimplementsする型によって最初に一致するものを返します:

Element
そのHTML大文字化修飾名
Attr
その修飾名
単独のTextノード
"#text"。
CDATASection
"#cdata-section"。
ProcessingInstruction
そのtarget
Comment
"#comment"。
Document
"#document"。
DocumentType
そのname
DocumentFragment
"#document-fragment"。

node . baseURI
nodeノード文書ドキュメントの基底URLを返す。

baseURIゲッターの手順は、 thisノード文書ドキュメントの基底URL直列化して返します。


node . isConnected

node接続済みならtrue、そうでなければfalseを返します。

node . ownerDocument
ノード文書を返します。 ドキュメントの場合はnullを返します。
node . getRootNode()
nodeルートを返します。
node . getRootNode({ composed:true })
nodeシャドウ含むルートを返します。
node . parentNode
を返します。
node . parentElement
親要素を返します。
node . hasChildNodes()
nodeを持つかどうか返します。
node . childNodes
を返します。
node . firstChild
最初の子を返します。
node . lastChild
最後の子を返します。
node . previousSibling
前の兄弟を返します。
node . nextSibling
次の兄弟を返します。

isConnected のgetterの手順は、thisconnected であれば true を返し、そうでなければ false を返すことです。

ownerDocument のgetterの手順は、thisdocument であれば null を返し、そうでなければ thisノード文書 を返すことです。

documentノード文書 は、その document 自身です。すべての ノードは、常に ノード文書 を持ちます。

getRootNode(options)メソッドの手順は、 options["composed"]がtrueなら thisシャドウ含むルートを返し、そうでなければ thisルートを返します。

parentNodeゲッターの手順は、 thisを返します。

parentElementゲッターの手順は、 this親要素を返します。

hasChildNodes()メソッドの手順は、 thisを持つならtrue、そうでなければfalseを返します。

childNodesゲッターの手順は、 thisをルートとし、のみに一致する NodeListを返します。

firstChildゲッターの手順は、 this最初の子を返します。

lastChildゲッターの手順は、 this最後の子を返します。

previousSiblingゲッターの手順は、 this前の兄弟を返します。

nextSiblingゲッターの手順は、 this次の兄弟を返します。


nodeValueゲッターの手順は、 インターフェースthisimplementsする型によって次のように返します:

Attr
this
CharacterData
thisデータ
その他
Null。

nodeValueセッターの手順は、 渡された値がnullの場合は空文字列として扱い、その後以下の通りに実行します。インターフェースthis implementsによって切り替えます:

Attr

既存属性値の設定thisと渡された値で行う。

CharacterData

this のデータを、0、this長さ、および与えられた値で置き換えます。

その他

何もしない。

テキストコンテンツ取得は、 ノードnodeについて、インターフェースnodeimplementsする型によって次のように返します:

DocumentFragment
Element
node子孫テキストコンテンツ
Attr
node
CharacterData
nodeデータ
その他
Null。

この textContent の getter 手順は、get text contentthis に対して実行した結果を返すことです。

文字列 string を使って node parent 内で string replace all を行うには、次の手順を実行します:

  1. node を null にします。

  2. もし string が空文字列でないなら、node を新しい Text node に設定します。このノードの datastring であり、node documentparentnode document です。

  3. Replace allparent 内で node を用いて行います。

set text contentnode node と文字列 value で実行するには、以下の定義に従い、インターフェイス node がどの implements しているかによって処理を切り替えます:

DocumentFragment
Element

String replace allnode 内で value を用いて行います。

Attr

既存の属性値を設定するnodevalue で実行します。

CharacterData

node のデータを、0、node長さ、そして value置き換える

それ以外

何もしません。

この textContent セッターの手順は、与えられた値が null の場合は空文字列として扱い、その後 set text contentthis と与えられた値で実行することです。


node . normalize()
専有 Text ノードを削除し、残りの 連続した専有 Text ノードデータ を、それらの最初の ノードに連結します。

normalize() メソッドの手順は、子孫専有 Text ノード node に対して以下の手順を実行します(this のノードについて):

  1. lengthnode長さ とする。

  2. もし length が0なら、node を削除し、次の 専有 Text ノード(あれば)に進む。

  3. datanode連続した(自身を除く)専有 Text ノードデータツリー順 で連結したものとする。

  4. node のデータを length, 0, そして data で置き換える。

  5. currentNodenode次の兄弟 とする。

  6. currentNode専有 Text ノードである間、次を繰り返す:

    1. currentNode が開始ノードである live range それぞれに対し:start offsetlength を加え、start nodenode とする。

    2. currentNode が終了ノードである live range それぞれに対し:end offsetlength を加え、end nodenode とする。

    3. currentNode の親ノードで start offsetcurrentNodeindexlive range それぞれに対し、 start nodenodestart offsetlength に設定する。

    4. currentNode の親ノードで end offsetcurrentNodeindexlive range それぞれに対し、 end nodenodeend offsetlength に設定する。

    5. lengthcurrentNode長さ を加える。

    6. currentNode をその 次の兄弟 に更新する。

  7. node の、(自身を除く)連続した専有 Text ノードツリー順 で削除する。


node . cloneNode([subtree = false])
node のコピーを返します。subtree が true の場合、コピーには node子孫も含まれます。
node . isEqualNode(otherNode)
nodeotherNode が同じプロパティを持つかどうかを返します。
仕様 は、全てまたは一部の ノードに対して クローン手順 を定義することができます。このアルゴリズムでは nodecopysubtreeノードをクローンするアルゴリズムに従って渡されます。

HTML では クローン手順 を複数の要素(例: inputscripttemplate)に定義しています。SVG も script 要素に対して同様の定義をすべきですが、現時点では定義されていません。

ノードを複製するには、node node、オプションとしてdocument document(初期値は nodeノード文書)、boolean型 subtree(初期値は false)、nodeまたはnull parent(初期値は null)、nullまたはCustomElementRegistryオブジェクト fallbackRegistry(初期値は null)で行う:

  1. 検証: nodedocumentでない、またはnodedocumentであること。

  2. copy を、単一ノードを複製するnode, document, fallbackRegistry で実行した結果とする。

  3. 他の適用可能仕様nodeに定義された複製手順を実行し、node, copy, subtreeを引数として渡す。

  4. parent が null でなければ、appendcopyparent に追加する。

  5. subtree が true の場合、nodeそれぞれについて、ツリー順で ノードを複製するchilddocument=documentsubtree=subtreeparent=copyfallbackRegistry=fallbackRegistryで実行)を行う。

  6. node要素かつシャドウホストであり、nodeシャドウルート複製可能がtrueなら:

    1. Assert: copyshadow host ではありません。

    2. shadowRootRegistrynodeshadow rootcustom element registry にします。

    3. shadowRootRegistryglobal custom element registry の場合、 shadowRootRegistrydocumenteffective global custom element registry に設定します。

    4. shadow root を付加します。 copynodeshadow rootmode、true、 nodeshadow rootserializablenodeshadow rootdelegates focusnodeshadow rootslot assignmentshadowRootRegistry を使用します。

    5. copyshadow rootdeclarativenodeshadow rootdeclarative に設定します。

    6. copyshadow rootkeep custom element registry nullnodeshadow rootkeep custom element registry null に設定します。

    7. nodeshadow rootchildren のそれぞれの child について、tree order で:ノードをクローンします。childdocumentdocumentsubtreesubtree に、さらに parentcopyshadow root に設定します。

      これは意図的に fallbackRegistry 引数を渡しません。

  7. copy を返す。

単一ノードを複製するには、node nodedocument document、nullまたはCustomElementRegistry オブジェクト fallbackRegistry で行う:

  1. copy を null とする。

  2. node要素なら:

    1. registrynodecustom element registryとする。

    2. registry が null なら registry = fallbackRegistry とする。

    3. registryグローバルcustom element registryなら、 registry = documenteffective global custom element registryとする。

    4. copy要素を生成するdocumentnodeローカル名node名前空間node名前空間プレフィックスnodeis、false、registry)の結果とする。

    5. attributenode属性リスト)について:

      1. copyAttribute単一ノードを複製するattributedocument、null)で取得する。

      2. appendcopyAttributecopy に追加する。

  3. それ以外の場合、copyノードnodeが実装するインターフェイスと等しいもの)で、以下追加要件を満たすものとする。node実装するインターフェイスにより分岐:

    Document
    1. copyエンコーディングcontent typeURLorigintypemodeallow declarative shadow rootsnodeの値に設定する。

    2. もしnodecustom element registryis scopedがtrueなら、copycustom element registrynodecustom element registryに設定する。

    DocumentType

    copynamepublic IDsystem IDnodeの値に設定する。

    Attr

    copy名前空間名前空間プレフィックスローカル名nodeの値に設定する。

    Text
    Comment

    copyデータnodeのデータに設定する。

    ProcessingInstruction

    copytargetデータnodeの値に設定する。

    それ以外

    何もしない。

  4. 検証: copyノードである。

  5. nodedocumentなら、document = copyとする。

  6. copyノード文書documentに設定する。

  7. copyを返す。

cloneNode(subtree) メソッドの手順は次の通りです:

  1. thisシャドウルートなら、"NotSupportedError" DOMException を投げる。

  2. ノードを複製するthissubtree=subtree)の結果を返す。

ノード Aは、以下すべてが true の場合 等しいと判定されます:

isEqualNode(otherNode) メソッドの手順は、otherNodeがnullでなく、かつthis等しい場合はtrue、そうでなければfalseを返すこと。

isSameNode(otherNode) メソッドの手順は、otherNodethis そのものであれば true、そうでなければ false を返します。


node . compareDocumentPosition(other)
othernodeに対してどの位置にあるかを示すビットマスクを返します。設定されうるビットは以下の通りです:
Node . DOCUMENT_POSITION_DISCONNECTED (1)
nodeotherが同じツリーに属していない場合に設定されます。
Node . DOCUMENT_POSITION_PRECEDING (2)
othernodeより先行している場合に設定されます。
Node . DOCUMENT_POSITION_FOLLOWING (4)
othernodeより後続している場合に設定されます。
Node . DOCUMENT_POSITION_CONTAINS (8)
othernode祖先である場合に設定されます。
Node . DOCUMENT_POSITION_CONTAINED_BY (16, 10進数で16、16進数で10)
othernode子孫である場合に設定されます。
node . contains(other)
othernode包括的子孫であればtrue、それ以外(nullを含む)はfalseを返します。

これらはcompareDocumentPosition() がマスクとして返す定数です:

compareDocumentPosition(other) メソッドの手順は以下の通りです:

  1. もし thisother であれば、ゼロを返します。

  2. node1other に、node2this にします。

  3. attr1attr2 を null にします。

  4. もし node1attribute であれば、attr1node1 に設定し、node1attr1element にします。

  5. もし node2attribute の場合:

    1. attr2node2 に設定し、node2attr2element にします。

    2. もし attr1node1 が非 null で、かつ node2node1 であれば:

      1. For each attrnode2attribute list の各要素について行います:

        1. もし attrequals attr1 であれば、次を返します: DOCUMENT_POSITION_IMPLEMENTATION_SPECIFICDOCUMENT_POSITION_PRECEDING を加えた結果。

        2. もし attrequals attr2 であれば、次を返します: DOCUMENT_POSITION_IMPLEMENTATION_SPECIFICDOCUMENT_POSITION_FOLLOWING を加えた結果。

  6. もし node1 または node2 が null であるか、あるいは node1rootnode2root と異なる場合、次を返します:DOCUMENT_POSITION_DISCONNECTEDDOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC、 および いずれかの DOCUMENT_POSITION_PRECEDING または DOCUMENT_POSITION_FOLLOWING を加えた結果を、一貫性を保つように返します。

    どちらを返すか(DOCUMENT_POSITION_PRECEDINGDOCUMENT_POSITION_FOLLOWING)は、通常ポインタ比較によって実装されます。JavaScript 実装ではキャッシュされた Math.random() 値を使用することができます。

  7. もし node1ancestor であり node2 の先祖で、かつ attr1 が null である、または node1node2attr2 が非 null である場合、次を返します: DOCUMENT_POSITION_CONTAINSDOCUMENT_POSITION_PRECEDING を加えた結果。

  8. もし node1descendant であり node2 の子孫で、かつ attr2 が null である、または node1node2attr1 が非 null である場合、次を返します: DOCUMENT_POSITION_CONTAINED_BYDOCUMENT_POSITION_FOLLOWING を加えた結果。

  9. もし node1preceding node2 であれば、次を返します: DOCUMENT_POSITION_PRECEDING

    このアルゴリズムで属性が扱われる方法のため、ノード属性は、そのノードより前にあるものとしてカウントされますが、属性自体は同じツリーには属していません

  10. 次に DOCUMENT_POSITION_FOLLOWING を返します。

contains(other)メソッドの手順は、 other包括的子孫であればtrue、それ以外(null含む)はfalseを返すことです。


名前空間プレフィックスを特定するelementに対してnamespaceで行うには、以下の手順を実行します:

  1. element名前空間namespaceであり、 名前空間プレフィックスがnullでなければ、 その名前空間プレフィックスを返す。

  2. もし element属性 を持ち、その 名前空間接頭辞 が "xmlns" であり、 namespace の場合、 element のそのような最初の 属性ローカル名 を返す。

  3. element親要素がnullでなければ、 その要素に対して 名前空間プレフィックスを特定するnamespaceで実行した結果を返す。

  4. nullを返す。

名前空間を特定するは、 nodeに対しprefixを使い、interface nodeimplementsする型によって分岐します:

Element
  1. prefixが"xml"なら、XML名前空間を返す。

  2. prefixが"xmlns"なら、XMLNS名前空間を返す。

  3. 自身の名前空間がnullでなく、 名前空間プレフィックスprefixなら 名前空間を返す。

  4. もしそれが、属性持ち、その名前空間XMLNS 名前空間名前空間接頭辞が"xmlns"、ローカル名prefix、またはprefixが null でそれが属性持ち、その名前空間XMLNS 名前空間名前空間接頭辞が null、ローカル名が"xmlns"の場合、そのが空文字列でなければそれを返し、そうでなければ null を返す。

  5. 親要素がnullならnullを返す。

  6. 親要素に対してprefix名前空間を特定するを実行した結果を返す。

Document
  1. 自身の文書要素がnullならnullを返す。

  2. 自身の文書要素に対して prefix名前空間を特定するを実行した結果を返す。

DocumentType
DocumentFragment

nullを返す。

Attr
  1. 自身の要素がnullならnullを返す。

  2. 自身の要素に対してprefix名前空間を特定するを実行した結果を返す。

その他
  1. 自身の親要素がnullならnullを返す。

  2. 自身の親要素に対してprefix名前空間を特定するを実行した結果を返す。

lookupPrefix(namespace)メソッドの手順は:

  1. namespaceがnullまたは空文字ならnullを返す。

  2. interface thisimplementsする型によって分岐する:

    Element

    名前空間プレフィックスを特定するthisnamespaceで実行した結果を返す。

    Document
    1. this文書要素がnullならnullを返す。

    2. 名前空間プレフィックスを特定するthis文書要素namespaceで実行した結果を返す。

    DocumentType
    DocumentFragment

    nullを返す。

    Attr
    1. this要素がnullならnullを返す。

    2. 名前空間プレフィックスを特定するthis要素namespaceで実行した結果を返す。

    その他
    1. this親要素がnullならnullを返す。

    2. 名前空間プレフィックスを特定するthis親要素namespaceで実行した結果を返す。

lookupNamespaceURI(prefix)メソッドの手順は:

  1. prefixが空文字ならnullに設定する。

  2. 名前空間を特定するthisprefixで実行した結果を返す。

isDefaultNamespace(namespace)メソッドの手順は:

  1. namespaceが空文字ならnullに設定する。

  2. defaultNamespace名前空間を特定するthisにnullで実行した結果とする。

  3. defaultNamespacenamespaceと同じならtrue、そうでなければfalseを返す。


insertBefore(node, child) メソッドの手順は、node事前挿入としてthischildの前に挿入した結果を返すことです。

appendChild(node)メソッドの手順は、 node追加としてthisに追加した結果を返すことです。

replaceChild(node, child) メソッドの手順は、置換としてchildnodethis内で置換した結果を返すことです。

removeChild(child)メソッドの手順は、 child事前削除としてthisから削除した結果を返すことです。


qualifiedNameがqualifiedNameの要素リストrootノード)に対して取得するアルゴリズムは以下です:

  1. qualifiedNameがU+002A(*)なら、rootをルートとし、フィルタが子孫要素のみに一致するHTMLCollectionを返す。

  2. そうでなく、rootノード文書HTMLドキュメントなら、 rootをルートとし、フィルタが以下の子孫要素に一致するHTMLCollectionを返す:

  3. そうでなければ、rootをルートとし、フィルタが子孫要素で、 修飾名qualifiedNameのものに一致する HTMLCollectionを返す。

同じ引数で呼び出した場合、かつrootノード文書が変更されていなければ、同じHTMLCollectionオブジェクトが返されることがあります。

namespaceがnamespace、localNameがlocalNameの要素リストrootノード)に対して取得するアルゴリズムは以下です:

  1. namespaceが空文字ならnullに設定する。

  2. namespacelocalNameが両方U+002A(*)なら、 rootをルートとし、フィルタが子孫要素に一致するHTMLCollectionを返す。

  3. namespaceがU+002A(*)なら、 rootをルートとし、フィルタが子孫要素でローカル名がlocalNameのものに一致するHTMLCollectionを返す。

  4. localNameがU+002A(*)なら、 rootをルートとし、フィルタが子孫要素で名前空間がnamespaceのものに一致するHTMLCollectionを返す。

  5. rootをルートとし、フィルタが子孫要素で名前空間がnamespace・ローカル名がlocalNameのものに一致するHTMLCollectionを返す。

同じ引数で呼び出した場合、同じHTMLCollectionオブジェクトが返されることがあります。

classNamesがclassNamesの要素リストrootノード)に対して取得するアルゴリズムは以下です:

  1. classesclassNamesに対して順序付き集合パーサーを実行した結果とする。
  2. classesが空集合なら、空のHTMLCollectionを返す。
  3. rootをルートとし、フィルタが子孫要素のうち、そのすべてのクラスclassesに含まれているものに一致するHTMLCollectionを返す。

    そのクラスの比較は、rootノード文書モードが"quirks"ならASCII大文字小文字無視、それ以外は完全一致で行うこと。

同じ引数で呼び出した場合、同じHTMLCollectionオブジェクトが返されることがあります。

4.5. インターフェース Document

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

  [SameObject] readonly attribute DOMImplementation implementation;
  readonly attribute USVString URL;
  readonly attribute USVString documentURI;
  readonly attribute DOMString compatMode;
  readonly attribute DOMString characterSet;
  readonly attribute DOMString charset; // legacy alias of .characterSet
  readonly attribute DOMString inputEncoding; // legacy alias of .characterSet
  readonly attribute DOMString contentType;

  readonly attribute DocumentType? doctype;
  readonly attribute Element? documentElement;
  HTMLCollection getElementsByTagName(DOMString qualifiedName);
  HTMLCollection getElementsByTagNameNS(DOMString? namespace, DOMString localName);
  HTMLCollection getElementsByClassName(DOMString classNames);

  [CEReactions, NewObject] Element createElement(DOMString localName, optional (DOMString or ElementCreationOptions) options = {});
  [CEReactions, NewObject] Element createElementNS(DOMString? namespace, DOMString qualifiedName, optional (DOMString or ElementCreationOptions) options = {});
  [NewObject] DocumentFragment createDocumentFragment();
  [NewObject] Text createTextNode(DOMString data);
  [NewObject] CDATASection createCDATASection(DOMString data);
  [NewObject] Comment createComment(DOMString data);
  [NewObject] ProcessingInstruction createProcessingInstruction(DOMString target, DOMString data);

  [CEReactions, NewObject] Node importNode(Node node, optional (boolean or ImportNodeOptions) options = false);
  [CEReactions] Node adoptNode(Node node);

  [NewObject] Attr createAttribute(DOMString localName);
  [NewObject] Attr createAttributeNS(DOMString? namespace, DOMString qualifiedName);

  [NewObject] Event createEvent(DOMString interface); // legacy

  [NewObject] Range createRange();

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

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

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

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

Document ノードは、単に 文書として知られています。

文書ノード文書は、その文書自身です。

文書は、次の関連する値を持ちます:エンコーディングエンコーディング)、コンテントタイプ(文字列)、URLURL)、オリジンオリジン)、("xml"または"html")、モード("no-quirks"、"quirks"、または"limited-quirks")、宣言的シャドウルートを許可(boolean)、custom element registry(null あるいはCustomElementRegistryオブジェクト)。 [ENCODING] [URL] [HTML]

特に記載がなければ、文書エンコーディングutf-8 エンコーディングコンテントタイプは "application/xml"、URLは "about:blank"、オリジン不透明なオリジンは"xml"、モードは"no-quirks"、宣言的シャドウルートを許可はfalse、custom element registryはnullです。

文書は、そのが"xml"であればXML文書と言い、そうでなければHTML文書です。文書HTML文書XML文書 かによって、特定のAPIの挙動が変わります。

文書は、no-quirksモードモードが"no-quirks")、quirksモードモードが"quirks")、limited-quirksモードモードが"limited-quirks")にあると言います。

モードは、文書HTMLパーサにより、DOCTYPE文字列の有無や値に基づいて作成された場合、初期"about:blank"の新しいブラウジングコンテキストによってのみ、デフォルトから変更されます。[HTML]

no-quirksモードは元々「standards mode」と呼ばれていました。また、limited-quirksモードはかつて「almost standards mode」と呼ばれていました。これらの名称は標準で詳細が定義されたため改名されました。(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()コンストラクターの手順は、thisオリジンを、オリジンcurrent global object関連するDocumentのもの)に設定することです。[HTML]

createDocument()と異なり、このコンストラクターはXMLDocumentオブジェクトではなく、文書Documentオブジェクト)を返します。

implementationのgetter手順は、thisに関連付けられたDOMImplementationオブジェクトを返します。

URLおよびdocumentURIのgetter手順は、thisURLシリアライズ済み)を返します。

compatModeのgetter手順は、thisモードが"quirks"なら"BackCompat"、そうでなければ"CSS1Compat"を返します。

characterSetcharsetinputEncodingのgetter手順は、thisエンコーディング名前を返します。

contentTypeのgetter手順は、thisコンテントタイプを返します。


document . doctype
ドキュメント型宣言を返します。存在しない場合は null を返します。
document . documentElement
ドキュメント要素を返します。
collection = document . getElementsByTagName(qualifiedName)

qualifiedName が "*" の場合、全ての子孫 要素を含む HTMLCollection を返します。

そうでない場合、qualifiedName が一致する子孫要素全てを含む HTMLCollection を返します。(HTML要素との比較は HTML名前空間 および HTML文書を対象として、大文字小文字を区別しません。)

collection = document . getElementsByTagNameNS(namespace, localName)

namespacelocalName の両方が "*" の場合、全ての子孫 要素を含む HTMLCollection を返します。

namespaceのみが"*" の場合、localName が一致する全ての子孫 ローカル名を持つ 要素を含む HTMLCollection を返します。

localNameのみが"*" の場合、namespace が一致する全ての子孫 名前空間を持つ 要素を含む HTMLCollection を返します。

それ以外の場合、namespacelocalName両方が一致する全ての子孫 要素を含む HTMLCollection を返します。

collection = document . getElementsByClassName(classNames)
collection = element . getElementsByClassName(classNames)

そのオブジェクト(文書または要素)内でclassNamesで指定されたすべてのクラスを持つ要素HTMLCollectionを返します。classNames引数は空白区切りのクラスのリストとして解釈されます。

doctypeゲッターの手順は、thisのうちdoctypeであるものを返し、なければnullを返すことです。

documentElementゲッターの手順は、this文書要素を返すことです。

getElementsByTagName(qualifiedName) メソッドの手順は、修飾名がqualifiedNameの要素リストthisで取得して返すことです。

したがって、HTMLドキュメントでは、 document.getElementsByTagName("FOO")HTML名前空間ではない<FOO>要素と、 HTML名前空間<foo>要素には一致しますが、 HTML名前空間<FOO>要素には一致しません。

getElementsByTagNameNS(namespace, localName) メソッドの手順は、namespaceがnamespaceかつlocalNameがlocalNameの要素リストthisで取得して返すことです。

getElementsByClassName(classNames) メソッドの手順は、classNamesがclassNamesの要素リストthisで取得して返すことです。

次のXHTML断片が与えられたとします:
<div id="example">
  <p id="p1" class="aaa bbb"/>
  <p id="p2" class="aaa ccc"/>
  <p id="p3" class="bbb ccc"/>
</div>

document.getElementById("example").getElementsByClassName("aaa") の呼び出しは、HTMLCollection を返し、その中には2つの段落 p1p2 が含まれる。

getElementsByClassName("ccc bbb") の呼び出しは、ただ1つのノード、つまり p3 のみを返す。一方、 document.getElementById("example").getElementsByClassName("bbb  ccc ") の呼び出しでも同じ結果が返る。

getElementsByClassName("aaa,bbb") の呼び出しは、ノードを何も返さない。上記の要素のいずれも aaa,bbb クラスには属していないためである。


element = document . createElement(localName [, options])

localNameローカル名として持つ要素を返します(documentHTML文書の時は localName は小文字化されます)。その名前空間は、documentHTML文書、または documentコンテントタイプが "application/xhtml+xml" の場合は HTML名前空間、それ以外は null です。

optionscustomElementRegistry を指定すれば、CustomElementRegistry を設定可能です。

optionsis を指定すれば、カスタマイズ組込み要素を作成できます。

localName有効な要素ローカル名でない場合、"InvalidCharacterError" DOMException が投げられます。

optionscustomElementRegistryis の両方が指定された場合、"NotSupportedError" DOMException が投げられます。

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

名前空間namespace要素を返します。名前空間プレフィックスqualifiedName の U+003A (:) の前部分か null。ローカル名は U+003A (:) の後部分か qualifiedNameです。

optionscustomElementRegistry を指定すれば、CustomElementRegistry を設定可能です。

optionsis を指定すれば、カスタマイズ組込み要素を作成できます。

qualifiedName が(プレフィックス付きでも)有効な要素ローカル名でない場合、"InvalidCharacterError" DOMException が投げられます。

以下のいずれかが真なら"NamespaceError" DOMException が投げられます:

optionscustomElementRegistryis の両方が指定された場合、"NotSupportedError" DOMException が投げられます。

documentFragment = document . createDocumentFragment()
DocumentFragment型のノードを返します。
text = document . createTextNode(data)
Text型のノードで、datadataのものを返します。
text = document . createCDATASection(data)
CDATASection型のノードで、datadataのものを返します。
comment = document . createComment(data)
Comment型のノードで、datadataのものを返します。
processingInstruction = document . createProcessingInstruction(target, data)
ProcessingInstruction型のノードで、targettargetdatadataのものを返します。targetName生成規則と一致しない場合、"InvalidCharacterError" DOMExceptionが投げられます。dataに"?>"を含む場合も同様です。

要素インターフェースは、namenamespaceに対して特に指定がない限り Element です。

HTML標準では、例えばhtmlHTML名前空間の場合は HTMLHtmlElement インターフェースが使用されることが定義されています。[HTML]

createElement(localName, options) メソッドの手順は以下の通りです:

  1. localName有効な要素ローカル名でない場合は InvalidCharacterErrorInvalidCharacterErrorDOMException)を投げる。

  2. thisHTMLドキュメントの場合、localNameをASCII小文字化する。

  3. registryisoptionsthis要素生成オプションを平坦化するで取得する。

  4. namespaceを、HTML名前空間とし、 thisHTMLドキュメントまたは thisコンテントタイプが"application/xhtml+xml"の場合はHTML名前空間、それ以外はnull。

  5. 要素生成thislocalNamenamespace、null、is、true、registryで実行した結果を返す。

内部 createElementNS 手順は、documentnamespacequalifiedNameoptionsを受け取って以下の手順を実行します:

  1. namespace, prefix, localName)を、"element"を与えてnamespacequalifiedName検証・抽出した結果とする。

  2. registryisを、optionsthis要素生成オプションの平坦化を行った結果とする。

  3. 要素生成documentlocalNamenamespaceprefixis、true、registryで実行した結果を返す。

createElementNS(namespace, qualifiedName, options) メソッドの手順は、内部 createElementNS 手順thisnamespacequalifiedNameoptionsで実行した結果を返すことです。

要素生成オプションの平坦化は、文字列または ElementCreationOptions 辞書optionsdocument documentを受け取って以下の手順を実行します:

  1. registry を、document を与えて カスタム要素レジストリを検索する の結果とする。

  2. is を null にする。

  3. もし options が辞書である場合:

    1. もし options["is"] 存在する 場合、is にその値を設定する。

    2. もし options["customElementRegistry"] 存在する 場合:

      1. もし is が null でなければ、throw a "NotSupportedError" DOMException を投げる。

      2. registryoptions["customElementRegistry"] に設定する。

    3. もし registry が null でなく、registryis scoped が false であり、かつ registrydocumentcustom element registry でない場合、throw a "NotSupportedError" DOMException を投げる。

  4. registryis を返す。

createElement() および createElementNS()options パラメータは、Web互換性のため文字列も許容されます。

createDocumentFragment() メソッドの手順は、DocumentFragment型の新しいノードを返すことです。そのノード文書thisです。

createTextNode(data) メソッドの手順は、Text型の新しいノードを返すことです。そのdatadataノード文書thisです。

createCDATASection(data) メソッドの手順:

  1. thisHTML文書なら、"NotSupportedError" DOMExceptionを投げる。

  2. dataに文字列"]]>"が含まれる場合、"InvalidCharacterError" DOMExceptionを投げる。

  3. 新しいCDATASection型のノードを返す。datadataノード文書this

createComment(data) メソッドの手順は、新しいComment型のノードを返すことです。datadataノード文書thisです。

createProcessingInstruction(target, data) メソッドの手順:

  1. targetName生成規則と一致しない場合、"InvalidCharacterError" DOMExceptionを投げる。
  2. dataに"?>"が含まれる場合、"InvalidCharacterError" DOMExceptionを投げる。
  3. ProcessingInstruction型の新しいノードを返す。targettargetdatadataノード文書this

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

nodeのコピーを返します。optionsがtrue、またはoptionsselfOnlyがfalseのとき、コピーにはnode子孫も含まれます。

optionscustomElementRegistryで、CustomElementRegistryのない要素に設定できます。

node文書シャドウルートの場合、"NotSupportedError" DOMExceptionが投げられます。

node = document . adoptNode(node)

nodeを他の文書から移動して返します。

node文書の場合、"NotSupportedError" DOMExceptionが投げられます。nodeシャドウルートの場合、"HierarchyRequestError" DOMExceptionが投げられます。

importNode(node, options) メソッドの手順:

  1. node文書またはシャドウルートの場合、"NotSupportedError" DOMExceptionを投げる。

  2. subtree をfalseとする。

  3. registry をnullとする。

  4. optionsがbooleanなら、subtreeoptionsとする。

  5. それ以外:

    1. subtreeoptions["selfOnly"]の否定で設定。

    2. options["customElementRegistry"]が存在するなら、registryにそれを設定。

    3. registryis scopedがfalse、かつregistrythiscustom element registryと異なる場合、"NotSupportedError" DOMExceptionを投げる。

  6. registryがnullなら、custom element registryを検索した結果をregistryに代入。

  7. ノードを複製するnodedocument=thissubtree=subtreefallbackRegistry=registry)の結果を返す。

各仕様は、一部または全てのノードに対してadopt手順を定義する場合があります。このアルゴリズムは、nodeoldDocumentadoptアルゴリズムに従い)を受け取ります。

adoptは、ノード node文書 documentに入れる:

  1. oldDocumentnodeノード文書とする。

  2. nodeがnullでなければ、removenodeを削除。

  3. documentoldDocumentでないなら:

    1. node影を含む包含子孫それぞれについて、影込みツリー順で:

      1. inclusiveDescendantノード文書documentに変更。

      2. inclusiveDescendantシャドウルートで以下のいずれかがtrueの場合:

        ならinclusiveDescendantcustom element registrydocumenteffective global custom element registryに設定。

      3. それ以外の場合、inclusiveDescendant要素の場合:

        1. inclusiveDescendant属性リスト内の各属性ノード文書documentに変更。

        2. inclusiveDescendantcustom element registryがnull、またはcustom element registryis scopedがfalseの場合、inclusiveDescendantcustom element registrydocumenteffective global custom element registryに設定。

    2. node影を含む包含子孫customなものそれぞれについて、影込みツリー順でcustom element callback reactioninclusiveDescendant、callback名 "adoptedCallback"、«oldDocument, document»でenqueue。

    3. node影を含む包含子孫それぞれについて、影込みツリー順でadopt手順inclusiveDescendant, oldDocumentで実行。

adoptNode(node) メソッドの手順:

  1. node文書なら、"NotSupportedError" DOMExceptionを投げる。

  2. nodeシャドウルートなら、"HierarchyRequestError" DOMExceptionを投げる。

  3. nodeDocumentFragment型のノードで、hostがnullでなければ、return。

  4. adoptnodethisに入れる。

  5. nodeを返す。


nullまたはCustomElementRegistry型オブジェクトregistryは、registryがnullでなく、かつregistryis scopedがfalseならグローバルcustom element registryである

文書documenteffective global custom element registryは:

  1. documentcustom element registryグローバルcustom element registryなら、それを返す。

  2. nullを返す。


createAttribute(localName) メソッドの手順:

  1. localName有効な属性ローカル名でなければ、"InvalidCharacterError" DOMExceptionを投げる。

  2. thisHTML文書なら、localNameASCII小文字に変換。
  3. 新しい属性を返す。ローカル名localNameノード文書this

createAttributeNS(namespace, qualifiedName) メソッドの手順:

  1. (namespace, prefix, localName) を validate and extractnamespace, qualifiedName, "attribute")した結果とする。

  2. 新しい属性を返す。名前空間namespace名前空間プレフィックスprefixローカル名localNameノード文書this


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なら、"NotSupportedError" DOMExceptionを投げる。

  4. constructorで示されるインターフェイスがrelevant global objectに公開されていない場合、"NotSupportedError" DOMExceptionを投げる。

    通常はユーザーエージェントが特定構成でタッチイベントを無効化するため、TouchEventインターフェイスでこの条件になる。

  5. constructorを使いイベントを生成し、eventとする。

  6. eventtype属性を空文字列で初期化。

  7. eventtimeStamp属性を、current high resolution timethisrelevant global object)で初期化。

  8. eventisTrusted属性をfalseで初期化。

  9. eventinitialized flagをUnset。

  10. eventを返す。

Eventのコンストラクターの利用が推奨されます。


createRange() メソッドの手順は、(this, 0)を開始・終端とする新しいライブ範囲を返すこと。

Range()コンストラクターも利用できます。


createNodeIterator(root, whatToShow, filter) メソッドの手順:

  1. iteratorを新しいNodeIteratorオブジェクトとする。

  2. iteratorrootreferencerootに設定。

  3. iteratorpointer before referenceをtrueに設定。

  4. iteratorwhatToShowwhatToShowに設定。

  5. iteratorfilterfilterに設定。

  6. iteratorを返す。

createTreeWalker(root, whatToShow, filter) メソッドの手順:

  1. walkerを新しいTreeWalkerオブジェクトとする。

  2. walkerrootcurrentrootに設定。

  3. walkerwhatToShowwhatToShowに設定。

  4. walkerfilterfilterに設定。

  5. walkerを返す。

4.5.1. インターフェース DOMImplementation

ユーザーエージェントはドキュメントが 作成されるたびにDOMImplementation オブジェクトを生成し、そのドキュメントに関連付けなければならない。

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

  boolean hasFeature(); // useless; always returns true
};
doctype = document . implementation . createDocumentType(name, publicId, systemId)
指定されたnamepublicIdsystemIddoctypeを返します。

name有効なドキュメント型名でない場合、"InvalidCharacterError" DOMException が投げられます。

doc = document . implementation . createDocument(namespace, qualifiedName [, doctype = null])
XMLDocumentを返します。 文書要素ローカル名qualifiedNameで、 名前空間namespacequalifiedNameが空文字列でない場合)となります。また、doctypeが指定されていればそのdoctypeも持ちます。

このメソッドはcreateElementNS() メソッドと同じ例外を、namespacequalifiedNameを指定した場合に投げます。

doc = document . implementation . createHTMLDocument([title])
documentを返します。 基本的なツリーが既に構築されており、 title 要素も含まれます(title引数が省略された場合を除く)。

createDocumentType(name, publicId, systemId) メソッドの手順は次の通りです:

  1. もし name有効な doctype 名でなければ、"InvalidCharacterError" DOMException を投げる。

  2. 新しいdoctype を返す。その namenamepublic IDpublicIdsystem IDsystemIdノードドキュメントdocumentthis に関連するもの)に設定される。

createDocument(namespace, qualifiedName, doctype) メソッドの手順は次の通りです:

  1. document を新しい XMLDocument とする。

  2. element を null にする。

  3. もし qualifiedName が空文字列でなければ、elementinternal createElementNS ステップdocument, namespace, qualifiedName, 空辞書を渡して実行した結果をセットする。

  4. もし doctype が null でなければ、appenddoctypedocument に追加する。

  5. もし element が null でなければ、appendelementdocument に追加する。

  6. documentoriginthis に関連付けられた documentorigin に設定する。

  7. documentcontent typenamespace に応じて次を値にする:

    HTML 名前空間
    application/xhtml+xml
    SVG 名前空間
    image/svg+xml
    その他の名前空間
    application/xml
  8. document を返す。

createHTMLDocument(title) メソッドの手順は次の通りです:

  1. doc に新しい 文書HTML文書)を代入する。

  2. docコンテントタイプを "text/html" に設定する。

  3. 新しい ドキュメント型宣言name が "html" で、ノード文書doc となる)を doc追加する。

  4. 要素を生成するdoc, "html", HTML名前空間)の結果を doc追加する。

  5. 要素を生成するdoc, "head", HTML名前空間)の結果を、先ほど生成した html 要素に追加する。

  6. もし title が与えられている場合:

    1. 要素を生成するdoc, "title", HTML名前空間)の結果を、先ほど生成した head 要素に追加する。

    2. 新しい Text ノードdatatitle(空文字列も可能)に設定し、ノード文書doc に設定する)を、先ほど生成した title 要素に追加する。

  7. 要素を生成するdoc, "body", HTML名前空間)の結果を、先ほど生成した html 要素に追加する。

  8. docオリジンthis が関連付ける文書オリジンに設定する。

  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 ノードは単に doctypeとして知られています。

Doctypeには、 関連付けられた namepublic IDsystem ID があります。

Doctypeが作成されるとき、 nameは 必ず与えられます。Doctypeが作成される際に明示的に与えられない限り、 public IDsystem IDは 空文字列になります。

nameゲッター手順は、 thisnameを返すことです。

publicIdゲッター手順は、 thispublic IDを返すことです。

systemIdゲッター手順は、 thissystem IDを返すことです。

4.7. インターフェイス DocumentFragment

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

DocumentFragment型のノードは、関連するhost(null または異なるノードツリー内の要素)を持ちます。特に明記されていない場合は null です。

オブジェクトAがオブジェクトBhost込み包含祖先であるとは、AB包含祖先である場合、またはBが非nullのhostを持ち、かつABhostのhost込み包含祖先である場合です。

DocumentFragment型のノードhostという概念は、HTMLのtemplate要素やシャドウルートで役立ち、pre-insertreplaceアルゴリズムにも影響します。

tree = new DocumentFragment()
新しいDocumentFragmentノードを返します。

new DocumentFragment()コンストラクターの手順は、thisノード文書current global objectに関連付けられた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")が関連付けられている。

シャドウルートには delegates focus (真偽値)が関連付けられている。初期値はfalseである。

シャドウルートには available to element internals (真偽値)が関連付けられている。初期値はfalseである。

シャドウルートには declarative (真偽値)が関連付けられている。初期値はfalseである。

シャドウルートには slot assignment ("manual" または "named")が関連付けられている。

シャドウルートには clonable (真偽値)が関連付けられている。初期値はfalseである。

シャドウルートには serializable (真偽値)が関連付けられている。初期値はfalseである。

シャドウルートには カスタム要素レジストリ (null または CustomElementRegistry オブジェクト)が関連付けられている。初期値はnullである。

シャドウルートには keep custom element registry null (真偽値)が関連付けられている。初期値はfalseである。

これは宣言的シャドウルートと組み合わせてのみ真になり得る。また、シャドウルートカスタム要素レジストリ がnullである間だけ意味がある。


シャドウルート親を取得 アルゴリズムは、eventを受け取り、eventcomposed flagがunsetで シャドウルートeventパスの最初のstructの 起動ターゲットrootの場合、nullを返す; それ以外はシャドウルートホストを返す。


mode のゲッターの手順は thisモードを返すことである。

delegatesFocus のゲッターの手順は thisdelegates focus を返すことである。

slotAssignment のゲッターの手順は thisslot assignment を返すことである。

clonable のゲッターの手順は thisclonable を返すことである。

serializable のゲッターの手順は thisserializable を返すことである。

host のゲッターの手順は thishost を返すことである。


onslotchange 属性は イベントハンドラーIDL属性 であり、 onslotchange イベントハンドラーである。その イベントハンドラーイベント型slotchange である。


シャドウを含む木順は、 シャドウを含む先行・深さ優先走査 によりノードツリーを辿る。 シャドウを含む先行・深さ優先走査 とは、ノードツリー tree に対して、tree内で遭遇した各シャドウホストについて、その シャドウルートノードツリーも、 その直後に同様の走査を行う、という形での先行・深さ優先探索である。

シャドウを含むroot とは、オブジェクトのrootシャドウルートである場合、 そのホストシャドウを含むrootがそれに該当し、 そうでなければ単にそのrootとなる。

オブジェクトAが、オブジェクトBシャドウを含む子孫 であるとは、AB子孫である場合、 またはArootシャドウルートで、かつ ArootホストBシャドウを含む包含する子孫で ある場合である。

シャドウを含む包含する子孫 とは、自分自身またはそのシャドウを含む子孫の一つである。

オブジェクトAが、オブジェクトBシャドウを含む祖先 であるとは、かつその時に限り、BAシャドウを含む子孫である場合である。

シャドウを含む包含する祖先 とは、自分自身またはそのシャドウを含む祖先の一つである。

ノードAノードBから closed-shadow-hidden になるとは、次のすべての条件が成り立つときである:

オブジェクトAをオブジェクトBに対して retarget するには、オブジェクトが返るまで次の手順を繰り返す:

  1. 以下のいずれかが真の場合:

    その場合、A を返す。

  2. AAhost に設定する。

retargeting アルゴリズムは イベントディスパッチ や他の仕様(例えば 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, (TrustedType or DOMString) value);
  [CEReactions] undefined setAttributeNS(DOMString? namespace, DOMString qualifiedName, (TrustedType or DOMString) value);
  [CEReactions] undefined removeAttribute(DOMString qualifiedName);
  [CEReactions] undefined removeAttributeNS(DOMString? namespace, DOMString localName);
  [CEReactions] boolean toggleAttribute(DOMString qualifiedName, optional boolean force);
  boolean hasAttribute(DOMString qualifiedName);
  boolean hasAttributeNS(DOMString? namespace, DOMString localName);

  Attr? getAttributeNode(DOMString qualifiedName);
  Attr? getAttributeNodeNS(DOMString? namespace, DOMString localName);
  [CEReactions] Attr? setAttributeNode(Attr attr);
  [CEReactions] Attr? setAttributeNodeNS(Attr attr);
  [CEReactions] Attr removeAttributeNode(Attr attr);

  ShadowRoot attachShadow(ShadowRootInit init);
  readonly attribute ShadowRoot? shadowRoot;

  readonly attribute CustomElementRegistry? customElementRegistry;

  Element? closest(DOMString selectors);
  boolean matches(DOMString selectors);
  boolean webkitMatchesSelector(DOMString selectors); // legacy alias of .matches

  HTMLCollection getElementsByTagName(DOMString qualifiedName);
  HTMLCollection getElementsByTagNameNS(DOMString? namespace, DOMString localName);
  HTMLCollection getElementsByClassName(DOMString classNames);

  [CEReactions] Element? insertAdjacentElement(DOMString where, Element element); // legacy
  undefined insertAdjacentText(DOMString where, DOMString data); // legacy
};

dictionary ShadowRootInit {
  required ShadowRootMode mode;
  boolean delegatesFocus = false;
  SlotAssignmentMode slotAssignment = "named";
  boolean clonable = false;
  boolean serializable = false;
  CustomElementRegistry? customElementRegistry;
};

ShadowRootInit はやや珍しく、undefinedおよびnullの両方を customElementRegistry メンバーに渡すことができ、Web 開発者が辞書ではなくShadowRoot ノードをattachShadow() に渡せるようにしています。

Element ノードは単に 要素として知られています。

要素には、次の関連付けられた値があります:

名前空間
null または空でない文字列。
名前空間接頭辞
null または空でない文字列。
ローカル名
空でない文字列。
カスタム要素レジストリ
null または CustomElementRegistry オブジェクト。
カスタム要素状態
"undefined", "failed", "uncustomized", "precustomized", または "custom"。
カスタム要素定義
null または カスタム要素定義
is
null または 有効なカスタム要素名

要素作成されるとき、 これらすべての値が 初期化されます。

要素カスタム要素状態が "uncustomized" または "custom" である場合、 定義済みとされます。要素カスタム要素状態が "custom" である場合、 カスタムとされます。

要素が定義済みかどうかは、 :defined 疑似クラスの挙動を決定するために使われます。要素がカスタムかどうかは mutation アルゴリズムの挙動を決定するために使われます。 "failed"および"precustomized"状態は、 カスタム要素コンストラクタが初回に正しく実行されない場合、 upgradeによって再度実行されないよう保証するために使われます。

以下のコードは、これら4つの状態それぞれの要素を示します:

<!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" (未定義、カスタムでない) -->
<sw-han></sw-han>
<p is="sw-luke"></p>
<p is="asdf"></p>

<!-- "failed" (未定義、カスタムでない) -->
<sw-kylo></sw-kylo>

<!-- "uncustomized" (定義済み、カスタムでない) -->
<p></p>
<asdf></asdf>

<!-- "custom" (定義済み、カスタム) -->
<sw-rey></sw-rey>
<p is="sw-finn"></p>

要素にも、 関連付けられた シャドウルート(null または シャドウルート)があります。特別な記述がない限り null です。 要素は、 そのシャドウルートが null でない場合、 シャドウホストとされます。

要素qualified name(修飾名)は、 名前空間接頭辞が null の場合は ローカル名、 そうでなければ、 名前空間接頭辞、":"、そして ローカル名を順に連結したものです。

要素HTML大文字修飾名は、次の手順の戻り値です:

  1. qualifiedNamethis修飾名とする。

  2. thisHTML 名前空間にあり、その ノード文書HTML文書なら、 qualifiedNameASCII大文字に変換する。

  3. qualifiedName を返す。

ユーザーエージェントは 修飾名HTML大文字修飾名を内部スロットに格納することで最適化可能です。

要素を作成するには、 document 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カスタム要素定義の検索 の結果にする(引数は registry, namespace, localName, is)。

  4. definition が null でなく、かつ definitionnamelocal name と等しくない場合(つまり カスタマイズされた組み込み要素の場合):

    1. interfaceelement interfacelocalNameHTML名前空間に対するものにする。

    2. result要素内部の作成の結果にする (引数は document, interface, localName, HTML名前空間, prefix, "undefined", is, registry)。

    3. synchronousCustomElements が true の場合、例外をキャッチしつつ下記を実行:

      1. result を definition でアップグレードする

      このステップで例外 exception が発生した場合:

      1. 例外を報告する exceptiondefinitionconstructor に対応する JavaScript オブジェクトの 関連付けられた realmグローバルオブジェクト に対して報告する。

      2. resultカスタム要素状態を "failed" に設定する。

    4. それ以外の場合は カスタム要素アップグレードリアクションをキューする (引数は resultdefinition)。

  5. それ以外で definition が null でない場合:

    1. synchronousCustomElements が true の場合:

      1. Cdefinitionconstructor とする。

      2. surrounding agentactive custom element constructor map[C] に registry を設定する。

      3. 例外をキャッチしつつ次を実行:

        1. resultC を構築する結果にする(引数なし)。

        2. Assert: resultカスタム要素状態カスタム要素定義は初期化済み。

        3. Assert: result名前空間HTML 名前空間

          IDL により resultHTMLElement オブジェクトとなり、すべて HTML 名前空間を使用します。

        4. result属性リスト空でない場合は、 NotSupportedError DOMExceptionをスローする。

        5. resultがある場合は、 NotSupportedError DOMExceptionをスローする。

        6. resultが null でない場合は NotSupportedError DOMExceptionをスローする。

        7. resultノード文書documentでない場合は NotSupportedError DOMExceptionをスローする。

        8. resultローカル名localNameと等しくない場合は NotSupportedError DOMExceptionをスローする。

        9. result名前空間接頭辞prefixに設定する。

        10. resultisを null に設定する。

        11. resultカスタム要素レジストリregistryに設定する。

        これらのステップで例外 exception が発生した場合:

        1. 例外を報告する exceptiondefinitionconstructor に対応する JavaScript オブジェクトの 関連付けられた realmグローバルオブジェクト に対して報告する。

        2. result要素内部の作成の結果にする (引数は document, HTMLUnknownElement, localName, HTML名前空間, prefix, "failed", null, registry)。

      4. surrounding agentactive custom element constructor map[C] を削除する。

        通常はこの時点でもう削除されているはずです。

    2. それ以外の場合:

      1. result要素内部の作成の結果にする (引数は document, HTMLElement, localName, HTML名前空間, prefix, "undefined", null, registry)。

      2. カスタム要素アップグレードリアクションをキューする (引数は resultdefinition)。

  6. それ以外の場合:

    1. interfaceelement interfacelocalNamenamespaceに対するものにする。

    2. result要素内部の作成の結果にする (引数は document, interface, localName, namespace, prefix, "uncustomized", is, registry)。

    3. namespaceHTML名前空間であり、 localName有効なカスタム要素名であるか、is が null でない場合は resultカスタム要素状態を "undefined" に設定する。

  7. result を返す。

要素内部を作成するには、document document、インターフェイス interface、文字列 localName、文字列または null namespace、文字列または null prefix、文字列 state、文字列または null is、null または CustomElementRegistry オブジェクト registry を与えて次の手順を実行します:

  1. element を新しい要素interfaceを実装し、 名前空間namespace名前空間接頭辞prefixローカル名localNameカスタム要素レジストリregistryカスタム要素状態stateカスタム要素定義を null、 isisノード文書documentに設定したもの)とする。

  2. 確認element属性リスト空であること。

  3. elementを返す。

要素には 属性リストもあり、これは リストNamedNodeMap を通して公開されます。 要素が作成される際に明示的に与えられない限り、 その属性リストです。

要素属性を持つとは、その属性リスト属性A含む場合です。

これおよび他の仕様属性変更手順要素に対して定義することができます。アルゴリズムには elementlocalNameoldValuevaluenamespaceが渡されます。

属性変更を処理するには、 属性 attributeelementoldValuenewValueを使い、下記手順を実行します:

  1. mutation record の "attributes" を elementに対して、attributeローカル名attribute名前空間oldValue、« »、« »、null、null で キューする。

  2. elementカスタムなら、 カスタム要素コールバックリアクションをキューする (引数は element、コールバック名 "attributeChangedCallback"、« attributeローカル名oldValuenewValueattribute名前空間 »)。

  3. 属性変更手順elementattributeローカル名oldValuenewValueattribute名前空間で実行する。

属性を変更するには、 属性 attributevalueに変更する場合、次の手順を実行します:

  1. oldValueattributeとする。

  2. attributevalueに設定する。

  3. 属性変更を処理する(引数は attributeattribute要素oldValuevalue)。

属性を追加するには、 属性 attribute要素 element に追加する場合、次の手順を実行します:

  1. append attributeelement属性リストに追加する。

  2. attribute要素elementに設定する。

  3. attributeノード文書elementノード文書に設定する。

  4. 属性変更を処理する(引数は attributeelement、null、attribute)。

属性を除去するには、 属性 attribute を除去する場合、次の手順を実行します:

  1. elementattribute要素とする。

  2. remove attributeelement属性リストから除去する。
  3. attribute要素を null に設定する。

  4. 属性変更を処理する(引数は attributeelementattribute、null)。

属性を置換するには、 属性 oldAttribute属性 newAttributeで置換する場合:

  1. elementoldAttribute要素とする。

  2. replace oldAttributenewAttributeelement属性リスト内で置換する。

  3. newAttribute要素elementに設定する。

  4. newAttributeノード文書elementノード文書に設定する。

  5. oldAttribute要素を null に設定する。

  6. 属性変更を処理する(引数は oldAttributeelementoldAttributenewAttribute)。


文字列 qualifiedName要素 elementを与えて 名前で属性を取得するには:

  1. elementHTML名前空間にあり、 そのノード文書HTML文書である場合、 qualifiedNameASCII小文字に変換する。

  2. element属性リスト内で、 属性修飾名qualifiedNameと一致する最初のものを返す。なければ null。

null または文字列 namespace、文字列 localName要素 elementを与えて 名前空間とローカル名で属性を取得するには:

  1. namespace が空文字列なら、null に設定する。

  2. element属性リスト内で、 属性名前空間namespace かつ ローカル名localName のものを返す。なければ null。

要素 element、文字列 localName、オプションの null または文字列 namespace(省略時は null)を与えて 属性値を取得するには:

  1. attr属性を取得するの結果とする(引数は namespace, localName, element)。

  2. attr が null なら、空文字列を返す。

  3. attrを返す。

属性を設定するには、 属性 attr要素 element を与える:

  1. verifiedValue を、 get trusted type compliant attribute valueattrlocal nameattrnamespaceelementattrvalue を渡して呼び出した結果とする。[TRUSTED-TYPES]

  2. もし attrelement が null でもなく、かつ element でもない場合は、 throw し、 "InUseAttributeError" DOMException を発生させる。

  3. oldAttr を、 属性を取得するattrnamespaceattrlocal nameelement を与える)した結果とする。

  4. もし oldAttrattr であれば、attr を返す。

  5. attrvalueverifiedValue に設定する。

  6. oldAttr が null でなければ、置換するoldAttrattr で)。

  7. そうでなければ、追加するattrelement に)。

  8. oldAttr を返す。

属性値を設定するには、 要素 element、文字列 localName、文字列 value、 省略可能な null または文字列 prefix(既定値は null)、省略可能な null または文字列 namespace(既定値は null)を与える:

  1. attribute を、 属性を取得するnamespacelocalNameelement を与える)した結果とする。
  2. もし attribute が null なら、属性を作成し、その 名前空間namespace名前空間接頭辞prefixローカル名localNamevalueノード文書elementノード文書 にして、この 属性element追加し、return する。
  3. 変更するattribute の値を value に)。

文字列 qualifiedName要素 elementを与えて 名前で属性を除去するには:

  1. attr名前で属性を取得するの結果とする(引数は qualifiedName, element)。

  2. attr が null でなければ、除去 attr

  3. attr を返す。

null または文字列 namespace、文字列 localName要素 elementを与えて 名前空間とローカル名で属性を除去するには:

  1. attr属性を取得するの結果とする(引数は namespace, localName, element)。

  2. attr が null でなければ、除去 attr

  3. attr を返す。


要素一意な識別子(ID)を持つことができます。

歴史的に、要素は複数の識別子を持つことができました。たとえば、HTMLのid属性やDTDを使用することによってです。本仕様はIDをDOMの概念とし、要素ごとに一つだけ、id属性によって与えられるようにしています。

属性変更手順を使って要素IDを更新します:

  1. もし localNameid であり、namespace が null かつ value が null または空文字列であれば、elementID を未設定にする。

  2. それ以外で localNameid かつ namespace が null の場合、elementIDvalue に設定する。

本仕様は、あらゆる 要素 における classidslot 属性について要件を定義しているが、それらを使用することが適合であるかどうかは定めていない。


ノードElement 型の場合、それはそのノードの 親要素と呼ばれます。もしノードが異なる型であれば、 その親要素は null となります。


namespace = element . namespaceURI
名前空間を返します。
prefix = element . prefix
名前空間接頭辞を返します。
localName = element . localName
ローカル名を返します。
qualifiedName = element . tagName
HTML大文字修飾名を返します。

namespaceURIゲッター手順は this名前空間を返すことです。

prefixゲッター手順は this名前空間接頭辞を返すことです。

localNameゲッター手順は thisローカル名を返すことです。

tagNameゲッター手順は thisHTML大文字修飾名を返すことです。


element . id [ = value ]

elementid内容属性の値を返します。設定することで値を変更できます。

element . className [ = value ]

elementclass内容属性の値を返します。設定することで値を変更できます。

element . classList

elementclass内容属性を DOMTokenList オブジェクトを通じて、空白区切りのトークン集合として操作できます。

element . slot [ = value ]

elementslot内容属性の値を返します。設定することで値を変更できます。

文字列name反映するよう定義されたIDL属性は、以下のgetter・setter手順を持ちます:

getter手順

属性値を取得するthisname)の結果を返す。

setter手順

属性値を設定するthisnameと与えられた値)を実行する。

id属性は「id」を反映しなければなりません。

className属性は 「class」を反映しなければなりません。

classListゲッター手順は、 DOMTokenList オブジェクトを返すことです。関連付けられた要素this、関連付けられた 属性ローカル名は「class」です。この DOMTokenList オブジェクトのトークン集合は、要素クラスとも呼ばれます。

slot属性は「slot」を反映しなければなりません。

idclassslotは、どの要素にも現れることができ、 要素がどの名前空間に属していても有効な、事実上のスーパーグローバル属性です。


element . hasAttributes()

element が属性を持っていれば true を返し、そうでなければ false を返す。

element . getAttributeNames()

element の全ての 修飾名属性)を返す。重複する場合がある。

element . getAttribute(qualifiedName)

qualifiedName属性のうち最初のものの値を返し、該当する 属性がなければ null を返す。

element . getAttributeNS(namespace, localName)

namespace かつ localName に該当する 属性を返し、該当がなければ null を返す。

element . setAttribute(qualifiedName, value)

qualifiedName の最初の 属性の値を value に設定する。

element . setAttributeNS(namespace, localName, value)

namespace かつ localName属性の値を value に設定する。

element . removeAttribute(qualifiedName)

qualifiedName の最初の 属性を削除する。

element . removeAttributeNS(namespace, localName)

namespace かつ localName属性を削除する。

element . toggleAttribute(qualifiedName [, force])

force が指定されていない場合は qualifiedName を「トグル」し、存在すれば削除し、存在しなければ追加する。force が true なら追加、false なら削除。

qualifiedName が現在存在すれば true、そうでなければ false を返す。

element . hasAttribute(qualifiedName)

qualifiedName を持つ 属性があれば true、なければ false を返す。

element . hasAttributeNS(namespace, localName)

namespace かつ localName を持つ 属性があれば true を返す。

hasAttributes() メソッドの手順は、this属性リスト空であれば false を返し、 そうでなければ true を返す。

attributes ゲッターの手順は、関連付けられた NamedNodeMap を返す。

getAttributeNames() メソッドの手順は、 修飾名属性this属性リストの順で返す。該当がなければ新しいリスト

これらが一意であるとは限らない。

getAttribute(qualifiedName) メソッドの手順は以下の通り:

  1. attr名前で属性を取得した結果(qualifiedName, this)とする。

  2. attr が null なら、null を返す。

  3. attr を返す。

getAttributeNS(namespace, localName) メソッドの手順は以下の通り:

  1. attr名前空間で属性を取得した結果(namespace, localName, this)とする。

  2. attr が null なら、null を返す。

  3. attr を返す。

setAttribute(qualifiedName, value) メソッドの手順は以下の通り:

  1. qualifiedName有効な属性ローカル名 でなければ、 "InvalidCharacterError" DOMExceptionthrow する。

    パラメータ名にかかわらず、 qualifiedName はすでにその名前の 属性 があれば修飾名として、なければ新しい属性の ローカル名 として使われるため、 後者の場合のみバリデーションが必要となる。

  2. thisHTML 名前空間 かつ ノード文書HTML document なら、 qualifiedNameASCII小文字 にする。

  3. verifiedValue信頼された型の属性値取得関数qualifiedName, null, this, value)の結果とする。

  4. qualified namequalifiedName である最初の 属性(なければ null)を attribute とする。

  5. attribute が null でなければ 変更し、attributeverifiedValue にして return。

  6. 新規の 属性ローカル名qualifiedNameverifiedValueノード文書thisノード文書とする)を attribute とする。

  7. appendattributethis に追加する。

setAttributeNS(namespace, qualifiedName, value) メソッドの手順は以下の通り:

  1. (namespace, prefix, localName) を 検証と抽出namespace, qualifiedName, "attribute")の結果とする。

  2. verifiedValue信頼された型の属性値取得関数localName, namespace, this, value)の結果とする。

  3. 属性値を設定this, localName, verifiedValue, prefix, namespace)を行う。

removeAttribute(qualifiedName) メソッドの手順は、名前で属性を削除qualifiedName, this)し、undefined を返す。

removeAttributeNS(namespace, localName) メソッドの手順は、名前空間で属性を削除namespace, localName, this)し、undefined を返す。

hasAttribute(qualifiedName) メソッドの手順は以下の通り:

  1. thisHTML 名前空間 かつ ノード文書HTML document なら、 qualifiedNameASCII小文字 にする。

  2. has メソッドで 属性qualified namequalifiedName)が存在すれば true、なければ false を返す。

toggleAttribute(qualifiedName, force) メソッドの手順は以下の通り:

  1. qualifiedName有効な属性ローカル名 でなければ、 "InvalidCharacterError" DOMExceptionthrow する。

    「ローカル名」としてバリデーションする理由は上記の議論を参照。

  2. thisHTML 名前空間 かつ ノード文書HTML document なら、 qualifiedNameASCII小文字 にする。

  3. qualified namequalifiedName である最初の 属性(なければ null)を attribute とする。

  4. attribute が null の場合:

    1. force が指定されていないか true なら、属性ローカル名qualifiedNameは空文字列、ノード文書thisノード文書)を作成し、append属性this に追加し、true を返す。

    2. false を返す。

  5. それ以外で force が指定されていないか false なら、 名前で属性を削除qualifiedName, this)して false を返す。

  6. true を返す。

hasAttributeNS(namespace, localName) メソッドの手順は以下の通り:

  1. namespace が空文字列なら null にする。

  2. has メソッドで 属性名前空間namespace かつ ローカル名localName)が存在すれば true、なければ false を返す。


getAttributeNode(qualifiedName) メソッドの手順は qualifiedNameで属性を取得thisとともに返します。

getAttributeNodeNS(namespace, localName) メソッドの手順は namespaceで属性を取得namespacelocalNamethisで返します。

setAttributeNode(attr)および setAttributeNodeNS(attr)の 手順はattrthisを用いて 属性を設定した結果を返します。

removeAttributeNode(attr)メソッドの手順は以下の通りです:

  1. this属性リストattr含まれて いなければ、 例外を投げ、 "NotFoundError" DOMExceptionとします。

  2. attrを削除します。

  3. attrを返します。


shadow = element . attachShadow(init)

elementシャドウルートを生成し、それを返します。

shadow = element . shadowRoot

elementシャドウルート(存在する場合、かつシャドウルートmodeが"open"の場合)を返します。そうでなければnull。

有効なシャドウホスト名は:

attachShadow(init) メソッドの手順は以下の通り:

  1. registrythisnode documentカスタム要素レジストリ とする。

  2. もし init["customElementRegistry"] が 存在する 場合、 registry にその値を設定する。

  3. もし registry が non-null で、registryis scoped が false であり、かつ registrythisnode documentcustom element registry でない場合、throw a "NotSupportedError" DOMException を投げる。

  4. シャドウルートをアタッチするthis, init["mode"], init["clonable"], init["serializable"], init["delegatesFocus"], init["slotAssignment"], および registry で実行する。

  5. thisシャドウルート を返す。

シャドウルートを付与するには、 要素 element、文字列 mode、真偽値 clonable、 真偽値 serializable、真偽値 delegatesFocus、文字列 slotAssignment、null または CustomElementRegistry オブジェクト registryを与える:

  1. element名前空間HTML名前空間でない場合、 NotSupportedError NotSupportedError DOMExceptionをスローする。

  2. elementローカル名有効なシャドウホスト名でない場合、 NotSupportedError NotSupportedError DOMExceptionをスローする。

  3. elementローカル名有効なカスタム要素名である、または elementisがnullでない場合:

    1. definitionカスタム要素定義の検索 (引数は elementカスタム要素レジストリ、名前空間、ローカル名、is値)とする。

    2. definitionが null でなく、かつ definitiondisable shadowがtrueなら、 NotSupportedError NotSupportedError DOMExceptionをスローする。

  4. elementシャドウホストの場合:

    1. currentShadowRootelementシャドウルートとする。

    2. 以下いずれかが真の場合:

      • currentShadowRootdeclarativeがfalse

      • currentShadowRootmodemodeと異なる

      この場合は NotSupportedError NotSupportedError DOMExceptionをスローする。

    3. それ以外の場合:

      1. 除去 currentShadowRootすべて(ツリー順で)。

      2. currentShadowRootdeclarativeをfalseにする。

      3. return。

  5. shadow を新しい シャドウルート とし、その ノード文書elementノード文書ホストelementモードmode である。

  6. shadowdelegates focusdelegatesFocusに設定する。

  7. elementカスタム要素状態が"precustomized"または"custom"の場合、 shadowelement internalsで利用可能をtrueにする。

  8. shadowslot assignmentslotAssignmentに設定する。

  9. shadowdeclarativeをfalseに設定する。

  10. shadowclonableclonableに設定する。

  11. shadowserializableserializableに設定する。

  12. shadowcustom element registryregistryに設定する。

  13. elementシャドウルートshadowに設定する。

shadowRoot ゲッターの手順は次の通り:

  1. shadowthisシャドウルート とする。

  2. もし shadow が null またはその mode が "closed" であれば、null を返す。

  3. shadow を返す。


registry = element . customElementRegistry

elementCustomElementRegistry オブジェクト(存在する場合)、なければ null を返す。

customElementRegistry ゲッターの手順は、 thisカスタム要素レジストリを返すこと。


element . closest(selectors)
element から始めて、selectors にマッチする最初の 包含祖先を返し、見つからなければ null を返す。
element . matches(selectors)
elementルートselectors をマッチングしたときに element が得られれば true、そうでなければ false を返す。

closest(selectors) メソッドの手順は次の通りです:

  1. selectorselectors から セレクターを構文解析した結果とする。 [SELECTORS4]

  2. もし selector が失敗なら、throw して "SyntaxError" DOMException を投げる。

  3. elementsthis包含祖先要素であるもの)を逆 ツリー順序で並べたリストとする。

  4. elements の各 element について:セレクターを要素にマッチselectorelementスコーピングルート this) が成功なら element を返す。 [SELECTORS4]

  5. null を返す。

matches(selectors) および webkitMatchesSelector(selectors) メソッドの手順は次の通りです:

  1. selectorselectors から セレクターを構文解析した結果とする。 [SELECTORS4]

  2. もし selector が失敗なら、throw して "SyntaxError" DOMException を投げる。

  3. セレクターを要素にマッチselectorthisスコーピングルート this) が成功なら true を、そうでなければ false を返す。 [SELECTORS4]


getElementsByTagName(qualifiedName) メソッドの手順は、qualifiedName を持つ要素のリストthis について返すこと。

getElementsByTagNameNS(namespace, localName) メソッドの手順は、namespacelocalName を持つ要素のリストthis について返すこと。

getElementsByClassName(classNames) メソッドの手順は、classNames を持つ要素のリストthis について返すこと。


隣接挿入するには、 要素 element、文字列 where、 そして ノード node を受け取り、 where に対する最初の ASCII大文字小文字無視一致に関連付けられた手順を実行する:

"beforebegin"

もし element が null なら、null を返す。

elementに、 element の前で node事前挿入した結果を返す。

"afterbegin"

element において element最初の子 の前で node事前挿入した結果を返す。

"beforeend"

element において null の前で node事前挿入した結果を返す。

"afterend"

もし element が null なら、null を返す。

elementに、 element次の兄弟の前で node事前挿入した結果を返す。

それ以外

スローする "SyntaxError" DOMException

insertAdjacentElement(where, element) メソッドの手順は、隣接挿入を実行し、 thiswhereelement を与えて返すことである。

insertAdjacentText(where, data) メソッドの手順は以下の通り:

  1. text を新しい Text ノードとし、その データdataノード文書thisノード文書 とする。

  2. 隣接挿入thiswheretext で実行する。

このメソッドは我々が設計する前から存在していたため何も返さない。

4.9.1. インターフェイス NamedNodeMap

[Exposed=Window,
 LegacyUnenumerableNamedProperties]
interface NamedNodeMap {
  readonly attribute unsigned long length;
  getter Attr? item(unsigned long index);
  getter Attr? getNamedItem(DOMString qualifiedName);
  Attr? getNamedItemNS(DOMString? namespace, DOMString localName);
  [CEReactions] Attr? setNamedItem(Attr attr);
  [CEReactions] Attr? setNamedItemNS(Attr attr);
  [CEReactions] Attr removeNamedItem(DOMString qualifiedName);
  [CEReactions] Attr removeNamedItemNS(DOMString? namespace, DOMString localName);
};

NamedNodeMapには、関連付けられた要素element)があります。

NamedNodeMapオブジェクトの属性リストは、その要素属性リストです。


NamedNodeMapオブジェクトのサポートされるプロパティインデックスは、ゼロから属性リストサイズ−1までの範囲の番号です。ただし、属性リストの場合は、サポートされるプロパティインデックスはありません。

lengthゲッターの手順は、属性リストサイズを返すことです。

item(index)メソッドの手順:

  1. indexthis属性リストサイズ以上なら、nullを返す。

  2. それ以外の場合、this属性リスト[index]を返す。

NamedNodeMap オブジェクトの サポートされているプロパティ名は、次の手順を実行した結果である:

  1. names を、この NamedNodeMap オブジェクトの 属性リスト内の 属性修飾名(重複を除去し順序はそのまま)とする。

  2. この NamedNodeMap オブジェクトの 要素HTML 名前空間にあり、かつその ノードドキュメントHTML ドキュメント である場合は、 namesname について:

    1. lowercaseNamenameASCII 小文字とする。

    2. もし lowercaseNamename が等しくないなら、names から name を削除する。

  3. names を返す。

getNamedItem(qualifiedName) メソッド手順は名前で属性を取得する(引数は qualifiedName, element)の結果を返すことです。

getNamedItemNS(namespace, localName) メソッド手順は名前空間とローカル名で属性を取得する(引数は namespace, localName, element)の結果を返すことです。

setNamedItem(attr)および setNamedItemNS(attr)メソッド手順は 属性を設定する(引数は attr, element)の結果を返すことです。

removeNamedItem(qualifiedName) メソッド手順は:

  1. attr名前で属性を除去する(引数は qualifiedName, element)の結果とする。

  2. attr が null なら、NotFoundError NotFoundError DOMExceptionをスローする。

  3. attr を返す。

removeNamedItemNS(namespace, localName) メソッド手順は:

  1. attr名前空間とローカル名で属性を除去する(引数は namespace, localName, element)の結果とする。

  2. attr が null なら、NotFoundError NotFoundError DOMExceptionをスローする。

  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 であれば ローカル名であり、 そうでなければ 名前空間プリフィックス+":"+ ローカル名となります。

ユーザーエージェントは最適化のためにこれを内部スロットとして持つことができます。

属性が作成されるとき、 そのローカル名が与えられます。 属性が作成されるときに明示的に与えられない限り、 その 名前空間名前空間プリフィックス要素 は null になり、 は空文字列に設定されます。

A 属性 とは、属性で、 ローカル名A であり、 名前空間名前空間プリフィックス が null であるものを指します。


namespaceURI ゲッターの手順は、 this名前空間 を返すことです。

prefix ゲッターの手順は、 this名前空間プリフィックス を返すことです。

localName ゲッターの手順は、 thisローカル名 を返すことです。

name ゲッターの手順は、 this修飾名 を返すことです。

value ゲッターの手順は、 this を返すことです。

既存の属性値を設定するには、属性 attribute と文字列 value を与えて次の手順を実行します:

  1. もし attribute要素 が null であれば、 attributevalue に設定して return する。

  2. elementattribute要素 とする。

  3. verifiedValue を、 get trusted type compliant attribute valueattributeローカル名attribute名前空間elementvalue を渡して呼び出した結果とする。[TRUSTED-TYPES]

  4. もし attribute要素 が null であれば、 attributeverifiedValue に設定して return する。

  5. 変更 attributeverifiedValue にする。

value セッターの手順は、既存の属性値を設定するthis と与えられた値)を実行することです。


ownerElement ゲッターの手順は、 this要素 を返すことです。


specified ゲッターの手順は true を返すことです。

4.10. インターフェイス CharacterData

[Exposed=Window]
interface CharacterData : Node {
  attribute [LegacyNullToEmptyString] DOMString data;
  readonly attribute unsigned long length;
  DOMString substringData(unsigned long offset, unsigned long count);
  undefined appendData(DOMString data);
  undefined insertData(unsigned long offset, DOMString data);
  undefined deleteData(unsigned long offset, unsigned long count);
  undefined replaceData(unsigned long offset, unsigned long count, DOMString data);
};

CharacterData は抽象インターフェイスです。直接インスタンス化することはできません。これは TextProcessingInstructionCommentノードで利用されます。

ノードCharacterData インターフェイスから継承したものは、data という可変の文字列を持ちます。

データを置換するには、ノード node、整数 offset、整数 count、文字列 data をとる:

  1. lengthnodelength とする。

  2. もし offsetlength より大きければ、"IndexSizeError" DOMException を投げる。

  3. もし offset + countlength より大きければ、countlengthoffset にする。

  4. キューへ変異記録を追加("characterData"、node、null、null、nodedata、« »、« »、null、null)。

  5. datanodedataoffsetコード単位の後に挿入する。

  6. deleteOffsetoffset + data長さとする。

  7. deleteOffsetコード単位から開始し、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が null でなければ、子変更手順nodeに対して実行する。

データの部分文字列を取得するには、ノード node、整数 offset、整数 count をとる:

  1. lengthnodelength とする。

  2. もし offsetlength より大きければ、"IndexSizeError" DOMException を投げる。

  3. もし offset + countlength より大きければ、nodedataoffset番目以降のコード単位から末尾までの文字列を返す。

  4. それ以外の場合、nodedataoffset番目から offset+count 番目までのコード単位の文字列を返す。

data のgetter手順は、thisdata を返すことです。setter手順は、replace data を 0, thislength、与えられた値で呼び出すことです。

length のgetter手順は、thislength を返すことです。

substringData(offset, count) メソッドの手順は、substring datathisoffsetcount で呼び出した結果を返すことです。

appendData(data) メソッドの手順は、replace datathisthislength、0、data で呼び出すことです。

insertData(offset, data) メソッドの手順は、replace datathisoffset、0、data で呼び出すことです。

deleteData(offset, count) メソッドの手順は、replace datathisoffsetcount、空文字列で呼び出すことです。

replaceData(offset, count, data) メソッドの手順は、replace datathisoffsetcountdata で呼び出すことです。

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)
dataoffsetで分割し、残り部分を新しいTextノードとして返します。
text . wholeText
全ての同一階層のTextノード兄弟dataを連結して返します。

排他的な Textノードは、Textノードであり、CDATASectionノードではありません。

連続する Textノードは、ノード nodeについて、node自身とその前の兄弟Textノード(あれば)およびその連続するTextノード、さらにnode次の兄弟Textノード(あれば)およびその連続するTextノードからなり、重複は除外します。

連続する排他的 Textノードは、ノード nodeについて、node自身とその前の兄弟排他的Textノード(あれば)およびその連続する排他的Textノード、さらにnode次の兄弟排他的Textノード(あれば)およびその連続する排他的Textノードからなり、重複は除外します。

子テキスト内容は、ノード nodeについて、そのTextノードすべてのdata連結して返します(ツリー順)。

子孫テキスト内容は、ノード nodeについて、そのTextノード子孫すべてのdata連結して返します(ツリー順)。


new Text(data)コンストラクターの手順は、thisdatadataに設定し、thisノード文書current global object関連するDocumentに設定することです。

Textノードを分割するには、Textノード node、整数offsetを受け取る:

  1. lengthnodelengthとする。

  2. もしoffsetlengthより大きければ、"IndexSizeError" DOMExceptionを投げる。

  3. countlengthoffsetとする。

  4. newDatasubstringing datanodeoffsetcountで呼び出した結果とする。

  5. newNodeを新しいTextノードノード文書nodeノード文書datanewData)とする。

  6. parentnodeとする。

  7. もしparentがnullでなければ:

    1. InsertnewNodeparentnode次兄弟の前に挿入。

    2. ライブ範囲について、開始ノードnodeかつ開始オフセットoffsetより大きい場合は、開始ノードをnewNodeにして開始オフセットをoffsetだけ減らす。

    3. ライブ範囲について、終了ノードnodeかつ終了オフセットoffsetより大きい場合は、終了ノードをnewNodeにして終了オフセットをoffsetだけ減らす。

    4. ライブ範囲について、開始ノードparentかつ開始オフセットnodeインデックス+1に等しい場合は、開始オフセットを1増やす。

    5. ライブ範囲について、終了ノードparentかつ終了オフセットnodeインデックス+1に等しい場合は、終了オフセットを1増やす。

  8. replace datanodeoffsetcount、空文字列を指定して呼び出す。

  9. newNodeを返す。

splitText(offset)メソッドの手順は、splitthisoffsetで呼び出すことです。

wholeTextゲッターの手順は、連結した連続するTextノードの全dataを、thisに対しtree orderで返します。

4.12. インターフェイス CDATASection

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

4.13. インターフェイス ProcessingInstruction

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

ProcessingInstruction ノード には、関連付けられた ターゲット があります。

target の getter 手順は、 thisターゲット を返します。

4.14. インターフェイス Comment

[Exposed=Window]
interface Comment : CharacterData {
  constructor(optional DOMString data = "");
};
comment = new Comment([data = ""])
新しい Comment ノードを返します。そのデータdata です。

new Comment(data) コンストラクタの手順は、thisデータdata に、 thisノードドキュメント現在のグローバルオブジェクト関連付けられた Document に設定することです。

5. Range(範囲)

5.1. 「DOM Range」について

StaticRangeRange オブジェクト(範囲)は、 ノードツリー内の内容の連続した部分を表します。各範囲開始終了を持ち、 それらは境界点です。境界点は、 タプルであり、 ノードオフセットから構成されます。つまり、 範囲ノードツリー内の 2つの境界点間の内容を表します。

範囲は編集時に選択やコピーなどでよく使われます。

上記のノードツリーでは、範囲を使って “syndata is awes”という連続部分を表すことができます。pp 要素に、 emem 要素に割り当てられていた場合、次のようになります:

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. 境界点

境界点は、タプル であり、次の要素から構成されます。 ノードノード)と、 オフセット(0以上の整数)。

正しい境界点オフセットは 0以上、かつ境界点ノード長さ以下の値になります。

位置は、 境界点 (nodeA, offsetA)が、境界点 (nodeB, offsetB)に対して 等しいのいずれかとなり、以下の手順で判定されます。

  1. アサート:nodeAnodeBは同じルートを持つ。

  2. もしnodeAnodeBであれば、offsetAoffsetBと等しければ等しいを返し、 offsetAoffsetBより小さければoffsetAoffsetBより大きければを返す。
  3. もしnodeA後続nodeBであれば、 (nodeB, offsetB)が(nodeA, offsetA)に対して 位置なら を返し、 なら を返す。

  4. もしnodeAnodeB祖先であれば:

    1. childnodeBとする。

    2. childnodeAでない間、 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 インターフェイスを実装するオブジェクトは 範囲 と呼ばれます。

範囲には2つの関連する境界点開始終了)があります。

便宜上、範囲開始ノードは、その開始ノード開始オフセット開始オフセット終了ノード終了ノード終了オフセット終了オフセットです。

レンジは、折り畳まれている(collapsed)とされるのは、その開始ノード終了ノードと同じで、かつ 開始オフセット終了オフセットと同じ場合である。

node = range . startContainer
range開始ノードを返します。
offset = range . startOffset
range開始オフセットを返します。
node = range . endContainer
range終了ノードを返します。
offset = range . endOffset
range終了オフセットを返します。
collapsed = range . collapsed
range折り畳み済みならtrue、それ以外はfalseを返します。

startContainer のgetter手順は、this開始ノードを返すことである。

startOffset のgetter手順は、this開始オフセットを返すことである。

endContainer のgetter手順は、this終了ノードを返すことである。

endOffset のgetter手順は、this終了オフセットを返すことである。

collapsed のgetter手順は、thiscollapsed であれば 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"] が DocumentType または Attr ノード であれば、throw して"InvalidNodeTypeError" DOMException を送出する。

  2. this開始 を (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 インターフェイスを実装するオブジェクトは ライブ範囲 と呼ばれます。

ツリーを変更するアルゴリズム(特に 挿入除去移動データ置換分割 アルゴリズム)は、そのツリーに関連付けられたライブ範囲を変更します。

ルートは、ライブ範囲開始ノードルートです。

ノード nodecontained であるとは、ある live range range において、noderootrangeroot と等しく、(node, 0) が rangestart より after であり、(node, nodelength) が rangeend より before である場合をいう。

ノードライブ範囲一部含まれるとは、そのノードがライブ範囲開始ノード包含祖先であり、終了ノードではない場合、またはその逆の場合です。

これらの定義をよりよく理解するための事実:

ライブ範囲の削除前手順は、ノード nodeを与えて:

  1. parentnodeとする。

  2. 検証parentはnullでない。

  3. indexnodeインデックスとする。

  4. nodeを含むライブ範囲のうち、開始ノードがnode包含子孫であるものについては、その開始位置を(parent, index)に設定する。

  5. nodeを含むライブ範囲のうち、終了ノードがnode包含子孫であるものについては、その終了位置を(parent, index)に設定する。

  6. 開始ノードがparentで、開始オフセットがindexより大きいライブ範囲については、開始オフセットを1減らす。

  7. 終了ノードがparentで、終了オフセットがindexより大きいライブ範囲については、終了オフセットを1減らす。


range = new Range()
新しい live range を返す。

new Range() コンストラクタの手順は、 thisstart および end を (current global object関連付けられた Document, 0) に設定することである。


container = range . commonAncestorContainer
range開始ノード終了ノードの両方の 祖先であり、文書から最も遠い ノードを返します。

commonAncestorContainer のgetter手順は次の通り:

  1. containerstart node にする。

  2. containerend nodeinclusive ancestor でなければ、 containercontainerに置き換えて繰り返す。

  3. container を返す。


開始または終了を設定するには、range境界点 (node, offset) に設定する:

  1. もし nodedoctype であれば、throw して "InvalidNodeTypeError" DOMException を送出する。

  2. もし offsetnode長さ より大きければ、throw して "IndexSizeError" DOMException を送出する。

  3. boundaryPoint境界点 (node, offset) とする。

  4. この手順が "set the start" として呼ばれた場合
    1. もし rangerootnoderoot でない、または boundaryPointafter rangeend であれば、rangeendboundaryPoint に設定する。

    2. rangestartboundaryPoint に設定する。

    この手順が "set the end" として呼ばれた場合
    1. もし rangerootnoderoot でない、または boundaryPointbefore rangestart であれば、rangestartboundaryPoint に設定する。

    2. rangeendboundaryPoint に設定する。

setStart(node, offset) メソッドの手順は、set the startthis に対して境界点 (node, offset) で実行すること。

setEnd(node, offset) メソッドの手順は、set the endthis に対して境界点 (node, offset) で実行すること。

setStartBefore(node) メソッドの手順は次の通り:

  1. parentnode とする。

  2. もし parent が null であれば、throw して "InvalidNodeTypeError" DOMException を送出する。

  3. Set the startthis に対して境界点 (parent, nodeindex) で設定する。

setStartAfter(node) メソッドの手順は次の通り:

  1. parentnode とする。

  2. もし parent が null であれば、throw して "InvalidNodeTypeError" DOMException を送出する。

  3. Set the startthis に対して境界点 (parent, nodeindex + 1) で設定する。

setEndBefore(node) メソッドの手順は次の通り:

  1. parentnode とする。

  2. もし parent が null であれば、throw して "InvalidNodeTypeError" DOMException を送出する。

  3. Set the endthis に対して境界点 (parent, nodeindex) で設定する。

setEndAfter(node) メソッドの手順は次の通り:

  1. parentnode とする。

  2. もし parent が null であれば、throw して "InvalidNodeTypeError" DOMException を送出する。

  3. Set the endthis に対して境界点 (parent, nodeindex + 1) で設定する。

collapse(toStart) メソッドの手順は、toStart が true なら endstart に設定し、それ以外なら startend に設定すること。

range range 内の ノード node選択するには:

  1. parentnode とする。

  2. もし parent が null であれば、throw して "InvalidNodeTypeError" DOMException を送出する。

  3. indexnodeindex とする。

  4. rangestart境界点 (parent, index) に設定する。

  5. rangeend境界点 (parent, index + 1) に設定する。

selectNode(node) メソッドの手順は、選択するthis に対して node で実行すること。

selectNodeContents(node) メソッドの手順は次の通り:

  1. もし nodedoctype であれば、throw して "InvalidNodeTypeError" DOMException を送出する。

  2. lengthnode長さ とする。

  3. start境界点 (node, 0) に設定する。

  4. end境界点 (node, length) に設定する。


compareBoundaryPoints(how, sourceRange) メソッドの手順は次のとおりです:

  1. how が以下のいずれでもない場合:

    その場合は throw "NotSupportedError" DOMException を送出する。

  2. thisrootsourceRangeroot と異なる場合は、 throw "WrongDocumentError" DOMException を送出する。

  3. thisPoint および sourcePoint を null に設定する。

  4. how に応じて、次を実行する:

    START_TO_START:

    thisPointthisstart に、 sourcePointsourceRangestart にそれぞれ設定する。

    START_TO_END:

    thisPointthisend に、 sourcePointsourceRangestart に設定する。

    END_TO_END:

    thisPointthisend に、 sourcePointsourceRangeend に設定する。

    END_TO_START:

    thisPointthisstart に、 sourcePointsourceRangeend に設定する。

  5. thisPointsourcePoint関係に基づき、次を実行する:

    before
    −1 を返す。
    equal
    0 を返す。
    after
    1 を返す。

deleteContents()メソッドの手順は次の通り:

  1. this折りたたみ済みの場合は、何もせず戻る。

  2. originalStartNodeoriginalStartOffsetoriginalEndNodeoriginalEndOffsetを、それぞれthis開始ノード開始オフセット終了ノード終了オフセットとする。

  3. originalStartNodeoriginalEndNodeと等しく、かつCharacterDataノードであれば:

    1. Replace dataoriginalStartNodeに対しoriginalStartOffsetoriginalEndOffsetoriginalStartOffset、空文字列で実行する。

    2. 戻る。

  4. nodesToRemoveを、thisに含まれるノード全てのリストとする(ツリー順、親もthisに含まれる場合はその子ノードを除外)。

  5. newNodenewOffsetをnullにする。

  6. originalStartNodeoriginalEndNode包含祖先の場合、newNodeoriginalStartNodeに、newOffsetoriginalStartOffsetに設定する。

  7. そうでなければ:

    1. referenceNodeoriginalStartNodeとする。

    2. referenceNodeがnullでなく、かつoriginalEndNode包含祖先でない場合、referenceNodeをその親に更新する。

    3. newNodereferenceNodeに、newOffsetreferenceNodeインデックス+1に設定する。

      親がnullなら、そのノードはこの範囲のrootなのでこの分岐には到達しない。

  8. originalStartNodeCharacterDataノードなら、replace dataoriginalStartNodeに対し、originalStartOffsetoriginalStartNodelengthoriginalStartOffset、空文字列で実行する。

  9. nodesToRemoveに入っている各nodeに対し、removeを実行する(ツリー順)。

  10. originalEndNodeCharacterDataノードなら、replace dataoriginalEndNodeに対し、0、originalEndOffset、空文字列で実行する。

  11. startendを(newNode, newOffset)に設定する。

ライブ範囲を抽出するには:

  1. fragmentを新しいDocumentFragmentノードrangestart nodenode document)とする。

  2. range折りたたみ済みならfragmentを返す。

  3. originalStartNodeoriginalStartOffsetoriginalEndNodeoriginalEndOffsetrangestart nodestart offsetend nodeend offsetとする。

  4. originalStartNodeoriginalEndNodeと等しく、かつCharacterDataノードの場合:

    1. cloneoriginalStartNodecloneとする。

    2. clonedatasubstringing dataoriginalStartOffset, originalEndOffsetoriginalStartOffset)で設定する。

    3. appendclonefragmentに追加する。

    4. replace dataoriginalStartNodeに対しoriginalStartOffsetoriginalEndOffsetoriginalStartOffset、空文字列で実行。

    5. 戻り値はfragment
  5. commonAncestororiginalStartNodeとする。

  6. commonAncestororiginalEndNodeinclusive ancestorでない限り、親ノードへ進める。

  7. firstPartiallyContainedChildをnullにする。

  8. originalStartNodeoriginalEndNodeinclusive ancestorでなければ、commonAncestorの最初のpartially containedな子をセット。

  9. lastPartiallyContainedChildをnullにする。

  10. originalEndNodeoriginalStartNodeinclusive ancestorでなければ、commonAncestorの最後のpartially containedな子をセット。

    この2つの変数は必ず意味がある値になる。2つとも存在するときは値は異なる。

  11. containedChildrencommonAncestorのうちrangecontainedである全てのリスト(ツリー順)とする。

  12. containedChildrendoctypeが含まれていたら、"HierarchyRequestError" DOMExceptionを投げる。

    境界子や一部含むノードでdocttypeは問題にならない。doctypeは範囲境界にも部分含まれにもなれないため。

  13. newNodenewOffsetをnullにする。

  14. originalStartNodeoriginalEndNodeinclusive ancestorならnewNodeoriginalStartNodenewOffsetoriginalStartOffset

  15. そうでなければ:

    1. referenceNodeoriginalStartNodeにする。

    2. referenceNodeがnullでなく、かつoriginalEndNodeinclusive ancestorでない間、親に進める。

    3. newNodereferenceNodeに、newOffsetreferenceNodeindex+1にする。

      親がnullの場合はこの分岐に到達しない。

  16. firstPartiallyContainedChildCharacterDataノードなら:

    この場合、firstPartiallyContainedChildoriginalStartNode

    1. cloneoriginalStartNodecloneとする。

    2. clonedatasubstringing dataoriginalStartOffset, originalStartNodelengthoriginalStartOffset)でセットする。

    3. appendclonefragmentに追加。

    4. replace dataoriginalStartNodeに対し、originalStartOffsetoriginalStartNodelengthoriginalStartOffset、空文字列で実行。

  17. それ以外でfirstPartiallyContainedChildがnullでなければ:

    1. clonefirstPartiallyContainedChildcloneとする。

    2. appendclonefragmentに追加。

    3. subrangeを新しいライブ範囲とし、startを(originalStartNode, originalStartOffset)、endを(firstPartiallyContainedChild, firstPartiallyContainedChildlength)にする。

    4. subfragmentsubrangeextracting結果とし、appendsubfragmentcloneに追加する。

  18. containedChildrenの各contained childについて、appendfragmentへ追加する。

  19. lastPartiallyContainedChildCharacterDataノードなら:

    この場合、lastPartiallyContainedChildoriginalEndNode

    1. cloneoriginalEndNodecloneとする。

    2. clonedatasubstringing data(0, originalEndOffset)で設定。

    3. appendclonefragmentへ追加。

    4. replace dataoriginalEndNodeに対し0、originalEndOffset、空文字列で実行。

  20. それ以外でlastPartiallyContainedChildがnullでなければ:

    1. clonelastPartiallyContainedChildcloneとする。

    2. appendclonefragmentへ追加。

    3. subrangeを新しいライブ範囲にして、startを(lastPartiallyContainedChild, 0)、endを(originalEndNode, originalEndOffset)にする。

    4. subfragmentsubrangeextracting結果とする。

    5. appendsubfragmentcloneへ追加。

  21. rangestartendを(newNode, newOffset)に設定。

  22. fragmentを返す。

extractContents() メソッドの手順は extracting this の結果を返すことである。

ライブ範囲 range内容を複製するには:

  1. fragment を新しい DocumentFragmentノードrange開始ノードノード文書)として作成する。

  2. range折りたたみ済みならfragmentを返す。

  3. originalStartNodeoriginalStartOffsetoriginalEndNodeoriginalEndOffsetrange開始ノード開始オフセット終了ノード終了オフセットとする。

  4. originalStartNodeoriginalEndNode が同じで、かつ CharacterDataノードなら:

    1. cloneoriginalStartNodeクローンとする。

    2. clonedataに、部分文字列originalStartOffset, originalEndOffsetoriginalStartOffset)で結果を設定する。

    3. appendclonefragmentに追加する。

    4. fragmentを返す。

  5. commonAncestororiginalStartNodeとする。

  6. commonAncestororiginalEndNode包含祖先でない間、親に進める。

  7. firstPartiallyContainedChildをnullとする。

  8. originalStartNodeoriginalEndNode包含祖先でない場合、commonAncestorの最初の一部含まれる子をfirstPartiallyContainedChildとする。

  9. lastPartiallyContainedChildをnullとする。

  10. originalEndNodeoriginalStartNode包含祖先でない場合、commonAncestorの最後の一部含まれる子をlastPartiallyContainedChildとする。

    この変数代入は常に意味がある。例えばoriginalStartNodeoriginalEndNodeの包含祖先でなければ、originalStartNode自身やその祖先も範囲に一部含まれることになり、両方定義される場合は異なる値になる。

  11. containedChildrencommonAncestorのうちrange完全に含まれるすべてのリスト(ツリー順)とする。

  12. containedChildrenの中にdoctypeがあれば、"HierarchyRequestError" DOMExceptionを投げる。

    最初や最後の一部含まれるノードは気にしなくて良い。doctypeは部分含まれることも境界点にもなれないため。

  13. firstPartiallyContainedChildCharacterDataノードの場合:

    この場合、firstPartiallyContainedChildoriginalStartNode

    1. cloneoriginalStartNodeクローンとする。

    2. clonedata部分文字列originalStartOffset, originalStartNode長さoriginalStartOffset)で設定する。

    3. appendclonefragmentに追加する。

  14. それ以外でfirstPartiallyContainedChildがnullでなければ:

    1. clonefirstPartiallyContainedChildクローンとする。

    2. appendclonefragmentに追加する。

    3. subrange を新しい ライブ範囲開始は (originalStartNode, originalStartOffset)、終了は (firstPartiallyContainedChild, firstPartiallyContainedChild長さ) )とする。

    4. subfragmentsubrange内容の複製結果として取得する。

    5. appendsubfragmentcloneに追加。

  15. containedChildrenの各contained childについて:

    1. clonecontained childクローンサブツリーをtrueに)とする。

    2. appendclonefragmentに追加する。

  16. lastPartiallyContainedChildCharacterDataノードの場合:

    この場合、lastPartiallyContainedChildoriginalEndNode

    1. cloneoriginalEndNodeクローンとする。

    2. clonedata部分文字列(0, originalEndOffset)で設定。

    3. appendclonefragmentに追加する。

  17. それ以外でlastPartiallyContainedChildがnullでなければ:

    1. clonelastPartiallyContainedChildクローンとする。

    2. appendclonefragmentに追加する。

    3. subrangeを新しいライブ範囲開始は(lastPartiallyContainedChild, 0)、終了は(originalEndNode, originalEndOffset))とする。

    4. subfragmentsubrange内容の複製結果として取得する。

    5. appendsubfragmentcloneに追加。

  18. fragmentを返す。

cloneContents()メソッドの手順は、内容の複製thisで呼び出した結果を返します。

ライブ範囲 rangeノード node挿入するには:

  1. range開始ノードProcessingInstruction または CommentノードTextノードで親がnull、またはnode自身の場合、"HierarchyRequestError" DOMExceptionを投げる。

  2. referenceNodeをnullとする。

  3. range開始ノードTextノードなら、referenceNodeにそのTextノードを代入。

  4. そうでない場合、referenceNoderange開始ノードインデックスrange開始オフセットであるもの、なければnull)とする。

  5. parentを、referenceNodeがnullならrange開始ノード、そうでなければreferenceNodeとする。

  6. 事前挿入の妥当性nodeparentreferenceNodeで確保する。

  7. range開始ノードTextノードなら、referenceNodeをそれをrange開始オフセットで分割した結果に更新。

  8. nodereferenceNodeなら、referenceNodeをその次兄弟に更新。

  9. nodeがnullでなければ、removenodeを削除。

  10. newOffsetreferenceNodeがnullならparent長さ、そうでなければreferenceNodeインデックスに設定。

  11. nodeDocumentFragmentノードなら、newOffsetnode長さ増やす。そうでなければ1増やす。

  12. pre-insertnodeparentreferenceNodeの前へ挿入。

  13. range折りたたみ済みなら、range終了を(parent, newOffset)にする。

insertNode(node) メソッドの手順は insert nodethis に挿入することである。

surroundContents(newParent) メソッドの手順:

  1. Textノード一部含まれる状態で thisに存在する場合、「InvalidStateErrorDOMExceptionを投げる。

  2. newParentDocumentDocumentType、またはDocumentFragmentノードの場合、「InvalidNodeTypeErrorDOMExceptionを投げる。

    歴史的な理由でCharacterDataノードはここでチェックされず、後の副作用で例外が投げられる。

  3. fragmentextractingthisから取得する。

  4. newParentが存在する場合、replace allで中身をnullにする。

  5. InsertnewParentthisに挿入する。

  6. appendfragmentnewParentに追加する。

  7. selectnewParentthis内に選択する。

cloneRange() メソッドの手順は新しい live range を生成し、 start および endthis と同じに設定して返すこと。

detach() メソッドの手順は何もしない。 この機能(Range オブジェクトを無効化する)は削除されたが、 互換性のためにメソッド自体は残されている。


position = range . comparePoint(node, offset)
点が範囲の前にあれば −1、範囲内にあれば 0、範囲の後にあれば 1 を返します。
intersects = range . intersectsNode(node)
rangenode と交差するかどうかを返します。

isPointInRange(node, offset) メソッドの手順は次の通り:

  1. noderootthisroot と異なる場合、false を返す。

  2. nodedoctype の場合、throw "InvalidNodeTypeError" DOMException を送出する。

  3. offsetnodelength より大きい場合、throw "IndexSizeError" DOMException を送出する。

  4. (node, offset) が start より前、または end の後であれば、false を返す。

  5. true を返す。

comparePoint(node, offset) メソッドの手順は次の通り:

  1. noderootthisroot と異なる場合、throw "WrongDocumentError" DOMException を送出する。

  2. nodedoctype の場合、throw "InvalidNodeTypeError" DOMException を送出する。

  3. offsetnodelength より大きい場合、throw "IndexSizeError" DOMException を送出する。

  4. (node, offset) が start より前なら −1 を返す。

  5. (node, offset) が end の後なら 1 を返す。

  6. 0 を返す。


intersectsNode(node) メソッドの手順は次の通り:

  1. noderootthisroot と異なる場合、false を返す。

  2. parentnodeparent に設定する。

  3. parent が null の場合、true を返す。

  4. offsetnodeindex に設定する。

  5. (parent, offset) が end より前 かつ (parent, offset + 1) が start の後である場合、true を返す。

  6. false を返す。


stringification behavior は以下の手順を実行する:

  1. string を空文字列で初期化する。

  2. this開始ノードthis終了ノードと同じで、かつそれがTextノードなら、そのTextノードdatathis開始オフセットからthis終了オフセットまでの部分文字列を返す。

  3. this開始ノードTextノードなら、そのノードdatathis開始オフセットから末尾までの部分文字列をstringに追加する。

  4. 連結した、dataTextノードthisに含まれるもの)をツリー順stringに追加する。

  5. this終了ノードTextノードであれば、そのノードdataの先頭からthis終了オフセットまでの部分文字列をstringに追加する。

  6. stringを返す。


createContextualFragment()getClientRects()getBoundingClientRect() メソッドは他の仕様で定義されている。 [DOM-Parsing] [CSSOM-VIEW]

6. 走査

NodeIteratorおよびTreeWalkerオブジェクトは、ノードツリーのフィルタリングや走査に利用できます。

NodeIteratorおよびTreeWalkerオブジェクトは、再帰呼び出しを防ぐための関連ブール型is activeを持ちます。初期値はfalseです。

NodeIteratorTreeWalkerオブジェクトには、rootノード)、whatToShow(ビットマスク)、およびfilter(コールバック)が関連付けられています。

フィルターするには、ノードnodeを、NodeIteratorまたはTreeWalkerオブジェクトtraverserで:

  1. traverseris activeがtrueの場合、"InvalidStateError"DOMExceptionを投げる。

  2. nnodenodeType属性値−1とする。

  3. traverserwhatToShownビット(0が最下位ビット)がセットされていなければ、FILTER_SKIPを返す。

  4. traverserfilterがnullなら、FILTER_ACCEPTを返す。

  5. traverseris activeをtrueに設定する。

  6. resultを、ユーザーオブジェクトの操作を呼び出すtraverserfilter、"acceptNode"、« node »)の戻り値として取得する。これで例外が発生した場合は、traverseris activeをfalseにして、その例外を再スローする。

  7. traverseris activeをfalseに設定する。

  8. resultを返す。

6.1. インターフェイス NodeIterator

[Exposed=Window]
interface NodeIterator {
  [SameObject] readonly attribute Node root;
  readonly attribute Node referenceNode;
  readonly attribute boolean pointerBeforeReferenceNode;
  readonly attribute unsigned long whatToShow;
  readonly attribute NodeFilter? filter;

  Node? nextNode();
  Node? previousNode();

  undefined detach();
};

NodeIterator オブジェクトは Document オブジェクトの createNodeIterator() メソッドで生成できます。

NodeIterator オブジェクトは、関連する iterator collection を持ちます。これは NodeIterator オブジェクトの root を根とした コレクションで、フィルターは任意のノードに一致します。

NodeIterator オブジェクトは、関連する referenceノード)と pointer before reference(ブール値)も持ちます。

前述の通り、NodeIterator オブジェクトには is activerootwhatToShowfilter も関連付けられています。

NodeIterator pre-remove steps は、NodeIterator オブジェクト nodeIteratorノード toBeRemovedNode を与えると:

  1. toBeRemovedNodenodeIteratorreference包含祖先でない、または toBeRemovedNodenodeIteratorroot である場合、return。

  2. nodeIteratorpointer before reference が true の場合:

    1. nexttoBeRemovedNodefollowing のうち、nodeIteratorroot包含子孫であり、かつ toBeRemovedNode包含子孫でないものの先頭(あればそのノード、なければ null)とする。

    2. next が null でなければ nodeIteratorreferencenext に設定して return。

    3. nodeIteratorpointer before reference を false に設定。

  3. nodeIteratorreferencetoBeRemovedNodeparent(もし toBeRemovedNodeprevious sibling が null なら)あるいは toBeRemovedNodeprevious sibling包含子孫で、ツリー順で最後に現れるものに設定する。


root のgetter手順は、thisroot を返すことです。

referenceNode のgetter手順は、thisreference を返すことです。

pointerBeforeReferenceNode のgetter手順は、thispointer before reference を返すことです。

whatToShow のgetter手順は、thiswhatToShow を返すことです。

filter のgetter手順は、thisfilter を返すことです。

traverse は、NodeIterator オブジェクト iterator と "next" または "previous" type を受け取る:

  1. nodeiteratorreference とする。

  2. beforeNodeiteratorpointer before reference とする。

  3. 以下を繰り返す:

    1. typenext の場合:

      1. beforeNode が false なら nodeiteratoriterator collection 内で node の最初の following ノードに設定する。なければ return null。

      2. beforeNode が true なら false にする。

    2. そうでなければ:

      1. beforeNode が true なら nodeiteratoriterator collection 内で node の最初の preceding ノードに設定する。なければ return null。

      2. beforeNode が false なら true にする。

    3. resultfiltering (nodeiterator) の結果とする。

    4. resultFILTER_ACCEPT の場合 break

  4. iteratorreferencenode に設定する。

  5. iteratorpointer before referencebeforeNode に設定する。

  6. node を返す。

nextNode() の手順は、traversethis と "next" で呼び出した結果を返すことです。

previousNode() の手順は、traversethis と "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 オブジェクトは、関連付けられた currentノード)を持ちます。

前述の通り、TreeWalker オブジェクトには、 root, whatToShow, filter も関連付けられています。

root の getter 手順は、 thisroot を返すこと。

whatToShow の getter 手順は、 thiswhatToShow を返すこと。

filter の getter 手順は、 thisfilter を返すこと。

currentNode の getter 手順は、 thiscurrent を返すこと。

currentNode の setter 手順は、thiscurrent に与えられた値を設定すること。


parentNode() メソッドの手順は次の通り:

  1. nodethiscurrent とする。

  2. node が null でなく、かつ thisroot でない間、繰り返す:

    1. nodenodeparent に設定する。

    2. もし node が null でなく、filteringnodethis 内で評価して FILTER_ACCEPT となった場合、 thiscurrentnode に設定し node を返す。

  3. null を返す。

traverse children は、TreeWalker オブジェクト walker と "first" または "last" type を与えて実行する:

  1. nodewalkercurrent とする。

  2. もし type が "first" なら nodenodefirst child に、そうでなければ last child に設定する。

  3. node が null でない間、次の手順を繰り返す:

    1. resultfilteringwalker 内の node を評価した結果とする。

    2. もし resultFILTER_ACCEPT なら、walkercurrentnode を設定し、node を返す。

    3. もし resultFILTER_SKIP なら:

      1. もし type が "first" なら childnodefirst child に、そうでなければ last child に設定する。

      2. child が null でなければ、nodechild に設定して continue する。

    4. 次の間、node が null でない間、繰り返す:

      1. もし type が "first" なら siblingnodenext sibling に、そうでなければ previous sibling に設定する。

      2. sibling が null でなければ、nodesibling に設定し break する。

      3. parentnodeparent に設定する。

      4. もし parent が null または walkerroot または walkercurrent であれば null を返す。

      5. nodeparent に設定する。

  4. null を返す。

firstChild() メソッド手順は、 traverse childrenthis と "first" で実行すること。

lastChild() メソッド手順は、 traverse childrenthis と "last" で実行すること。

traverse siblings は、 TreeWalker オブジェクト walker および "next" または "previous" type を与えて実行する:

  1. nodewalkercurrent とする。

  2. noderoot であれば null を返す。

  3. while true:

    1. もし type が "next" なら siblingnodenext sibling に、そうでなければ previous sibling に設定する。

    2. sibling が null でない間、次を繰り返す:

      1. nodesibling に設定する。

      2. resultfilteringwalker 内の node を評価した結果とする。

      3. もし resultFILTER_ACCEPT なら、walkercurrentnode を設定し node を返す。

      4. もし type が "next" なら siblingnodefirst child に、そうでなければ last child に設定する。

      5. もし resultFILTER_REJECT または sibling が null ならば、 siblingtype が "next" なら nodenext sibling に、そうでなければ previous sibling に設定する。

    3. nodenodeparent に設定する。

    4. node が null または walkerroot であれば null を返す。

    5. filteringwalker 内の node を評価した結果が FILTER_ACCEPT なら null を返す。

nextSibling() メソッド手順は、 traverse siblingsthis と "next" で実行すること。

previousSibling() メソッド手順は、 traverse siblingsthis と "previous" で実行すること。

previousNode() メソッドの手順は次の通り:

  1. nodethiscurrent とする。

  2. nodethisroot でない間、繰り返す:

    1. siblingnodeprevious sibling に設定する。

    2. sibling が null でない間、繰り返す:

      1. nodesibling に設定する。

      2. resultfilteringthis 内の node を評価した結果とする。

      3. 次の間、 resultFILTER_REJECT でなく、かつ nodeをもつ間、繰り返す:

        1. nodenodelast child に設定する。

        2. resultfilteringthis 内で node を評価した結果に設定する。

      4. もし resultFILTER_ACCEPT であれば、 thiscurrentnode を設定し、 node を返す。

      5. siblingnodeprevious sibling に設定する。

    3. nodethisroot または nodeparent が null であれば null を返す。

    4. nodenodeparent に設定する。

    5. filteringthis 内の node を評価した結果が FILTER_ACCEPT の場合、thiscurrentnode に設定し、node を返す。

  3. null を返す。

nextNode() メソッドの手順は次の通り:

  1. nodethiscurrent とする。

  2. resultFILTER_ACCEPT に設定する。

  3. while true:

    1. resultFILTER_REJECT でなく、かつ node を持つあいだ:

      1. nodenodefirst child に設定する。

      2. resultfilteringthis 内の node を評価した結果に設定する。

      3. もし resultFILTER_ACCEPT であれば、thiscurrentnode を設定し node を返す。

    2. sibling を null に設定する。

    3. temporarynode に設定する。

    4. temporary が null でない間、次を繰り返す:

      1. もし temporarythisroot であれば null を返す。

      2. siblingtemporarynext sibling に設定する。

      3. sibling が null でなければ、nodesibling に設定し break する。

      4. temporarytemporaryparent に設定する。

    5. resultfilteringthis 内の node を評価した結果に設定する。

    6. もし resultFILTER_ACCEPT であれば、thiscurrentnode を設定し node を返す。

6.3. インターフェイス NodeFilter

[Exposed=Window]
callback interface NodeFilter {
  // Constants for acceptNode()
  const unsigned short FILTER_ACCEPT = 1;
  const unsigned short FILTER_REJECT = 2;
  const unsigned short FILTER_SKIP = 3;

  // Constants for whatToShow
  const unsigned long SHOW_ALL = 0xFFFFFFFF;
  const unsigned long SHOW_ELEMENT = 0x1;
  const unsigned long SHOW_ATTRIBUTE = 0x2;
  const unsigned long SHOW_TEXT = 0x4;
  const unsigned long SHOW_CDATA_SECTION = 0x8;
  const unsigned long SHOW_ENTITY_REFERENCE = 0x10; // legacy
  const unsigned long SHOW_ENTITY = 0x20; // legacy
  const unsigned long SHOW_PROCESSING_INSTRUCTION = 0x40;
  const unsigned long SHOW_COMMENT = 0x80;
  const unsigned long SHOW_DOCUMENT = 0x100;
  const unsigned long SHOW_DOCUMENT_TYPE = 0x200;
  const unsigned long SHOW_DOCUMENT_FRAGMENT = 0x400;
  const unsigned long SHOW_NOTATION = 0x800; // legacy

  unsigned short acceptNode(Node node);
};

NodeFilter オブジェクトは、filterとして NodeIteratorTreeWalker オブジェクトで利用でき、さらに whatToShow ビットマスク用の定数も提供します。NodeFilter オブジェクトは通常、JavaScript関数として実装されます。

以下の定数はfilterの戻り値として利用できます:

以下の定数は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 オブジェクトには、関連付けられた token set集合)があり、これは初期状態では空です。

DOMTokenList オブジェクトには、関連付けられたelement要素)と、attribute name属性ローカル名)も持ちます。

仕様によって、 supported tokensが、DOMTokenListelementattribute nameに定義される場合があります。

DOMTokenList オブジェクトの setvalidation steps は、指定された token に対して次の通りです:

  1. もし setelementattribute namesupported tokensを定義していない場合は、 TypeError をスローします。

  2. lowercaseTokentokenASCII小文字に変換します。

  3. もし lowercaseTokensupported tokenssetelementattribute name 内に存在する場合は true を返します。

  4. false を返します。

DOMTokenList オブジェクト setupdate steps は次の通りです:

  1. もし 名前空間およびローカル名で属性を取得 を null, setattribute name, および setelementを指定して実行するとnullを返し、さらに settoken set が空の場合、何も行わずに終了します。

  2. 属性値を設定 を、setelementsetattribute name、および ordered set serializersettoken set で実行した結果で呼び出します。

DOMTokenList オブジェクト setserialize steps は、次の通りです: 属性値を取得setelementsetattribute name を指定して実行した結果を返します。


DOMTokenList オブジェクト set に対する attribute change steps は、 setelement に対して以下の通りです:

  1. もし localNamesetattribute namenamespace が null、かつ value が null の場合は token setにします。

  2. それ以外の場合で、localNamesetattribute name かつ namespace が null の場合は、 settoken set を、 valueparsed した結果に設定します。

DOMTokenList オブジェクト set を作成したとき:

  1. elementsetelement とします。

  2. attributeNamesetattribute name とします。

  3. value を、 属性値を取得elementattributeName で実行した結果とします。

  4. attribute change stepselement, attributeNamevalue, value, 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() と同じ)、false なら削除します(remove() と同じ)。

token が存在していれば true、そうでなければ false を返します。

token が空文字列なら "SyntaxError" DOMException を投げます。

token に空白が含まれていれば "InvalidCharacterError" DOMException を投げます。

tokenlist . replace(token, newToken)

tokennewToken で置き換えます。

tokennewToken で置換された場合は true、それ以外は false を返します。

どちらかの引数が空文字列なら "SyntaxError" DOMException を投げます。

どちらかの引数に ASCII空白 が含まれていれば "InvalidCharacterError" DOMException を投げます。

tokenlist . supports(token)

token が関連付けられた属性のサポートされるトークンに含まれる場合は true、そうでなければ false を返します。

関連付けられた属性にサポートされるトークンが定義されていない場合は TypeError を投げます。

tokenlist . value

関連付けられた集合を文字列で返します。

セットも可能で、関連付けられた属性を変更できます。

length のゲッター手順は、thisトークン集合サイズ を返すこと。

このオブジェクトの サポートされるプロパティインデックス は、ゼロからオブジェクトの トークン集合サイズ − 1 までの数です。ただし、トークン集合 の場合、サポートされるプロパティインデックスはありません。

item(index) メソッドの手順:

  1. indexthisトークン集合サイズ 以上なら、null を返す。

  2. thisトークン集合[index] を返す。

contains(token)メソッドの手順は、thistoken set[token]が存在するならtrueを、そうでなければfalseを返します。

add(tokens…)メソッドの手順は以下の通りです:

  1. tokenstokenについて:

    1. tokenが空文字列の場合、"SyntaxError"例外DOMExceptionをスローします。

    2. tokenASCIIホワイトスペースを含む場合、"InvalidCharacterError"例外DOMExceptionをスローします。

  2. tokenstokenについて、token setに追加します。

  3. update stepsを実行します。

remove(tokens…)メソッドの手順は以下の通りです:

  1. tokenstokenについて:

    1. tokenが空文字列の場合、"SyntaxError"例外DOMExceptionをスローします。

    2. tokenASCIIホワイトスペースを含む場合、"InvalidCharacterError"例外DOMExceptionをスローします。

  2. tokensの各tokenについて、thistoken setからtokenを削除します。

  3. update stepsを実行します。

toggle(token, force)メソッドの手順は以下の通りです:

  1. tokenが空文字列の場合、"SyntaxError"例外DOMExceptionをスローします。

  2. tokenASCIIホワイトスペースを含む場合、"InvalidCharacterError"例外DOMExceptionをスローします。

  3. thistoken set[token]が存在する場合:

    1. forceが指定されていないか、falseの場合、token setから削除し、update stepsを実行し、falseを返します。

    2. trueを返します。

  4. それ以外の場合、forceが未指定またはtrueの場合、token setにtokenを追加し、update stepsを実行し、trueを返します。

  5. falseを返します。

toggle()に関しては、Web互換性のためupdate stepsが常に実行されるとは限りません。

replace(token, newToken)メソッドの手順は以下の通りです:

  1. tokenまたはnewTokenのいずれかが空文字列の場合、"SyntaxError"例外DOMExceptionをスローします。

  2. tokenまたはnewTokenのいずれかがASCIIホワイトスペースを含む場合、"InvalidCharacterError"例外DOMExceptionをスローします。

  3. thistoken settoken含まない場合、falseを返します。

  4. tokenを置換し、tokenthistoken set内でnewTokenに置き換えます。

  5. update stepsを実行します。

  6. trueを返します。

replace()に関しては、Web互換性のためupdate stepsが常に実行されるとは限りません。

supports(token)メソッドの手順は以下の通りです:

  1. resultを、validation stepstokenで呼び出した戻り値とします。

  2. resultを返します。

valueのgetter手順は、thisserialize stepsを実行した結果を返すことです。

valueのsetter手順は、属性値を設定thiselementに対して、thisattribute nameと与えられた値で行うことです。

8. XPath

DOM Level 3 XPathXPath 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;

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、 Evgeny Kapun、 François Daoust、 François Remy、 Gary Kacmarcik、 Gavin Nicol、 Giorgio Liscio、 Glen Huang、 Glenn Adams、 Glenn Maynard、 Hajime Morrita、 Harald Alvestrand、 Hayato Ito、 Henri Sivonen、 Hongchan Choi、 Hunan Rostomyan、 Ian Hickson、 Igor Bukanov、 Jacob Rossi、 Jake Archibald、 Jake Verbaten、 James Graham、 James Greene、 James M Snell、 James Robinson、 Jayson Chen、 Jeffrey Yasskin、 Jens Lindström、 Jeremy Davis、 Jesse McCarthy、 Jinho Bang、 João Eiras、 Joe Kesselman、 John Atkins、 John Dai、 Jonas Sicking、 Jonathan Kingston、 Jonathan Robie、 Joris van der Wel、 Joshua Bell、 J. S. Choi、 Jungkee Song、 Justin Summerlin、 Kagami Sascha Rosylight、 呂康豪 (Kang-Hao Lu)、 田村健人 (Kent TAMURA)、 Kevin J. Sung、 Kevin Sweeney、 Kirill Topolyan、 Koji Ishii、 Lachlan Hunt、 Lauren Wood、 Luca Casonato、 Luke Zielinski、 Magne Andersson、 Majid Valipour、 Malte Ubl、 Manish Goregaokar、 Manish Tripathi、 Marcos Caceres、 Mark Miller、 Martijn van der Ven、 Mason Freed、 Mats Palmgren、 Mounir Lamouri、 Michael Stramel、 Michael™ Smith、 Mike Champion、 Mike Taylor、 Mike West、 Nicolás Peña Moreno、 Nidhi Jaju、 Ojan Vafai、 Oliver Nightingale、 Olli Pettay、 Ondřej Žára、 Peter Sharpe、 Philip Jägenstedt、 Philippe Le Hégaret、 Piers Wombwell、 Pierre-Marie Dartus、 prosody—Gab Vereable Context(、 Rafael Weinstein、 Rakina Zata Amni、 Richard Bradshaw、 Rick Byers、 Rick Waldron、 Robbert Broersma、 Robin Berjon、 Roland Steiner、 Rune F. Halvorsen、 Russell Bicknell、 Ruud Steltenpool、 Ryosuke Niwa、 Sam Dutton、 Sam Sneddon、 Samuel Giles、 Sanket Joshi、 Scott Haseley、 Sebastian Mayr、 Seo Sanghyeon、 Sergey G. Grekhov、 Shiki Okasaka、 Shinya Kawanaka、 Simon Pieters、 Simon Wülker、 Stef Busking、 Steve Byrne、 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) の多大な貢献を受けています。

知的財産権

custom 要素に関連する統合ポイントのリビジョン履歴の一部は w3c/webcomponents リポジトリで確認でき、 W3C Software and Document Licenseのもとで利用可能です。

Copyright © WHATWG (Apple, Google, Mozilla, Microsoft)。この作品は クリエイティブ・コモンズ 表示 4.0 国際ライセンス の下でライセンスされています。ソースコードに組み込まれている部分については、BSD 3-Clause License の下でライセンスされます。

これはリビングスタンダードです。特許レビュー版に関心がある方は Living Standard Review Draft をご覧ください。

索引

本仕様で定義されている用語

参照によって定義される用語

参考文献

規範的参照

[CONSOLE]
Dominic Farolino; Robert Kowalski; Terin Stock. コンソール標準. Living Standard. URL: https://console.spec.whatwg.org/
[DEVICE-ORIENTATION]
Reilly Grant; Marcos Caceres. デバイスの向きと動き. URL: https://w3c.github.io/deviceorientation/
[ECMASCRIPT]
ECMAScript言語仕様. URL: https://tc39.es/ecma262/multipage/
[ENCODING]
Anne van Kesteren. エンコーディング標準. Living Standard. URL: https://encoding.spec.whatwg.org/
[HR-TIME-3]
Yoav Weiss. 高分解能タイム. URL: https://w3c.github.io/hr-time/
[HTML]
Anne van Kesteren; et al. HTML標準. 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.. セレクターズレベル4. URL: https://drafts.csswg.org/selectors/
[SERVICE-WORKERS]
Monica CHINTALA; Yoshisato Yanagisawa. Service Workers Nightly. URL: https://w3c.github.io/ServiceWorker/
[TOUCH-EVENTS]
Doug Schepers; et al. タッチイベント. URL: https://w3c.github.io/touch-events/
[TRUSTED-TYPES]
Krzysztof Kotowicz. Trusted Types. URL: https://w3c.github.io/trusted-types/dist/spec/
[UIEVENTS]
Gary Kacmarcik; Travis Leithead. UIイベント. URL: https://w3c.github.io/uievents/
[URL]
Anne van Kesteren. URL標準. Living Standard. URL: https://url.spec.whatwg.org/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL標準. Living Standard. URL: https://webidl.spec.whatwg.org/
[XML]
Tim Bray; et al. 拡張可能なマークアップ言語 (XML) 1.0(第五版). 2008年11月26日. REC. URL: https://www.w3.org/TR/xml/
[XML-NAMES]
Tim Bray; et al. XML 1.0 内の名前空間(第三版). 2009年12月8日. REC. URL: https://www.w3.org/TR/xml-names/

参考情報

[CSSOM-VIEW]
Simon Fraser; Emilio Cobos Álvarez. CSSOM ビューモジュール. URL: https://drafts.csswg.org/cssom-view/
[DOM-Level-3-XPath]
Ray Whitmer. ドキュメントオブジェクトモデル (DOM) レベル3 XPath仕様. 2020年11月3日. NOTE. URL: https://www.w3.org/TR/DOM-Level-3-XPath/
[DOM-Parsing]
Travis Leithead. DOMパースおよびシリアライズ. URL: https://w3c.github.io/DOM-Parsing/
[FULLSCREEN]
Philip Jägenstedt. フルスクリーンAPI標準. Living Standard. URL: https://fullscreen.spec.whatwg.org/
[INDEXEDDB]
Nikunj Mehta; et al. インデックス付きデータベースAPI. URL: https://w3c.github.io/IndexedDB/
[XPath]
James Clark; Steven DeRose. XMLパス言語 (XPath) バージョン1.0. 1999年11月16日. REC. URL: https://www.w3.org/TR/xpath-10/
[XSLT]
James Clark. XSL変換 (XSLT) バージョン1.0. 1999年11月16日. REC. URL: https://www.w3.org/TR/xslt-10/

IDL 索引

[Exposed=*]
interface Event {
  constructor(DOMString type, optional EventInit eventInitDict = {});

  readonly attribute DOMString type;
  readonly attribute EventTarget? target;
  readonly attribute EventTarget? srcElement; // legacy
  readonly attribute EventTarget? currentTarget;
  sequence<EventTarget> composedPath();

  const unsigned short NONE = 0;
  const unsigned short CAPTURING_PHASE = 1;
  const unsigned short AT_TARGET = 2;
  const unsigned short BUBBLING_PHASE = 3;
  readonly attribute unsigned short eventPhase;

  undefined stopPropagation();
           attribute boolean cancelBubble; // legacy alias of .stopPropagation()
  undefined stopImmediatePropagation();

  readonly attribute boolean bubbles;
  readonly attribute boolean cancelable;
           attribute boolean returnValue;  // legacy
  undefined preventDefault();
  readonly attribute boolean defaultPrevented;
  readonly attribute boolean composed;

  [LegacyUnforgeable] readonly attribute boolean isTrusted;
  readonly attribute DOMHighResTimeStamp timeStamp;

  undefined initEvent(DOMString type, optional boolean bubbles = false, optional boolean cancelable = false); // legacy
};

dictionary EventInit {
  boolean bubbles = false;
  boolean cancelable = false;
  boolean composed = false;
};

partial interface Window {
  [Replaceable] readonly attribute (Event or undefined) event; // legacy
};

[Exposed=*]
interface CustomEvent : Event {
  constructor(DOMString type, optional CustomEventInit eventInitDict = {});

  readonly attribute any detail;

  undefined initCustomEvent(DOMString type, optional boolean bubbles = false, optional boolean cancelable = false, optional any detail = null); // legacy
};

dictionary CustomEventInit : EventInit {
  any detail = null;
};

[Exposed=*]
interface EventTarget {
  constructor();

  undefined addEventListener(DOMString type, EventListener? callback, optional (AddEventListenerOptions or boolean) options = {});
  undefined removeEventListener(DOMString type, EventListener? callback, optional (EventListenerOptions or boolean) options = {});
  boolean dispatchEvent(Event event);
};

callback interface EventListener {
  undefined handleEvent(Event event);
};

dictionary EventListenerOptions {
  boolean capture = false;
};

dictionary AddEventListenerOptions : EventListenerOptions {
  boolean passive;
  boolean once = false;
  AbortSignal signal;
};

[Exposed=*]
interface AbortController {
  constructor();

  [SameObject] readonly attribute AbortSignal signal;

  undefined abort(optional any reason);
};

[Exposed=*]
interface AbortSignal : EventTarget {
  [NewObject] static AbortSignal abort(optional any reason);
  [Exposed=(Window,Worker), NewObject] static AbortSignal timeout([EnforceRange] unsigned long long milliseconds);
  [NewObject] static AbortSignal _any(sequence<AbortSignal> signals);

  readonly attribute boolean aborted;
  readonly attribute any reason;
  undefined throwIfAborted();

  attribute EventHandler onabort;
};
interface mixin NonElementParentNode {
  Element? getElementById(DOMString elementId);
};
Document includes NonElementParentNode;
DocumentFragment includes NonElementParentNode;

interface mixin DocumentOrShadowRoot {
  readonly attribute CustomElementRegistry? customElementRegistry;
};
Document includes DocumentOrShadowRoot;
ShadowRoot includes DocumentOrShadowRoot;

interface mixin ParentNode {
  [SameObject] readonly attribute HTMLCollection children;
  readonly attribute Element? firstElementChild;
  readonly attribute Element? lastElementChild;
  readonly attribute unsigned long childElementCount;

  [CEReactions, Unscopable] undefined prepend((Node or DOMString)... nodes);
  [CEReactions, Unscopable] undefined append((Node or DOMString)... nodes);
  [CEReactions, Unscopable] undefined replaceChildren((Node or DOMString)... nodes);

  [CEReactions] undefined moveBefore(Node node, Node? child);

  Element? querySelector(DOMString selectors);
  [NewObject] NodeList querySelectorAll(DOMString selectors);
};
Document includes ParentNode;
DocumentFragment includes ParentNode;
Element includes ParentNode;

interface mixin NonDocumentTypeChildNode {
  readonly attribute Element? previousElementSibling;
  readonly attribute Element? nextElementSibling;
};
Element includes NonDocumentTypeChildNode;
CharacterData includes NonDocumentTypeChildNode;

interface mixin ChildNode {
  [CEReactions, Unscopable] undefined before((Node or DOMString)... nodes);
  [CEReactions, Unscopable] undefined after((Node or DOMString)... nodes);
  [CEReactions, Unscopable] undefined replaceWith((Node or DOMString)... nodes);
  [CEReactions, Unscopable] undefined remove();
};
DocumentType includes ChildNode;
Element includes ChildNode;
CharacterData includes ChildNode;

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

[Exposed=Window]
interface NodeList {
  getter Node? item(unsigned long index);
  readonly attribute unsigned long length;
  iterable<Node>;
};

[Exposed=Window, LegacyUnenumerableNamedProperties]
interface HTMLCollection {
  readonly attribute unsigned long length;
  getter Element? item(unsigned long index);
  getter Element? namedItem(DOMString name);
};

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

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

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

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

[Exposed=Window]
interface MutationRecord {
  readonly attribute DOMString type;
  [SameObject] readonly attribute Node target;
  [SameObject] readonly attribute NodeList addedNodes;
  [SameObject] readonly attribute NodeList removedNodes;
  readonly attribute Node? previousSibling;
  readonly attribute Node? nextSibling;
  readonly attribute DOMString? attributeName;
  readonly attribute DOMString? attributeNamespace;
  readonly attribute DOMString? oldValue;
};

[Exposed=Window]
interface Node : EventTarget {
  const unsigned short ELEMENT_NODE = 1;
  const unsigned short ATTRIBUTE_NODE = 2;
  const unsigned short TEXT_NODE = 3;
  const unsigned short CDATA_SECTION_NODE = 4;
  const unsigned short ENTITY_REFERENCE_NODE = 5; // legacy
  const unsigned short ENTITY_NODE = 6; // legacy
  const unsigned short PROCESSING_INSTRUCTION_NODE = 7;
  const unsigned short COMMENT_NODE = 8;
  const unsigned short DOCUMENT_NODE = 9;
  const unsigned short DOCUMENT_TYPE_NODE = 10;
  const unsigned short DOCUMENT_FRAGMENT_NODE = 11;
  const unsigned short NOTATION_NODE = 12; // legacy
  readonly attribute unsigned short nodeType;
  readonly attribute DOMString nodeName;

  readonly attribute USVString baseURI;

  readonly attribute boolean isConnected;
  readonly attribute Document? ownerDocument;
  Node getRootNode(optional GetRootNodeOptions options = {});
  readonly attribute Node? parentNode;
  readonly attribute Element? parentElement;
  boolean hasChildNodes();
  [SameObject] readonly attribute NodeList childNodes;
  readonly attribute Node? firstChild;
  readonly attribute Node? lastChild;
  readonly attribute Node? previousSibling;
  readonly attribute Node? nextSibling;

  [CEReactions] attribute DOMString? nodeValue;
  [CEReactions] attribute DOMString? textContent;
  [CEReactions] undefined normalize();

  [CEReactions, NewObject] Node cloneNode(optional boolean subtree = false);
  boolean isEqualNode(Node? otherNode);
  boolean isSameNode(Node? otherNode); // legacy alias of ===

  const unsigned short DOCUMENT_POSITION_DISCONNECTED = 0x01;
  const unsigned short DOCUMENT_POSITION_PRECEDING = 0x02;
  const unsigned short DOCUMENT_POSITION_FOLLOWING = 0x04;
  const unsigned short DOCUMENT_POSITION_CONTAINS = 0x08;
  const unsigned short DOCUMENT_POSITION_CONTAINED_BY = 0x10;
  const unsigned short DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 0x20;
  unsigned short compareDocumentPosition(Node other);
  boolean contains(Node? other);

  DOMString? lookupPrefix(DOMString? namespace);
  DOMString? lookupNamespaceURI(DOMString? prefix);
  boolean isDefaultNamespace(DOMString? namespace);

  [CEReactions] Node insertBefore(Node node, Node? child);
  [CEReactions] Node appendChild(Node node);
  [CEReactions] Node replaceChild(Node node, Node child);
  [CEReactions] Node removeChild(Node child);
};

dictionary GetRootNodeOptions {
  boolean composed = false;
};

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

  [SameObject] readonly attribute DOMImplementation implementation;
  readonly attribute USVString URL;
  readonly attribute USVString documentURI;
  readonly attribute DOMString compatMode;
  readonly attribute DOMString characterSet;
  readonly attribute DOMString charset; // legacy alias of .characterSet
  readonly attribute DOMString inputEncoding; // legacy alias of .characterSet
  readonly attribute DOMString contentType;

  readonly attribute DocumentType? doctype;
  readonly attribute Element? documentElement;
  HTMLCollection getElementsByTagName(DOMString qualifiedName);
  HTMLCollection getElementsByTagNameNS(DOMString? namespace, DOMString localName);
  HTMLCollection getElementsByClassName(DOMString classNames);

  [CEReactions, NewObject] Element createElement(DOMString localName, optional (DOMString or ElementCreationOptions) options = {});
  [CEReactions, NewObject] Element createElementNS(DOMString? namespace, DOMString qualifiedName, optional (DOMString or ElementCreationOptions) options = {});
  [NewObject] DocumentFragment createDocumentFragment();
  [NewObject] Text createTextNode(DOMString data);
  [NewObject] CDATASection createCDATASection(DOMString data);
  [NewObject] Comment createComment(DOMString data);
  [NewObject] ProcessingInstruction createProcessingInstruction(DOMString target, DOMString data);

  [CEReactions, NewObject] Node importNode(Node node, optional (boolean or ImportNodeOptions) options = false);
  [CEReactions] Node adoptNode(Node node);

  [NewObject] Attr createAttribute(DOMString localName);
  [NewObject] Attr createAttributeNS(DOMString? namespace, DOMString qualifiedName);

  [NewObject] Event createEvent(DOMString interface); // legacy

  [NewObject] Range createRange();

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

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

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

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

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

  boolean hasFeature(); // 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, (TrustedType or DOMString) value);
  [CEReactions] undefined setAttributeNS(DOMString? namespace, DOMString qualifiedName, (TrustedType or DOMString) value);
  [CEReactions] undefined removeAttribute(DOMString qualifiedName);
  [CEReactions] undefined removeAttributeNS(DOMString? namespace, DOMString localName);
  [CEReactions] boolean toggleAttribute(DOMString qualifiedName, optional boolean force);
  boolean hasAttribute(DOMString qualifiedName);
  boolean hasAttributeNS(DOMString? namespace, DOMString localName);

  Attr? getAttributeNode(DOMString qualifiedName);
  Attr? getAttributeNodeNS(DOMString? namespace, DOMString localName);
  [CEReactions] Attr? setAttributeNode(Attr attr);
  [CEReactions] Attr? setAttributeNodeNS(Attr attr);
  [CEReactions] Attr removeAttributeNode(Attr attr);

  ShadowRoot attachShadow(ShadowRootInit init);
  readonly attribute ShadowRoot? shadowRoot;

  readonly attribute CustomElementRegistry? customElementRegistry;

  Element? closest(DOMString selectors);
  boolean matches(DOMString selectors);
  boolean webkitMatchesSelector(DOMString selectors); // legacy alias of .matches

  HTMLCollection getElementsByTagName(DOMString qualifiedName);
  HTMLCollection getElementsByTagNameNS(DOMString? namespace, DOMString localName);
  HTMLCollection getElementsByClassName(DOMString classNames);

  [CEReactions] Element? insertAdjacentElement(DOMString where, Element element); // legacy
  undefined insertAdjacentText(DOMString where, DOMString data); // legacy
};

dictionary ShadowRootInit {
  required ShadowRootMode mode;
  boolean delegatesFocus = false;
  SlotAssignmentMode slotAssignment = "named";
  boolean clonable = false;
  boolean serializable = false;
  CustomElementRegistry? customElementRegistry;
};

[Exposed=Window,
 LegacyUnenumerableNamedProperties]
interface NamedNodeMap {
  readonly attribute unsigned long length;
  getter Attr? item(unsigned long index);
  getter Attr? getNamedItem(DOMString qualifiedName);
  Attr? getNamedItemNS(DOMString? namespace, DOMString localName);
  [CEReactions] Attr? setNamedItem(Attr attr);
  [CEReactions] Attr? setNamedItemNS(Attr attr);
  [CEReactions] Attr removeNamedItem(DOMString qualifiedName);
  [CEReactions] Attr removeNamedItemNS(DOMString? namespace, DOMString localName);
};

[Exposed=Window]
interface Attr : Node {
  readonly attribute DOMString? namespaceURI;
  readonly attribute DOMString? prefix;
  readonly attribute DOMString localName;
  readonly attribute DOMString name;
  [CEReactions] attribute DOMString value;

  readonly attribute Element? ownerElement;

  readonly attribute boolean specified; // 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?