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. セレクター

セレクター文字列のスコープマッチ selectorsnodeに対して行うには、次の手順を実行します:

  1. sselectorsをパースした結果とする。 [SELECTORS4]

  2. sが失敗なら、throwし、 "SyntaxError" DOMExceptionを投げる。

  3. snodeツリーに対してセレクターをマッチし、 スコープルート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でなく、かつ中止されている場合、終了する。

  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について:

    1. もしlistenertypeが"fetch"であり、 listenercallbackがnullでない場合、 appendを使って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 ノードの場合、nodeデータ長さを返す。

  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. 変更アルゴリズム

事前挿入妥当性を確保するために、 ノード nodeノード parent の null または ノード child の前に挿入しようとする場合:

  1. parentDocumentDocumentFragment、 または Element ノードでない場合、"HierarchyRequestError" DOMException投げる

  2. nodeparentホストを含む包括的祖先の場合、 "HierarchyRequestError" DOMException投げる

  3. child が非 null でそのparent でない場合、 "NotFoundError" DOMException投げる

  4. nodeDocumentFragmentDocumentTypeElement、 または CharacterData ノードでない場合、 "HierarchyRequestError" DOMException投げる

  5. nodeText ノードparent文書の場合、または node文書型parent文書でない場合、 "HierarchyRequestError" DOMException投げる

  6. parent文書で、node実装するインターフェースで切り替えて、以下のいずれかの文が真の場合、 "HierarchyRequestError" DOMException投げる

    DocumentFragment

    node が複数の要素を持つか、 Text ノードを持つ場合。

    そうでない場合、node が1つの要素を持ち、かつ parent要素を持つ、child文書型である、 または child が非 null で文書型child続く場合。

    Element

    parent要素を持つ、child文書型である、 または child が非 null で文書型child続く場合。

    DocumentType

    parent文書型を持つ、child が非 null で要素child先行する、 または child が null で parent要素を持つ場合。

事前挿入 するには、ノード nodeノード parent の null または ノード child の前に挿入する:

  1. nodeparentchild の前に事前挿入妥当性を確保する

  2. referenceChildchild にする。

  3. referenceChildnode の場合、referenceChildnode次の兄弟に設定する。

  4. nodeparentreferenceChild の前に挿入する。

  5. node を返す。

仕様は、すべてまたは一部のノード用に 挿入手順を定義することができます。 このアルゴリズムには、下の挿入アルゴリズムで示す通り、insertedNodeが渡されます。 これらの手順は、insertedNodeノードツリー参加している場合、そのノードツリーを変更したり、 閲覧コンテキストを作成したり、 イベントを発火させたり、そのほかJavaScriptを実行してはなりません。 ただし、これらを非同期で実行するためにタスクをキューすることはできます。

挿入手順はJavaScript(その他の動作も含む)を実行できませんが、スクリプトから観測可能な結果を持ちます。次の例を考えてみましょう。

const h1 = document.querySelector('h1');

const fragment = new DocumentFragment();
const script = fragment.appendChild(document.createElement('script'));
const style = fragment.appendChild(document.createElement('style'));

script.innerText= 'console.log(getComputedStyle(h1).color)'; // Logs 'rgb(255, 0, 0)'
style.innerText = 'h1 {color: rgb(255, 0, 0);}';

document.body.append(fragment);

上記の例のスクリプトは 'rgb(255, 0, 0)' と出力します。なぜなら、以下の順序で処理されるためです。

  1. 挿入アルゴリズムが実行され、script および style 要素が順番に挿入されます。

    1. HTML Standardの挿入手順script 要素に対して実行されますが、何もしません。[HTML]

    2. HTML Standardの挿入手順 style 要素に対して実行され、スタイルルールがドキュメントに即座に適用されます。[HTML]

    3. HTML Standardの接続後手順script 要素に対して実行され、スクリプトが実行されます。これにより、前のステップで適用されたスタイルルールが即座に観測されます。 [HTML]

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

post-connection stepsの目的は、 nodesが、 connectedNodenode treeで参加している構造を変更する接続関連の処理を行ったり、 browsing contextsを作成したり、その他JavaScriptを実行する機会を提供することです。 これらの手順により、一連のnodesをスクリプトに対して 原子的に挿入できるようにし、主要な副作用は一括でのノードツリー挿入が完了した後に発生します。これにより、保留中のすべての node treeへの挿入が完全に終了するまで、 さらなる挿入が行われないことが保証されます。

Specificationsは、すべてまたは一部の nodesに対して children changed stepsを定義する場合があります。このアルゴリズムは引数なしで呼び出され、 insertremove、 およびreplace dataから呼ばれます。

挿入として、 ノード nodeノード parent の null または ノード 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. previousSiblingを、childprevious sibling、あるいはchildが null の場合はparentlast childとする。

  7. tree orderに従い、 nodesの各nodeについて:

    1. Adoptを実行してnodeparentnode documentに入れる。

    2. もしchildが null なら、append を使ってnodeparentchildrenに追加する。

    3. それ以外の場合、insertを使ってnodeparentchildrenchildindexの前に挿入する。

    4. もしparentshadow hostで、そのshadow rootslot assignmentが "named" であり、 かつnodeslottableであるなら、assign a slotnodeに対して実行する。

    5. もしparentrootshadow rootで、 parentslotであり、そのassigned nodesが空リストなら、 signal a slot changeparentに対して実行する。

    6. assign slottables for a treenoderootで実行する。

    7. shadow-including inclusive descendantの各inclusiveDescendantについて、shadow-including tree orderで:

      1. 挿入手順inclusiveDescendantに対して実行する。

      2. inclusiveDescendant接続されていない場合は、継続する

      3. inclusiveDescendant要素であり、かつ inclusiveDescendantカスタム要素レジストリがnullでない場合:

        1. inclusiveDescendantカスタム要素レジストリスコープ設定がtrueであれば、追加する。 inclusiveDescendantノード文書inclusiveDescendantカスタム要素レジストリスコープ文書セットへ。

        2. inclusiveDescendantカスタムである場合、 カスタム要素コールバックリアクションをキューに追加する。 inclusiveDescendant、コールバック名 "connectedCallback"、および « » を使用。

        3. それ以外の場合は、アップグレードを試みる inclusiveDescendantに対して。

          これによりinclusiveDescendantのアップグレードが成功した場合、 connectedCallback要素のアップグレード アルゴリズム中に自動的にキューに追加される。

      4. それ以外の場合、inclusiveDescendantシャドウルートであり、 inclusiveDescendantカスタム要素レジストリがnullでなく、 inclusiveDescendantカスタム要素レジストリスコープ設定がtrueの場合、 追加する。 inclusiveDescendantノード文書inclusiveDescendantカスタム要素レジストリスコープ文書セットへ。

  8. もしsuppressObserversが false なら、queue a tree mutation recordparentのために、nodes、« »、previousSibling、およびchildでキューする。

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

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

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

  11. tree orderに従い、 nodesの各nodeについて:

    1. shadow-including inclusive descendantの各inclusiveDescendantについて、shadow-including tree orderで: appendを使ってinclusiveDescendantstaticNodeListに追加する。

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

あるnode nodenode parentappendするには: pre-insertを使ってnodeparentの前の null に挿入する。


Specificationsは、すべてまたは一部の nodesに対して moving stepsを定義する場合があります。 このアルゴリズムにはnode movedNodeと、下のmoveアルゴリズムで示される通り node-or-null の oldParentが渡されます。insertion stepsと同様に、これらの手順は movedNodeが参加しているnode treeを変更したり、browsing contextsを作成したり、イベントを発火させたり、 JavaScriptを実行してはなりません。ただし、これらを非同期で実行するためのタスクをキューすることはできます。

移動するとは、ノード nodeノード newParent の null または ノード child の前に移動することである:

  1. もしnewParentshadow-including rootnodeshadow-including rootと同じでないなら、 throwして "HierarchyRequestError" のDOMException を発生させる。

    これは副作用として、移動が実行されるのはnewParentconnectednodeconnectedと同じ場合のみであることを保証します。

  2. もしnodenewParenthost-including inclusive ancestorであるなら、throwして "HierarchyRequestError" のDOMException を発生させる。

  3. もしchildが非 null で、そのparentnewParentでないなら、 throwして "NotFoundError" のDOMException を発生させる。

  4. もしnodeElement またはCharacterData のいずれでもないノードであるなら、throwして "HierarchyRequestError" のDOMException を発生させる。

  5. もしnodeTextnewParentdocumentであるなら、 throwして "HierarchyRequestError" のDOMException を発生させる。

  6. もしnewParentdocumentで、かつnodeElementであり、 かつ(newParentがすでにelementchildを持っている、または childdoctypeである、 またはchildが非 null でありdoctypefollowingしている)なら、 throwして "HierarchyRequestError" のDOMException を発生させる。

  7. oldParentnodeparentとする。

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

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

  10. そのnodeのノードドキュメントと同じノードドキュメントを持つ各 NodeIterator オブジェクトiteratorについて、NodeIterator pre-remove stepsnodeiteratorで実行する。

  11. oldPreviousSiblingnodeprevious siblingとする。

  12. oldNextSiblingnodenext siblingとする。

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

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

  15. もしoldParentrootshadow rootで、かつoldParentslotであり、 そのassigned nodesが 空であるなら、signal a slot changeoldParentに対して実行する。

  16. もしnodeinclusive descendantを持ち、そのうちのどれかが slotであるなら:

    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 ならそのprevious siblingとし、 そうでなければnewParentlast childとする。

  19. もしchildが null なら、appendを用いて nodenewParentchildrenに追加する。

  20. それ以外の場合、insertを用いてnodenewParentchildrenchildindexの前に挿入する。

  21. もしnewParentshadow hostで、そのshadow rootslot assignmentが "named" であり、 nodeslottableであるなら、 assign a slotnodeに対して実行する。

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

  23. assign slottables for a treenoderootで実行する。

  24. shadow-including inclusive descendantの各inclusiveDescendantについて、shadow-including tree orderで:

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

      moveアルゴリズムは insertremoveとは別のプリミティブであるため、 通常のinsertion stepsremoving stepsinclusiveDescendantについて呼び出さないことに注意してください。

    2. もしinclusiveDescendantcustomで、 かつnewParentconnectedであるなら、 enqueue a custom element callback reactioninclusiveDescendant、コールバック名 "connectedMoveCallback"、および « » でキューする。

  25. Queue a tree mutation recordoldParentのために « »、 « node »、 oldPreviousSibling、およびoldNextSibling でキューする。

  26. Queue a tree mutation recordnewParentのために « node »、 « »、 newPreviousSibling、およびchild でキューする。


あるnode childを、 node nodenode parent内で replaceするには:

  1. もしparentDocumentDocumentFragment、 またはElementのいずれでもないノードであれば、 throwして "HierarchyRequestError" のDOMException を発生させる。

  2. もしnodeparenthost-including inclusive ancestorであるなら、 throwして "HierarchyRequestError" のDOMException を発生させる。

  3. もしchildparentparentでないなら、 throwして "NotFoundError" のDOMException を発生させる。

  4. もしnodeDocumentFragmentDocumentTypeElement、 またはCharacterDataのいずれでもないノードであれば、 throwして "HierarchyRequestError" のDOMException を発生させる。

  5. もしnodeTextで、 parentdocumentである、 またはnodedoctypeparentdocumentでない場合、 throwして "HierarchyRequestError" のDOMException を発生させる。

  6. もしparentdocumentであり、 次のいずれかの文が true であれば(nodeが実装するインターフェイスに基づいて切り替える)、 throwして "HierarchyRequestError" のDOMException を発生させる。

    DocumentFragment

    もしnodeが複数のelementchildを持つか、 あるいはTextnodechildを持つならばエラーとなる。

    さもなければ、もしnodeが一つのelementchildを持ち、かつ parentchildとは異なるelementchildを持つか、 あるいはchildに続いてdoctypeがあるならばエラーとなる。

    Element

    もしparentchildとは異なるelementchildを持つか、 あるいはchildの後にdoctypeがあるならばエラーとなる。

    DocumentType

    もしparentchildとは異なるdoctypechildを持つか、 あるいはchildの前にelementがあるならばエラーとなる。

    上記の文はpre-insertアルゴリズムと異なります。

  7. referenceChildchildnext siblingとする。

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

  9. previousSiblingchildprevious siblingとする。

  10. removedNodesを空集合とする。

  11. もしchildparentが非 null なら:

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

    2. Removechildに対して、 suppressObserversを true にして実行する。

    上記は、childnodeである場合のみ偽になり得ます。

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

  13. Insert を使ってnodeparentreferenceChildの前に挿入し、 suppressObserversを true に設定する。

  14. Queue a tree mutation recordparentのためにnodesremovedNodespreviousSibling、およびreferenceChildでキューする。

  15. childを返す。

あるnodeまたは null nodenode parent内のすべてを replace allするには:

  1. removedNodesparentchildrenとする。

  2. addedNodesを空集合とする。

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

  4. さもなければ、もしnodeが非 null ならaddedNodesを « node » に設定する。

  5. Removeを使って、 parentのすべてのchildrenを、tree orderで削除し、suppressObserversを true に設定する。

  6. もしnodeが非 null なら、insertを使ってnodeparentの null の前に挿入し、suppressObserversを true に設定する。

  7. もしaddedNodesまたはremovedNodes空でないなら、 queue a tree mutation recordparentのためにaddedNodesremovedNodes、null、nullでキューする。

このアルゴリズムはnode treeの制約に関するチェックを行いません。仕様の作成者は注意して使用してください。


あるnode childnode parentから pre-removeするには:

  1. もしchildparentparentでないなら、 throwして "NotFoundError" のDOMException を発生させる。

  2. Removeを使って childを削除する。

  3. childを返す。

Specificationsは、すべてまたは一部の nodesに対して removing stepsを定義する場合があります。アルゴリズムには下の remove アルゴリズムで示される通り、node removedNodenode-or-null の oldParentが渡されます。

除去するとは、ノード node を オプションのブール値 suppressObservers(デフォルトは false)とともに除去することである:

  1. parentnodeparentとする。

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

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

  4. そのノードドキュメントと同じノードドキュメントを持つ各 NodeIterator オブジェクトiteratorについて、NodeIterator pre-remove stepsnodeiteratorで実行する。

  5. oldPreviousSiblingnodeprevious siblingとする。

  6. oldNextSiblingnodenext siblingとする。

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

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

  9. もしparentrootshadow rootで、かつparentslotであり、 その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 reactionnode、コールバック名 "disconnectedCallback"、および « » でキューする。

    現在は意図的に、customelementsに対してparentが渡されないようになっています。将来的に必要があれば変更される可能性があります。

  14. shadow-including descendantの各 descendantについて、shadow-including tree orderで:

    1. removing stepsdescendantと null で実行する。

    2. もしdescendantcustomでかつisParentConnectedが true なら、 enqueue a custom element callback reactiondescendant、コールバック名 "disconnectedCallback"、および « » でキューする。

  15. inclusive ancestorの各 inclusiveAncestorについて、そしてその後でfor eachを用いて inclusiveAncestorregisteredの各要素について、もしその registeredoptions["subtree"] が true であれば、appendを使って新しい transient registered observerを追加する。 その新しいオブザーバーの各フィールドは、registeredの対応するフィールドを継承し、 sourceregisterednoderegistered 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

ノード群をノードに変換するには、 nodesdocumentを受け取り、以下の手順を実行します。

  1. nodeを null とする。

  2. nodes 内の各文字列を、その文字列を data とし、documentnode document とする新しい Text ノード で置き換える。

  3. もし nodes が1つの node を含むなら、nodenodes[0] に設定する。

  4. さもなければ、node を新しい DocumentFragmentnode(その node documentdocument)に設定し、 必要であれば nodes の各 node をそれに append する。

  5. node を返す。

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

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

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

  Element? querySelector(DOMString selectors);
  [NewObject] NodeList querySelectorAll(DOMString selectors);
};
Document includes ParentNode;
DocumentFragment includes ParentNode;
Element includes ParentNode;
collection = node . children
childelementsを返します。
element = node . firstElementChild
最初のchildのうちelementであるものを返します。該当しない場合は null を返します。
element = node . lastElementChild
最後のchildのうちelementであるものを返します。該当しない場合は null を返します。
node . prepend(nodes)

nodesnodefirst child の前に挿入します。挿入時に nodes 内の文字列は同等の Text nodes に置き換えられます。

Throws a "HierarchyRequestError" DOMException は、node tree の制約が違反された場合に発生します。

node . append(nodes)

nodesnodelast child の後に挿入します。挿入時に nodes 内の文字列は同等の Text nodes に置き換えられます。

Throws a "HierarchyRequestError" DOMException は、node tree の制約が違反された場合に発生します。

node . replaceChildren(nodes)

node の全ての childrennodes に置き換えます。置換時に nodes 内の文字列は同等の Text nodes に置き換えられます。

Throws a "HierarchyRequestError" DOMException は、node tree の制約が違反された場合に発生します。

node . moveBefore(movedNode, child)

movedNode を先に削除せずに移動します。もし child が非 null であれば child の後に、そうでなければ nodelast child の後に挿入します。 このメソッドは movedNode に関連付けられた状態を保持します。

Throws a "HierarchyRequestError" DOMException は、node tree の制約が違反された場合、または移動するノードに関連付けられた状態を保持できない場合に発生します。

node . querySelector(selectors)

node の子孫であり、かつ selectors に一致する最初の element を返します。

node . querySelectorAll(selectors)

node の子孫であり、かつ selectors に一致するすべての element を返します。

childrenゲッターの手順は、 thisをルートとし、 要素のみのに一致する HTMLCollection コレクションを返すことです。

firstElementChildゲッターの手順は、 最初の要素であるものを返します。なければnull。

lastElementChildゲッターの手順は、 最後の要素であるものを返します。なければnull。

childElementCountゲッターの手順は、 要素であるの数を返します。

prepend(nodes)メソッドの手順は以下の通りです。

  1. nodeを、nodesthisノード文書を受けて ノード群をノードに変換した結果とする。

  2. 事前挿入nodethis最初の子の前に挿入する。

append(nodes)メソッドの手順は以下の通りです。

  1. nodeを、nodesthisノード文書を受けて ノード群をノードに変換した結果とする。

  2. 追加nodethisへ追加する。

replaceChildren(nodes)メソッドの手順は以下の通りです。

  1. nodeを、nodesthisノード文書を受けて ノード群をノードに変換した結果とする。

  2. 事前挿入の妥当性の確保nodethisのnullの前で実行する。

  3. 全て置換nodethis内で実行する。

moveBefore(node, child) メソッドの手順は以下の通りです。

  1. referenceChildchildとする。

  2. もしreferenceChildnodeなら、 referenceChildnode次の兄弟にセットする。

  3. 移動nodethisreferenceChildの前で実行する。

querySelector(selectors)メソッドの手順は、 セレクタ文字列のスコープマッチselectorsに対してthisで実行し、結果が空リストでなければその最初の結果を返し、そうでなければnullを返します。

querySelectorAll(selectors)メソッドの手順は、 セレクタ文字列のスコープマッチselectorsに対してthisで実行した 静的な結果を返します。

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 ゲッターの手順は、最初の前の兄弟要素であるものを返します。なければnull。

nextElementSibling ゲッターの手順は、最初の後の兄弟要素であるものを返します。なければnull。

4.2.8. ミックスイン ChildNode

interface mixin ChildNode {
  [CEReactions, Unscopable] undefined before((Node or DOMString)... nodes);
  [CEReactions, Unscopable] undefined after((Node or DOMString)... nodes);
  [CEReactions, Unscopable] undefined replaceWith((Node or DOMString)... nodes);
  [CEReactions, Unscopable] undefined remove();
};
DocumentType includes ChildNode;
Element includes ChildNode;
CharacterData includes ChildNode;
node . before(...nodes)

nodesnode の直前に挿入します。挿入時に nodes 内の文字列は同等の Text nodes に置き換えられます。

スローされるのは、HierarchyRequestError DOMException であり、これは node tree の制約が違反された場合に発生します。

node . after(...nodes)

nodesnode の直後に挿入します。挿入時に nodes 内の文字列は同等の Text nodes に置き換えられます。

スローされるのは、HierarchyRequestError DOMException であり、これは node tree の制約が違反された場合に発生します。

node . replaceWith(...nodes)

nodenodes で置き換えます。置き換え時に nodes 内の文字列は同等の Text nodes に置き換えられます。

スローされるのは、HierarchyRequestError DOMException であり、これは node tree の制約が違反された場合に発生します。

node . remove()

node を削除します。

before(nodes)メソッドの手順は以下の通りです。

  1. parentthisとする。

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

  3. viablePreviousSiblingthisの 最初の前の 兄弟nodesに含まれていないものとする。なければnull。

  4. nodenodesthisノード文書ノード群をノードに変換した結果とする。

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

  6. 事前挿入nodeparentviablePreviousSiblingの前に挿入する。

after(nodes) メソッドの手順は以下の通りです。

  1. parentthisとする。

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

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

  4. nodenodesthisノード文書ノード群をノードに変換した結果とする。

  5. 事前挿入nodeparentviableNextSiblingの前に挿入する。

replaceWith(nodes)メソッドの手順は以下の通りです。

  1. parentthisとする。

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

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

  4. nodenodesthisノード文書ノード群をノードに変換した結果とする。

  5. もしthisparentなら、 置換thisnodeparent内で置換する。

    thisnodeに挿入された可能性があります。

  6. そうでなければ、事前挿入nodeparentviableNextSiblingの前に挿入する。

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

  1. もしthisがnullなら、終了する。

  2. 削除thisで実行する。

4.2.9. ミックスイン Slottable

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

assignedSlot ゲッターの手順は、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
コレクション内のノードの数を返します。 collection内の要素数を返します。
element = collection . item(index)
element = collection[index]
collectionからインデックスindexノードを返します。ノードツリー順でソートされています。

オブジェクトのサポートされているプロパティインデックスは、 コレクションによって表されるノードの数より一つ少ない値までを含む、0 からその数までの範囲の数値です。もしそのような要素が存在しない場合、サポートされているプロパティインデックスは存在しません。

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オブジェクト)を持ち、初期値は空です。

mutation observer microtask をキューする には、次の手順を実行します:

  1. surrounding agentmutation observer microtask queuedがtrueなら、終了する。

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

  3. マイクロタスクをキューし、マイクロタスクnotify mutation observersを実行する。

notify mutation observersを実行するには、次の手順を実行します:

  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についてnotifySetを繰り返す:

    1. recordsmorecord queueクローンとする。

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

    3. nodeについてmonode listを繰り返し: removemonoderegistered observer listにある 全てのtransient registered observerを削除する。

    4. もしrecords空でなければコールバック関数を呼び出すmocallbackを« records, mo »と "report"で呼び出し、this値としてmoを渡す。

  7. slotについてsignalSetを繰り返し: イベントを発火する。 イベント名はslotchange、属性 bubbles を true にする。 対象はslot


ノードregistered observer list(0個以上のリストで、 registered observer)を持ち、初期値は空です。

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

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

Transient registered observers は、ある node が削除された後にその descendants 内で発生する変更を追跡するために使用されます。これにより、 subtree が該当の nodeparent 上で 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オブジェクトは、treenodesに対する変化を監視するために使用できます。

MutationObserverオブジェクトには、次の関連概念があります:

observer = new MutationObserver(callback)
新しいMutationObserverオブジェクトを構築し、そのcallbackcallbackに設定します。callbackは第一引数としてMutationRecordオブジェクトのリスト、第二引数として構築されたMutationObserverオブジェクトを受け取り、observe()メソッドで登録されたnodesが変化した後に呼び出されます。
observer . observe(target, options)
指定したtargetnode)を監視し、options(オブジェクト)で指定された基準に基づいて変化を報告するようユーザーエージェントに指示します。

options引数はオブジェクトのメンバーによって監視オプションを設定できます。使用可能なオブジェクトメンバーは次の通りです:

childList
targetchildrenへの変化を監視する場合は true に設定します。
attributes
targetattributesへの変化を監視する場合は true に設定します。attributeOldValueまたはattributeFilterが指定されている場合は省略できます。
characterData
targetdataへの変化を監視する場合は true に設定します。characterDataOldValueが指定されている場合は省略できます。
subtree
targetだけでなく、targetdescendantsへの変化も監視する場合は true に設定します。
attributeOldValue
attributesが true または省略されており、かつtargetattributevalueを変化前に記録する必要がある場合は true に設定します。
characterDataOldValue
characterDataが true または省略されており、かつtargetdataを変化前に記録する必要がある場合は true に設定します。
attributeFilter
すべてのattributeの変化を監視する必要がない場合、(名前空間なしの)attribute のローカル名のリストに設定します。その場合はattributesが true または省略されている必要があります。
observer . disconnect()
observerが変化の監視を行わないようにします。observe()が再度使用されるまで、observercallbackは呼び出されません。
observer . takeRecords()
record queueを空にし、そこにあったものを返します。

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

observe(target, options) メソッドの手順は次のとおりです:

  1. もし options["attributeOldValue"] または options["attributeFilter"] が exists し、かつ options["attributes"] が exist しない場合、options["attributes"] を true に設定します。

  2. もし options["characterDataOldValue"] が exists し、かつ options["characterData"] が exist しない場合、options["characterData"] を true に設定します。

  3. もし options["childList"]、options["attributes"]、および options["characterData"] のいずれも true でない場合は、throw して TypeError を発生させます。

  4. もし options["attributeOldValue"] が true でかつ options["attributes"] が false の場合、throw して TypeError を発生させます。

  5. もし options["attributeFilter"] が存在し、かつ options["attributes"] が false の場合、throw して TypeError を発生させます。

  6. もし options["characterDataOldValue"] が true でかつ options["characterData"] が false の場合、throw して TypeError を発生させます。

  7. For each registered of target’s registered observer list:もし registeredobserverthis であるなら:

    1. For each node of this’s node listremove して、noderegistered observer list から transient registered observers をすべて削除します。これらの sourceregistered であるものです。

    2. registeredoptionsoptions に設定します。

  8. それ以外の場合:

    1. Append して、新しい registered observertargetregistered observer list に追加します。その新しい registered observer の observerthis であり、optionsoptions です。

    2. Append して、thisnode listtarget への弱参照を追加します。

disconnect() メソッドの手順は:

  1. For each node of this’s node listremove して、その noderegistered observer list から、この thisobserver である registered observer を削除します。

  2. Empty を実行して、thisrecord queue を空にします。

takeRecords() メソッドの手順は:

  1. recordsclone して、thisrecord queue の複製を作ります。

  2. Empty を実行して、thisrecord queue を空にします。

  3. records を返します。

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

ミューテーションレコードをキューするには、typetargetnamenamespaceoldValueaddedNodesremovedNodespreviousSiblingnextSiblingを対象に、以下の手順を実行します。

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

  2. nodestarget包括的祖先とする。

  3. nodesnodeについて、続いてそれぞれnode登録済みオブザーバーのリストの各registeredについて:

    1. optionsregisteredoptionsとする。

    2. 次のいずれも真でなければ

      • nodetargetでなく、かつoptions["subtree"]がfalse
      • typeが"attributes"で、options["attributes"]が存在せず、またはfalse
      • typeが"attributes"で、options["attributeFilter"]が存在し、options["attributeFilter"]がnameを含まず、またはnamespaceがnullでない
      • typeが"characterData"で、options["characterData"]が存在せず、またはfalse
      • typeが"childList"で、options["childList"]がfalse

      ならば:

      1. moregisteredobserverとする。

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

      3. typeが"attributes"でoptions["attributeOldValue"]がtrue、またはtypeが"characterData"でoptions["characterDataOldValue"]がtrueなら、 セットinterestedObservers[mo]をoldValueに設定する。

  4. observermappedOldValueについてinterestedObserversを繰り返す:

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

    2. エンキューrecordobserverrecord queueに追加する。

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

  5. mutation observer microtask をキューする

ツリーのミューテーションレコードをキューするには、targetaddedNodesremovedNodespreviousSiblingnextSiblingを対象に、以下の手順を実行します。

  1. Assert: 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
その変化がattributeの変化であった場合は"attributes"を返します。 CharacterData ノードへの変化であった場合は"characterData"を返します。ノードのtreeへの変化であった場合は"childList"を返します。
record . target
type に応じて、変更の影響を受けた ノード を返す。 "attributes" の場合は、属性が変更された 要素 である。 "characterData" の場合は、該当する CharacterData ノード である。 "childList" の場合は、子が変更された ノード である。
record . addedNodes
record . removedNodes
それぞれ追加および削除されたnodesを返します。
record . previousSibling
record . nextSibling
追加または削除されたnodesのそれぞれのpreviousおよびnext siblingを返します。該当しない場合は null を返します。
record . attributeName
変化したattributelocal nameを返します。該当しない場合は null です。
record . attributeNamespace
変化したattributenamespaceを返します。該当しない場合は null です。
record . oldValue
返り値はtypeによります。 "attributes"の場合は、変化前の該当するattributevalueです。 "characterData"の場合は、変化前の該当するノードのdataです。 "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 は抽象インターフェイスであり、すべての ノード によって使用されます。直接インスタンスを取得することはできません。

ノード には、作成時に設定される関連する node document があり、それは ドキュメント です。

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

ノード親を取得アルゴリズムは、 event が与えられたとき、 もしノード割り当てられた slotを持つ割り当て済みであれば、それを返す。それ以外の場合はノードを返す。

ノード はまた、registered observer list を持ちます。


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ゲッターの手順は、 this接続済みならtrue、そうでなければfalseを返すことです。

ownerDocumentゲッターの手順は、 thisドキュメントならnullを返し、そうでなければthisノード文書を返します。

ドキュメントノード文書はそのドキュメント自身です。すべてのノードは常にノード文書を持ちます。

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

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

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

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

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

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

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

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

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


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

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

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

Attr

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

CharacterData

データ置換をノードthis、offset 0、count 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

Replace data をノード node、オフセット 0、カウント nodelength、およびデータ value で実行します。

それ以外

何もしません。

この textContent セッターの手順は、与えられた値が null の場合は空文字列として扱い、その後 set text contentthis と与えられた値で実行することです。


node . normalize()
空の empty排他的な Text ノード を削除し、残った連続する 排他的 Text ノードdata を、それらの最初の ノード に連結します。

この normalize() メソッドの手順は、子孫 の各 排他的な Text ノード node に対して以下の手順を実行することです(対象は this の子孫):

  1. まず lengthnodelength とします。
  2. もし length がゼロなら、removenode を削除し、次の 排他的な Text ノード に進みます(存在する場合)。
  3. data を、node連続する排他的 Text ノード(自身を除く)の data連結 とします(ツリー順序で)。
  4. Replace data をノード node、オフセット length、カウント 0、データ data で実行します。
  5. currentNodenode次の兄弟 にします。
  6. もし currentNode排他的な Text ノード である間は、次を繰り返します:

    1. ライブレンジのうち、開始ノードcurrentNodeであるものすべてについて:その開始オフセットlengthを加算し、開始ノードnodeに設定する。

    2. ライブレンジのうち、終了ノードcurrentNodeであるものすべてについて:その終了オフセットlengthを加算し、終了ノードnodeに設定する。

    3. ライブレンジのうち、開始ノードcurrentNodeであり、開始オフセットcurrentNodeインデックスであるものすべてについて:その開始ノードnodeに、開始オフセットlengthに設定する。

    4. ライブレンジのうち、終了ノードcurrentNodeであり、終了オフセットcurrentNodeインデックスであるものすべてについて:その終了ノードnodeに、終了オフセットlengthに設定する。

    5. currentNode長さlengthに加算する。

    6. currentNodeをその次の兄弟に設定する。

  7. Removenode連続する排他的な Text ノード(自身を除く)をツリー順序で削除します。

node . cloneNode([subtree = false])
node のコピーを返します。もし subtree が true なら、そのコピーには node子孫 も含まれます。
node . isEqualNode(otherNode)
nodeotherNode が同じプロパティを持つかどうかを返します。
Specifications は、全てまたは一部の ノード に対して cloning steps を定義している場合があります。アルゴリズムには nodecopy、および subtreeclone a node アルゴリズムで示される通り渡されます。

HTML は cloning steps をいくつかの要素、例えば inputscript、 および template のような要素について定義しています。SVG はその script 要素について同様にすべきですが、そうはなっていません。

ノードを複製するには、node node と、オプションの document document (省略時は nodenode document)、boolean subtree(省略時は false)、node または null の parent(省略時は null)、および null または CustomElementRegistry オブジェクト fallbackRegistry (省略時は null)を受け取る:

  1. Assert: nodedocument ではないか、または nodedocument であることを確認します。

  2. copy を、cloning a single nodenodedocument、および fallbackRegistry を用いて実行した結果にします。

  3. cloning steps他の適用可能な仕様 によって node のために定義されている場合、それらを実行し、nodecopy、および subtree をパラメータとして渡します。

  4. もし parent が非 null なら、appendcopyparent に追加します。

  5. もし subtree が true なら、nodechildren の各 child について、ツリー順序で:clone a nodechild を与えて実行し、documentdocument に、subtreesubtree に、parentcopy に、そして fallbackRegistryfallbackRegistry に設定します。

  6. もし nodeelement であり、かつ nodeshadow host であり、nodeshadow rootclonable が true の場合:

    1. Assert: copyshadow host でないことを確認します。

    2. shadowRootRegistrynodeshadow rootcustom element registry にします。

    3. もし shadowRootRegistryglobal custom element registry である 場合、shadowRootRegistrydocumenteffective global custom element registry に設定します。

    4. Attach a shadow rootcopynodeshadow rootmode、true、nodeshadow rootserializablenodeshadow rootdelegates focusnodeshadow rootslot assignment、および shadowRootRegistry を用いて実行します。

    5. copyshadow rootdeclarativenode の対応する shadow rootdeclarative に設定します。

    6. nodeshadow rootchildren の各 child について、ツリー順序で:clone a nodechild を与えて実行し、documentdocument に、subtreesubtree に、そして parentcopyshadow root に設定します。

      これは意図的に fallbackRegistry 引数を渡していません。

  7. 最後に copy を返します。

単一ノードを複製する clone a single node(与えられた node nodedocument document、および null または CustomElementRegistry オブジェクト fallbackRegistry) を行うには、以下を実行します:

  1. copy を null にします。

  2. もし nodeelement であるなら:

    1. registrynodecustom element registry にします。

    2. もし registry が null なら、registryfallbackRegistry に設定します。

    3. もし registryglobal custom element registry である なら、registrydocumenteffective global custom element registry に設定します。

    4. copy要素を作成する の結果に設定します。引数は documentnodelocal namenodenamespacenodenamespace prefixnodeis value、false、および registry です。

    5. For each attributenodeattribute list に対して行います:

      1. copyAttribute を、cloning a single node を用いて attributedocument、および null で複製した結果にします。

      2. Append copyAttributecopy に追加します。

  3. それ以外の場合、copynode と同じインターフェイスを実装する ノード に設定し、追加の要件を満たすように以下を行います。ここでもインターフェイス node がどれを implements しているかで切り替えます:

    Document
    1. copyencodingcontent typeURLorigintypemode、および allow declarative shadow rootsnode のものに設定します。

    2. もし nodecustom element registryis scoped が true なら、copycustom element registrynode のそれに設定します。

    DocumentType

    copynamepublic ID、および system IDnode のものに設定します。

    Attr

    copynamespacenamespace prefixlocal name、および valuenode のものに設定します。

    Text
    Comment

    copydatanode のものに設定します。

    ProcessingInstruction

    copytarget および datanode のものに設定します。

    それ以外

    何もしません。

  4. Assert: copynode であることを確認します。

  5. もし nodedocument であれば、documentcopy に設定します。

  6. copynode documentdocument に設定します。

  7. 最後に copy を返します。

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

  1. もし thisshadow root であれば、throw により "NotSupportedError" DOMException を発生させます。

  2. cloning a nodethis を与えて実行し、subtreesubtree に設定した結果を返します。

ノード node A は、次のすべての条件が満たされる場合にノード node B等しい(equals) とされます:

この isEqualNode(otherNode) メソッドの手順は、otherNode が非 null であり、かつ thisequals する otherNode であれば 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

    このアルゴリズムにおける attributes の扱い方のため、これは nodeattributespreceding としてその nodechildren を数える結果になります。これは attributes が同じ treeparticipating しているわけではないにもかかわらずです。

  10. 次に DOCUMENT_POSITION_FOLLOWING を返します。

contains(other)メソッドの手順は、 other包括的子孫であればtrue、それ以外(null含む)はfalseを返すことです。


名前空間プレフィックスを特定するelementに対してnamespaceで行うには、以下の手順を実行します:

  1. element名前空間namespaceであり、 名前空間プレフィックスがnullでなければ、 その名前空間プレフィックスを返す。

  2. element持つ属性のうち、 名前空間プレフィックスが"xmlns"で、 namespaceである属性があれば、 その最初の属性のローカル名を返す。

  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)、 カスタム要素レジストリ(nullまたはCustomElementRegistry オブジェクト)が関連付けられます。 [ENCODING] [URL] [HTML]

特に明記されていない限り、ドキュメントエンコーディングutf-8 エンコーディングコンテントタイプは "application/xml"、 URLは "about:blank"、 オリジン不透明なオリジンは "xml"、 モードは "no-quirks"、 宣言的シャドウルート許可はfalse、 カスタム要素レジストリはnullです。

ドキュメントは、 が"xml"なら XMLドキュメントと呼ばれ、 それ以外はHTMLドキュメントと呼ばれます。 ドキュメントHTMLドキュメントXMLドキュメントかによって、 一部APIの挙動が変わります。

ドキュメントno-quirksモードモードが"no-quirks")、 quirksモードモードが"quirks")、 limited-quirksモードモードが"limited-quirks")と呼ばれます。

モードは、 ドキュメントHTMLパーサでDOCTYPE文字列の有無や値によって作成された場合、 また新しい閲覧コンテキスト(初期"about:blank")によってのみデフォルトから変更されます。[HTML]

no-quirksモードは元々「standards mode」と呼ばれており、 limited-quirksモードは「almost standards mode」と呼ばれていましたが、 詳細が標準で定義されるようになったため改名されました。(Ian Hicksonが「意味がない」として元の名前を却下したことも理由です。)

ドキュメント親取得アルゴリズムは、 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オリジンオリジンである 現在のグローバルオブジェクト関連付けられたDocumentのものに設定することです。[HTML]

createDocument()とは異なり、 このコンストラクタは XMLDocument オブジェクトではなく、ドキュメントDocument オブジェクト)を返します。

implementationゲッターの手順は、 thisに関連付けられたDOMImplementation オブジェクトを返すことです。

URLおよび documentURIゲッターの手順は、 thisURL直列化済み)を返すことです。

compatModeゲッターの手順は、 thisモードが"quirks"なら"BackCompat"、 それ以外なら"CSS1Compat"を返すことです。

characterSetcharsetinputEncodingゲッターの手順は、 thisエンコーディング名前を返すことです。

contentTypeゲッターの手順は、 thisコンテントタイプを返すことです。


document . doctype
doctypeを返します。存在しない場合はnullを返します。
document . documentElement
文書要素を返します。
collection = document . getElementsByTagName(qualifiedName)

qualifiedNameが"*"の場合、すべての子孫要素HTMLCollectionを返します。

それ以外の場合は、すべての子孫 要素のうち 修飾名qualifiedNameであるもののHTMLCollectionを返します。 (HTMLドキュメントHTML名前空間内の要素については大文字小文字を区別せずに一致します。)

collection = document . getElementsByTagNameNS(namespace, localName)

namespacelocalNameが両方"*"の場合、すべての子孫要素HTMLCollectionを返します。

namespaceのみが"*"の場合、すべての子孫要素のうち ローカル名localNameであるもののHTMLCollectionを返します。

localNameのみが"*"の場合、すべての子孫要素のうち 名前空間namespaceであるもののHTMLCollectionを返します。

それ以外の場合、すべての子孫 要素のうち 名前空間namespaceローカル名localNameであるもののHTMLCollectionを返します。

collection = document . getElementsByClassName(classNames)
collection = element . getElementsByClassName(classNames)

このメソッドが呼び出された対象(ドキュメントまたは要素)内で、classNamesで指定されたすべてのクラスを持つ要素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ノード。その targettarget、およびその datadata です。 もし targetName 生成規則に一致しない場合、"InvalidCharacterError" DOMException がスローされます。 もし data に "?>" が含まれている場合、"InvalidCharacterError" DOMException がスローされます。

要素インターフェースは、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 ノードデータdataノード文書this)を返すことです。

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

  1. thisHTMLドキュメントなら NotSupportedError "NotSupportedError" DOMException を投げる。

  2. dataに文字列"]]>"が含まれていれば InvalidCharacterError "InvalidCharacterError" DOMException を投げる。

  3. 新しいCDATASection ノードデータdataノード文書this)を返す。

createComment(data)メソッドの手順は、新しいComment ノードデータdataノード文書this)を返すことです。

createProcessingInstruction(target, data) メソッドの手順は以下の通りです:

  1. targetName生成規則に一致しない場合、 InvalidCharacterError "InvalidCharacterError" DOMException を投げる。
  2. dataに"?>"が含まれていれば InvalidCharacterError "InvalidCharacterError" DOMException を投げる。
  3. 新しいProcessingInstruction ノードtargettargetdatadataノード文書this)を返す。

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

nodeのコピーを返します。optionsがtrue、またはoptionsが辞書でそのselfOnly がfalseの場合、コピーにはnode子孫も含まれます。

optionscustomElementRegistry を使って、 CustomElementRegistry が未設定な要素に設定することができます。

nodeドキュメントまたはシャドウルートの場合、 "NotSupportedError" DOMException が投げられます。

node = document . adoptNode(node)
nodeを他のドキュメントから移動し、返します。

nodeドキュメントの場合、 "NotSupportedError" DOMException が投げられるか、nodeシャドウルートの場合は "HierarchyRequestError" DOMException が投げられます。

importNode(node, options) メソッドの手順は以下の通りです:

  1. nodeドキュメントまたはシャドウルートなら NotSupportedError "NotSupportedError" DOMException を投げる。

  2. subtreeをfalseにする。

  3. registryをnullにする。

  4. optionsがbooleanならsubtreeoptionsを設定する。

  5. それ以外の場合:

    1. subtreeoptions["selfOnly"]の否定値を設定する。

    2. options["customElementRegistry"] が存在する場合、registryにその値を設定する。

    3. registryis scopedがfalseで、registrythisカスタム要素レジストリでない場合、 NotSupportedError "NotSupportedError" DOMException を投げる。

  6. registryがnullなら、カスタム要素レジストリの検索thisで実行した結果をregistryに設定する。

  7. ノードのクローンnodeに対して、documentthisを、 subtreesubtreeを、 fallbackRegistryregistryを設定して実行した結果を返す。

他の仕様は、すべてまたは一部のノードに対して採用手順を定義できます。 このアルゴリズムは、adoptアルゴリズム内で、nodeoldDocumentを受け取ります。

採用するために、ノード node文書 document に:

  1. oldDocumentnodeノード文書 とする。

  2. もし node が null でないなら、削除する node を。

  3. もし documentoldDocument でないなら:

    1. nodeシャドウを含む包含する子孫 のそれぞれ inclusiveDescendant について、シャドウを含む木順 で反復する:

      1. inclusiveDescendantノード文書document に設定する。

      2. もし inclusiveDescendantシャドウルート であり、次のいずれかが真なら:

        この場合、inclusiveDescendantカスタム要素レジストリdocument有効なグローバルカスタム要素レジストリ に設定する。

      3. それ以外で、inclusiveDescendant要素 である場合:

        1. inclusiveDescendant属性リスト 内の各 属性ノード文書document に設定する。

        2. もし inclusiveDescendantカスタム要素レジストリ が null であるか、 または カスタム要素レジストリスコープ設定 が false なら、 inclusiveDescendantカスタム要素レジストリdocument有効なグローバルカスタム要素レジストリ に設定する。

    2. nodeシャドウを含む包含する子孫 のうち カスタム であるすべての inclusiveDescendant について、 カスタム要素コールバックリアクションをキューに追加する。 inclusiveDescendant、コールバック名 "adoptedCallback"、および « oldDocument, document » を用いる。

    3. nodeシャドウを含む包含する子孫 のそれぞれ inclusiveDescendant について、 adopting stepsinclusiveDescendantoldDocument で実行する。

adoptNode(node) メソッド手順は以下の通り:

  1. もし node文書 なら、例外を投げる "NotSupportedError" DOMException

  2. もし nodeシャドウルート なら、例外を投げる "HierarchyRequestError" DOMException

  3. もし nodeDocumentFragment 型の ノード で、その ホスト が null でない場合は、リターンする。

  4. 採用 nodethis に。

  5. node を返す。


Null または CustomElementRegistry オブジェクト registry は、 グローバルカスタム要素レジストリである もし registry が null でなく、かつ registryスコープ設定 が false の場合。

文書 document有効なグローバルカスタム要素レジストリ は次の通り:

  1. もし documentカスタム要素レジストリ グローバルカスタム要素レジストリである なら、documentカスタム要素レジストリ を返す。

  2. null を返す。


createAttribute(localName) メソッド手順は以下の通り:

  1. もし localName有効な属性ローカル名 でない場合、 例外を投げる "InvalidCharacterError" DOMException

  2. もし thisHTML 文書 なら localNameASCII小文字 での localName に設定する。
  3. 新しい 属性 を返す。その ローカル名localName で、 ノード文書this

createAttributeNS(namespace, qualifiedName) メソッド手順は以下の通り:

  1. (namespace, prefix, localName) を 妥当性検証と抽出した結果とする。 namespace および qualifiedName を "attribute" を指定して。

  2. 新しい 属性 を返す。その 名前空間namespace名前空間接頭辞prefixローカル名localNameノード文書this


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

  1. constructorをnullにする。

  2. interfaceが次の表の1列目のいずれかの文字列とASCII大文字小文字無視で一致する場合、同じ行の2列目のインターフェースを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 "NotSupportedError" DOMException を投げる。

  4. constructorで示されるインターフェースがthisの関連グローバルオブジェクトに公開されていない場合、 NotSupportedError "NotSupportedError" DOMException を投げる。

    通常、ユーザーエージェントは特定の設定でタッチイベントのサポートを無効化している場合があり、その場合この条件によって TouchEvent インターフェースが対象になります。

  5. eventconstructorに与えてイベント生成を実行した結果とする。

  6. eventtype 属性を空文字列に初期化する。

  7. eventtimeStamp 属性を現在の高精度タイムthis関連グローバルオブジェクトで呼び出した結果に初期化する。

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

  9. eventinitialized flagを解除する。

  10. eventを返す。

Event のコンストラクタを使うべきです。


createRange()メソッドの手順は、新しい ライブレンジを(this, 0)を 開始および 終了として返すことです。

Range() コンストラクタも代わりに利用できます。


createNodeIterator(root, whatToShow, filter) メソッドの手順は以下の通りです:

  1. iteratorを新しいNodeIterator オブジェクトとする。

  2. iteratorrootおよびiteratorreferencerootに設定する。

  3. iteratorpointer before referenceをtrueに設定する。

  4. iteratorwhatToShowwhatToShowに設定する。

  5. iteratorfilterfilterに設定する。

  6. iteratorを返す。

createTreeWalker(root, whatToShow, filter) メソッドの手順は以下の通りです:

  1. walkerを新しいTreeWalker オブジェクトとする。

  2. walkerrootおよびwalkercurrentrootに設定する。

  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有効なドキュメント型名でない場合、"InvalidCharacterError" DOMException を投げる。

  2. 新しいdoctypeを返す。その namenamepublic IDpublicIdsystem IDsystemIdノード文書documentthisに関連付けられたもの)に設定する。

createDocument(namespace, qualifiedName, doctype) メソッドの手順は以下の通りです:

  1. documentを新しいXMLDocumentとする。

  2. elementをnullとする。

  3. qualifiedNameが空文字列でなければ、element内部createElementNS手順documentnamespacequalifiedName、空の辞書で実行した結果を設定する。

  4. doctypeが非nullなら、追加doctypedocumentに追加する。

  5. elementが非nullなら、追加elementdocumentに追加する。

  6. documentオリジンthisに関連付けられたdocumentオリジンとする。

  7. documentコンテントタイプnamespaceによって決定される:

    HTML名前空間
    application/xhtml+xml
    SVG名前空間
    image/svg+xml
    その他の名前空間
    application/xml
  8. documentを返す。

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

  1. docを新しいdocumentHTMLドキュメント)とする。

  2. docコンテントタイプを"text/html"に設定する。

  3. 新しいdoctypenameが"html"、ノード文書doc)をdocに追加する。

  4. doc要素生成doc、"html"、HTML名前空間)の結果を追加する。

  5. 先ほど生成したhtml要素に要素生成doc、"head"、HTML名前空間)の結果を追加する。

  6. titleが指定されていれば:

    1. 先ほど生成したhead要素に要素生成doc、"title"、HTML名前空間)の結果を追加する。

    2. 先ほど生成したtitle要素に、新しいText ノードdatatitle(空文字列もあり得る)、ノード文書doc)を追加する。

  7. 先ほど生成したhtml要素に要素生成doc、"body"、HTML名前空間)の結果を追加する。

  8. docオリジンthisに関連付けられたdocumentオリジンとする。

  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 を含む包括的祖先 であるとは、A包括的祖先である場合、 または Brootが非 null のhostを持ち、 ABroothosthost を含む包括的祖先である場合です。

DocumentFragment ノードホスト の概念は、HTMLの template 要素や シャドウルート に有用であり、 挿入前 および 置換 アルゴリズムに影響を与える。

tree = new DocumentFragment()
新しい DocumentFragment ノード を返す。

new DocumentFragment() コンストラクタ手順は、thisノード文書現在のグローバルオブジェクト関連付けられたDocument に設定することです。

4.8. インターフェイス ShadowRoot

[Exposed=Window]
interface ShadowRoot : DocumentFragment {
  readonly attribute ShadowRootMode mode;
  readonly attribute boolean delegatesFocus;
  readonly attribute SlotAssignmentMode slotAssignment;
  readonly attribute boolean clonable;
  readonly attribute boolean serializable;
  readonly attribute Element host;

  attribute EventHandler onslotchange;
};

enum ShadowRootMode { "open", "closed" };
enum SlotAssignmentMode { "manual", "named" };

ShadowRoot ノードは単に シャドウルートとして知られている。

シャドウルート関連ホストは決してnullにはならない。

シャドウルートには モード ("open" または "closed")が関連付けられている。

シャドウルートには 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. AArootホストに設定する。

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 であれば、属性を作成し、namespacenamespacenamespace prefixprefixlocal namelocalNamevaluevaluenode documentelementnode document とし、 これを追加して element に追加し、リターンする。
  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の概念とし、要素ごとに1つだけ許可し、その値は id属性によって与えられます。

属性変更手順を使って要素IDを更新します:

  1. もし localNameid であり、namespace が null かつ value が null または空文字列であれば、elementID を未設定にする。

  2. それ以外で localNameid かつ namespace が null の場合、elementIDvalue に設定する。

本仕様は、あらゆる 要素 における classidslot 属性について要件を定義しているが、それらを使用することが適合であるかどうかは定めていない。


ノードElement 型の は、その 親要素(parent 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 に一致する element の最初の 属性 の値を返します。該当する 属性 がなければ null を返します。

element . getAttributeNS(namespace, localName)

namespace かつ localName に一致する element属性 の値を返します。該当する 属性 がなければ null を返します。

element . setAttribute(qualifiedName, value)

qualifiedName に一致する element の最初の 属性value に設定します。

element . setAttributeNS(namespace, localName, value)

namespace かつ localName に一致する element属性value に設定します。

element . removeAttribute(qualifiedName)

qualifiedName に一致する element の最初の 属性 を削除します。

element . removeAttributeNS(namespace, localName)

namespace かつ localName に一致する element属性 を削除します。

element . toggleAttribute(qualifiedName [, force])

force が指定されていなければ qualifiedName をトグルします。存在すれば削除、なければ追加します。force が true なら qualifiedName を追加し、false なら削除します。

qualifiedName が存在していれば true、そうでなければ false を返します。

element . hasAttribute(qualifiedName)

elementqualifiedName に一致する 属性 を持つ場合は true、そうでなければ false を返します。

element . hasAttributeNS(namespace, localName)

elementnamespace かつ localName に一致する 属性 を持つ場合は true を返します。

hasAttributes()メソッド手順は、this属性リスト空であればfalse、そうでなければtrueを返すことです。

attributesゲッター手順は、 関連付けられたNamedNodeMapを返すことです。

getAttributeNames()メソッド手順は 修飾名属性ごとに、this属性リストの順序で返すことです。なければ新しいリストを返します。

これらは一意である保証はありません。

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

  1. attr名前で属性を取得する(引数は qualifiedNamethis)の結果とする。

  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有効な属性ローカル名でない場合、throwし、 "InvalidCharacterError" DOMException を発生させる。

    パラメータ名とは異なり、 qualifiedName は、既にその修飾名の属性が存在する場合のみ 修飾名として扱われる。それ以外の場合は新しい属性のローカル名として扱われる。バリデーションが必要なのは後者の場合のみである。

  2. thisHTML 名前空間にあり、そのノードドキュメントHTML ドキュメントである場合、 qualifiedNameASCII 小文字に変換する。

  3. verifiedValue を、 get trusted type compliant attribute valuequalifiedName, null, this, value を渡して呼び出した結果とする。[TRUSTED-TYPES]

  4. attribute を、属性リスト内で 修飾名qualifiedName である最初の属性(なければ null)とする。

  5. attribute が null でなければ、変更し、attribute の値を verifiedValue にして return する。

  6. attribute を新しい 属性とし、そのローカル名qualifiedNameverifiedValueノードドキュメントthisノードドキュメントとする。

  7. 追加 attributethis に。

setAttributeNS(namespace, qualifiedName, value) メソッドの手順は以下のとおり:

  1. (namespace, prefix, localName) を バリデートし抽出するnamespace および qualifiedName、"element" を指定)した結果とする。

  2. verifiedValue を、 get trusted type compliant attribute valuelocalName, namespace, this, value を渡して呼び出した結果とする。[TRUSTED-TYPES]

  3. 属性値を設定するthislocalNameverifiedValueprefixnamespace を使用)。

removeAttribute(qualifiedName) メソッドの手順は、属性を削除するqualifiedNamethis を与える)を実行し、undefined を返す。

removeAttributeNS(namespace, localName) メソッドの手順は、属性を削除するnamespacelocalNamethis を与える)を実行し、undefined を返す。

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

  1. thisHTML 名前空間にあり、そのノードドキュメントHTML ドキュメントである場合、 qualifiedNameASCII 小文字に変換する。

  2. this属性持つ場合、かつその修飾名qualifiedName の場合は true、そうでなければ false を返す。

toggleAttribute(qualifiedName, force) メソッドの手順は以下のとおり:

  1. もし qualifiedName有効な属性ローカル名でない場合、throwし、 "InvalidCharacterError" DOMException を発生させる。

    なぜローカル名としてバリデートするのかは、上記の議論を参照。

  2. thisHTML 名前空間にあり、そのノードドキュメントHTML ドキュメントである場合、 qualifiedNameASCII 小文字に変換する。

  3. attribute を、属性リスト内で 修飾名qualifiedName である最初の属性(なければ null)とする。

  4. attribute が null の場合:

    1. force が指定されていないか true の場合、属性を作成し、そのローカル名qualifiedNameを空文字列、ノードドキュメントthisノードドキュメントとし、追加して this に追加し、true を返す。

    2. false を返す。

  5. それ以外の場合、force が指定されていないか false の場合は、 属性を削除するqualifiedNamethis を与える)を実行し、false を返す。

  6. true を返す。

hasAttributeNS(namespace, localName) メソッドの手順は以下のとおり:

  1. namespace が空文字列であれば、null に設定する。

  2. this属性持つ場合、かつその名前空間namespace で、ローカル名localName の場合は true、そうでなければ false を返す。


getAttributeNode(qualifiedName) メソッドの手順は、属性を取得するqualifiedNamethis を与える)した結果を返す。

getAttributeNodeNS(namespace, localName) メソッドの手順は、属性を取得するnamespacelocalNamethis を与える)した結果を返す。

setAttributeNode(attr) および setAttributeNodeNS(attr) メソッドの手順は、 属性を設定するattrthis)の結果を返す。

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

  1. this属性リストattr含まない場合、throwし、"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. sセレクターを構文解析するselectors から)。 [SELECTORS4]

  2. もし s が失敗なら、throw し、 "SyntaxError" DOMException を発生させる。

  3. elementsthis包含祖先要素のみ、逆ツリー順序)とする。

  4. elements の各 element について: もし セレクターを要素に対して照合するselement、および scoping root this を用いて成功を返すなら、element を返します。 [SELECTORS4]

  5. null を返す。

matches(selectors) および webkitMatchesSelector(selectors) メソッドの手順は:

  1. sセレクターを構文解析するselectors から)。 [SELECTORS4]

  2. もし s が失敗なら、throw し、 "SyntaxError" DOMException を発生させる。

  3. セレクターを要素にマッチさせるsthisスコープルート 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 には関連付けられた 要素要素)があります。

NamedNodeMap オブジェクトの 属性リストは、その 要素属性リストです。


NamedNodeMap オブジェクトの対応プロパティインデックスは、属性リストのサイズから 1 を引いた範囲の 0 からの数字です。ただし、 属性リストの場合は対応プロパティインデックスはありません。

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 は抽象インターフェイスです。直接そのインスタンスを取得することはできません。これは TextProcessingInstruction、 および Commentnodes によって使用されます。

node は、CharacterData インターフェイスを継承している場合、関連付けられた可変の文字列である data を持ちます。

データを置換するには、 ノード node、オフセットoffset、カウントcount、データdataを与えて、次の手順を実行します:

  1. lengthnodelengthとする。
  2. offsetlength より大きい場合、IndexSizeError IndexSizeError DOMExceptionをスローする。
  3. offset + countlength より大きい場合、 countlength - offset に設定する。
  4. mutation record の "characterData" を nodeに対し、null, null, nodedata, « », « », null, null でキューする。

  5. nodedataoffsetコード単位の後ろにdataを挿入する。
  6. delete offsetoffset + datalengthとする。
  7. delete offsetコード単位から countコード単位を nodedataから削除する。
  8. live rangestart nodenodestart offsetoffsetより大きく、 offset + count以下の場合、そのstart offsetoffsetに設定する。

  9. live rangeend nodenodeend offsetoffsetより大きく、 offset + count以下の場合、そのend offsetoffsetに設定する。

  10. live rangestart nodenodestart offsetoffset + countより大きい場合、 start offsetdatalengthだけ増やし、countだけ減らす。

  11. live rangeend nodenodeend offsetoffset + countより大きい場合、 end offsetdatalengthだけ増やし、countだけ減らす。

  12. nodeが null でない場合は、 子変更手順nodeに対して実行する。

データの部分文字列には、 ノードnode、オフセットoffset、カウントcountを与えて次の手順を実行します:

  1. lengthnodelengthとする。
  2. offsetlength より大きい場合、IndexSizeError IndexSizeError DOMExceptionをスローする。
  3. offset + countlength より大きい場合は、 nodedataoffset番目のコード単位から最後までの文字列を返して終了。
  4. それ以外は nodedataoffset番目のコード単位から offset+count番目のコード単位までの文字列を返す。

data ゲッターの手順は、 thisデータ を返すことです。セッターはノード this、オフセット 0、 カウント this長さ、および新しいデータ値で データを置換 しなければなりません。

length ゲッターの手順は、 this長さ を返すことです。

substringData(offset, count) メソッドの手順は、ノード this、オフセット offset、カウント countデータ部分文字列 を実行した結果を返すことです。

appendData(data) メソッドの手順は、 ノード this、オフセット this長さ、カウント 0、およびデータ dataデータを置換 することです。

insertData(offset, data) メソッドの手順は、ノード this、オフセット offset、カウント 0、およびデータ dataデータを置換 することです。

deleteData(offset, count) メソッドの手順は、ノード this、オフセット offset、カウント count、データとして空文字列で データを置換 することです。

replaceData(offset, count, data) メソッドの手順は、ノード this、オフセット offset、カウント count、データ dataデータを置換 することです。

4.11. インターフェイス Text

[Exposed=Window]
interface Text : CharacterData {
  constructor(optional DOMString data = "");

  [NewObject] Text splitText(unsigned long offset);
  readonly attribute DOMString wholeText;
};
text = new Text([data = ""])
新しい Text ノード を返す。その データdata である。
text . splitText(offset)
データを指定された offset で分割し、残りを Text ノードとして返す。
text . wholeText
すべての直接の Text ノードデータ を結合して返す。その兄弟(siblings)を対象とする。

排他的Textノード とは、Text ノードであり、CDATASection ノードではないものを指す。

連続したTextノード とは、ノード node に対して、 node、その 前の兄弟Text ノード である場合はそれ、 さらにその 連続した Text ノード も含み、 次の兄弟Text ノード である場合はそれと、 その 連続した Text ノード も含む(重複は除く)。

連続した排他的Textノード とは、ノード node に対して、 node、その 前の兄弟排他的Textノード である場合それと、 その 連続した排他的Textノード も含み、 次の兄弟排他的Textノードである場合それと、 その 連続した排他的Textノード も含む(重複は除く)。

子テキスト内容 とは、ノード node の全ての Text ノード データを、 ツリー順連結したものである。

子孫テキスト内容 とは、ノード node の すべての Text ノード 子孫データを、 ツリー順連結したものである。


new Text(data) コンストラクタの手順は、thisデータdata に設定し、 thisノード文書現在のグローバルオブジェクト関連Documentに設定することである。

Textノードを分割する には、Text ノード node と offset offset を指定し、次の手順を実行する:

  1. lengthnode長さとする。
  2. もし offsetlength より大きければ、例外を投げる "IndexSizeError" DOMException
  3. countlength からoffsetを引いた値とする。
  4. new dataデータの部分文字列nodeoffsetcount で求めた結果とする。
  5. new node を新しい Text ノード とし、nodeと同じ ノード文書を持つ。new nodeデータnew dataに設定する。
  6. parentnodeとする。
  7. もし parent が null でなければ:

    1. 挿入 new nodeparentnode次の兄弟の前に。

    2. ライブレンジのうち、開始ノードnodeで、開始オフセットoffsetより大きいもの全てについて、それらの開始ノードnew nodeに、開始オフセットoffset分減らす。

    3. ライブレンジのうち、終了ノードnodeで、終了オフセットoffsetより大きいもの全てについて、それらの終了ノードnew nodeに、終了オフセットoffset分減らす。

    4. ライブレンジのうち、開始ノードparentで、開始オフセットnodeインデックス+1なら、開始オフセットを1増やす。

    5. ライブレンジのうち、終了ノードparentで、終了オフセットnodeインデックス+1なら、終了オフセットを1増やす。

  8. データの置換nodeoffsetcount、空文字列で実行する。
  9. new node を返す。

splitText(offset) メソッドの手順は、Textノードを分割するthis と offset offset で実行することである。

wholeText のゲッターの手順は、 連続したTextノードについて データ連結し、 thisに対して ツリー順で返すことである。

4.12. インターフェイス CDATASection

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

4.13. インターフェイス ProcessingInstruction

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

ProcessingInstruction ノード は、関連付けられた ターゲット を持ちます。

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

4.14. インターフェイス Comment

[Exposed=Window]
interface Comment : CharacterData {
  constructor(optional DOMString data = "");
};
comment = new Comment([data = ""])
新しいComment ノードを返します。その datadataです。

new Comment(data) コンストラクターの手順は、thisdatadata に設定し、 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 ゲッターの手順は、this開始ノード を返すことです。

startOffset ゲッターの手順は、this開始オフセット を返すことです。

endContainer ゲッターの手順は、this終了ノード を返すことです。

endOffset ゲッターの手順は、this終了オフセット を返すことです。

collapsed ゲッターの手順は、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 ノードの場合、InvalidNodeTypeError InvalidNodeTypeError DOMExceptionをスローする。

  2. this開始を (init["startContainer"], init["startOffset"]) に、終了を (init["endContainer"], init["endOffset"]) に設定する。

StaticRange は、以下すべてが満たされる場合に 有効(valid)です:

5.5. インターフェイス Range

[Exposed=Window]
interface Range : AbstractRange {
  constructor();

  readonly attribute Node commonAncestorContainer;

  undefined setStart(Node node, unsigned long offset);
  undefined setEnd(Node node, unsigned long offset);
  undefined setStartBefore(Node node);
  undefined setStartAfter(Node node);
  undefined setEndBefore(Node node);
  undefined setEndAfter(Node node);
  undefined collapse(optional boolean toStart = false);
  undefined selectNode(Node node);
  undefined selectNodeContents(Node node);

  const unsigned short START_TO_START = 0;
  const unsigned short START_TO_END = 1;
  const unsigned short END_TO_END = 2;
  const unsigned short END_TO_START = 3;
  short compareBoundaryPoints(unsigned short how, Range sourceRange);

  [CEReactions] undefined deleteContents();
  [CEReactions, NewObject] DocumentFragment extractContents();
  [CEReactions, NewObject] DocumentFragment cloneContents();
  [CEReactions] undefined insertNode(Node node);
  [CEReactions] undefined surroundContents(Node newParent);

  [NewObject] Range cloneRange();
  undefined detach();

  boolean isPointInRange(Node node, unsigned long offset);
  short comparePoint(Node node, unsigned long offset);

  boolean intersectsNode(Node node);

  stringifier;
};

Range インターフェイスを実装するオブジェクトは ライブ範囲 と呼ばれます。

ツリーを変更するアルゴリズム(特に 挿入除去移動データ置換分割 アルゴリズム)は、そのツリーに関連付けられたライブ範囲を変更します。

ルートは、ライブ範囲開始ノードルートです。

ノード node包含される となるのは、ライブ範囲 rangeに対し、nodeルートrangeルートと一致し、(node, 0) が かつ range開始、 (node, node長さ) が かつ range終了の場合です。

ノード部分的に包含されるのは、ライブ範囲開始ノード包括的祖先だが終了ノードではない場合、または逆の場合です。

これらの定義をよりよく理解するためのいくつかの事実:

ライブレンジ事前削除手順は、ノード node に対して次のように行います:

  1. parentnode とする。

  2. アサートparent は null ではない。

  3. indexnodeインデックス とする。

  4. node包含的子孫を開始ノードに持つライブレンジごとに、その開始を (parent, index) に設定する。

  5. node包含的子孫を終了ノードに持つライブレンジごとに、その終了を(parent, index) に設定する。

  6. parent を開始ノードとし、開始オフセットindex より大きいライブレンジごとに、その開始オフセットを1減らす。

  7. parent を終了ノードとし、終了オフセットindex より大きいライブレンジごとに、その終了オフセットを1減らす。


range = new Range()
新しいライブ範囲を返します。

new Range() コンストラクタ手順は、 this開始終了を (current global object関連付けられたDocument, 0) に設定することです。


container = range . commonAncestorContainer
range開始ノード および 終了ノード の両方の 祖先であり、 ドキュメント から最も離れている ノードを返します。

commonAncestorContainerゲッター手順は:

  1. container開始ノードとする。
  2. container終了ノード包括的祖先でない間、 containercontainerにする。
  3. containerを返す。

開始または終了を設定する には、range境界点 (node, offset)を与え、次の手順を実行します:

  1. nodedoctypeの場合、 InvalidNodeTypeError InvalidNodeTypeError DOMExceptionをスローする。
  2. offsetnode長さより大きい場合、 IndexSizeError IndexSizeError DOMExceptionをスローする。
  3. bp境界点 (node, offset)とする。
  4. この手順が「開始を設定する」として呼ばれた場合
    1. rangeルートnodeルートと異なる場合、 またはbprange終了より の場合は、 range終了bpに設定する。
    2. range開始bpに設定する。
    この手順が「終了を設定する」として呼ばれた場合
    1. rangeルートnodeルートと異なる場合、 またはbprange開始より の場合は、 range開始bpに設定する。
    2. range終了bpに設定する。

setStart(node, offset)メソッド手順は、 開始を設定する (this境界点(node, offset)) を実行することです。

setEnd(node, offset)メソッド手順は、 終了を設定する (this境界点(node, offset)) を実行することです。

setStartBefore(node)メソッド手順は:

  1. parentnodeとする。
  2. parentが null の場合、InvalidNodeTypeError InvalidNodeTypeError DOMExceptionをスローする。
  3. 開始を設定する (this境界点( parent, nodeインデックス)) を実行する。

setStartAfter(node)メソッド手順は:

  1. parentnodeとする。

  2. parentが null の場合、InvalidNodeTypeError InvalidNodeTypeError DOMExceptionをスローする。

  3. 開始を設定する (this境界点( parent, nodeインデックス+1)) を実行する。

setEndBefore(node)メソッド手順は:

  1. parentnodeとする。
  2. parentが null の場合、InvalidNodeTypeError InvalidNodeTypeError DOMExceptionをスローする。
  3. 終了を設定する (this境界点( parent, nodeインデックス)) を実行する。

setEndAfter(node)メソッド手順は:

  1. parentnodeとする。

  2. parentが null の場合、InvalidNodeTypeError InvalidNodeTypeError DOMExceptionをスローする。

  3. 終了を設定する (this境界点( parent, nodeインデックス+1)) を実行する。

collapse(toStart)メソッド手順は、 toStartがtrueなら終了開始に設定し、そうでなければ 開始終了に設定することです。

ノードを選択するには、 ノード node範囲 range内で 次の手順を実行します:

  1. parentnodeとする。

  2. parentが null の場合、InvalidNodeTypeError InvalidNodeTypeError DOMExceptionをスローする。

  3. indexnodeインデックスとする。

  4. range開始境界点( parent, index)に設定する。

  5. range終了境界点( parent, index+1)に設定する。

selectNode(node)メソッド手順は、 ノードを選択する (node, this) を実行することです。

selectNodeContents(node)メソッド手順は:

  1. nodedoctypeの場合、InvalidNodeTypeError InvalidNodeTypeError DOMExceptionをスローする。

  2. lengthnode長さとする。

  3. 開始境界点(node, 0) に設定する。

  4. 終了境界点(node, length) に設定する。


compareBoundaryPoints(how, sourceRange) メソッドの手順は以下の通りです:

  1. how

    以外の場合は、NotSupportedError NotSupportedError DOMExceptionをスローする。
  2. thisルートsourceRangeルートと異なる場合は、 WrongDocumentError WrongDocumentError DOMExceptionをスローする。
  3. howが以下の場合:

    START_TO_START:
    this pointthis開始とし、 other pointsourceRange開始とする。
    START_TO_END:
    this pointthis終了とし、 other pointsourceRange開始とする。
    END_TO_END:
    this pointthis終了とし、 other pointsourceRange終了とする。
    END_TO_START:
    this pointthis開始とし、 other pointsourceRange終了とする。
  4. this pointother pointに対する位置

    −1を返す。
    等しい
    0を返す。
    1を返す。

deleteContents()メソッド手順は:

  1. thiscollapsed の場合は、何もせず return する。

  2. original start nodeoriginal start offsetoriginal end nodeoriginal end offsetthisstart nodestart offsetend nodeend offset とする。
  3. もし original start nodeoriginal end node であり、それが CharacterData node であるなら、ノード original start node、オフセット original start offset、カウント original end offset から original start offset を引いた値、データは空文字列で replace data し、return する。

  4. nodes to remove を、nodes の内、contained in this で、tree order で並び、また node の親 parent が同じく contained in this の場合は除外したリストとする。
  5. もし original start nodeinclusive ancestor of original end node であれば、 new nodeoriginal start node を、 new offsetoriginal start offset を代入する。
  6. それ以外の場合:
    1. reference nodeoriginal start node とする。
    2. reference node が null でなく、 かつ original end node包含的祖先 でない間は、 reference node をその にする。
    3. new nodereference node にし、 new offsetreference nodeインデックス に 1 を加えた値に設定する。

      もし reference node が null なら、 それは このレンジのルート であり、 また original end node包含的祖先 なので、この状況にはならない。

  7. もし original start nodeCharacterData ノード であれば、 replace data を使用し、 ノード original start node、オフセット original start offset、カウント original start node長さoriginal start offset、データを空文字列で置換する。

  8. nodes to remove の各 nodeツリー順remove する。

  9. もし original end nodeCharacterData ノード であれば、 replace data を使用し、 ノード original end node、オフセット 0、カウント original end offset、データを空文字列で置換する。

  10. 開始 および 終了 を (new node, new offset) に設定する。

live range live range range を抽出するには、次の手順を踏む:

  1. fragment を新しい DocumentFragment ノードとして作成し、 その ノード文書range開始ノードノード文書 に設定する。

  2. もし rangecollapsed なら、fragment を返す。

  3. original start nodeoriginal start offsetoriginal end nodeoriginal end offset を それぞれ range開始ノード開始オフセット終了ノード終了オフセット とする。
  4. もし original start nodeoriginal end node と等しく、かつそれが CharacterData ノード の場合:

    1. cloneクローンとして original start node から生成する。
    2. clonedataoriginal start node から、offset original start offset、 count original end offsetoriginal start offset部分文字列化した結果に設定する。
    3. Append を使い、clonefragment に追加する。
    4. Replace data を使い、 original start node の offset original start offset から count original end offsetoriginal start offset を空文字列で置き換える。
    5. fragment を返す。
  5. common ancestororiginal start node とする。
  6. common ancestor包含祖先でない間は、 original end node の自分の へと辿る。
  7. first partially contained child を null とする。
  8. もし original start node包含祖先でなければ、 first partially contained childcommon ancestor の子でレンジに 部分的に含まれる最初の とする。
  9. last partially contained child を null とする。
  10. もし original end node包含祖先でなければ、 last partially contained childcommon ancestor の子でレンジに 部分的に含まれる最後の とする。

    これらの変数代入は常に筋が通っています。 たとえば original start nodeoriginal end node包含祖先でない場合、 original start node 自体も 部分的に含まれる状態であり、 その祖先も common ancestor の子まで同様です。 common ancestororiginal start node であることはありません(それは original end node包含祖先でなければならないため)。その他のケースも同様です。両方が定義されている場合この2つの子は一致しません。

  11. contained childrencommon ancestor の全ての のうち range含まれるものを、 ツリー順でリスト化したものとする。
  12. もし contained children のいずれかが doctype なら、 throwし、 "HierarchyRequestError" DOMException を投げる。

    最初や最後の部分的に含まれるノードについて心配する必要はありません。 doctypeは 部分的に含まれることは決してなく、レンジの境界点にもなれず、 何かの祖先になることもできません。

  13. もし original start node包含祖先であれば、 new nodeoriginal start nodenew offsetoriginal start offset に設定する。
  14. それ以外の場合:
    1. reference nodeoriginal start node とする。
    2. reference nodeが null でなく、 かつ original end node包含祖先でない間は reference node をその に進める。
    3. new nodereference node に、 new offsetreference nodeインデックス に 1を足した値に設定する。

      もし reference node が null なら、 それは rangeルートであり、 包含祖先なので、 このケースには至りません。

  15. もし first partially contained childCharacterData ノード であれば:

    この場合、first partially contained childoriginal start nodeです。

    1. cloneクローンとして original start node から作成する。

    2. clonedata を、original start node部分文字列(offset original start offset から original start node長さoriginal start offset)で 設定する。

    3. Append を使い clonefragment に追加する。

    4. Replace data を使い、 original start node の該当部分(offset original start offset から original start node の長さ − original start offsetぶん)を空文字列に置換する。

  16. そうでなく、first partially contained child が null でなければ:
    1. cloneクローンとして first partially contained child から作成する。
    2. Append を使い clonefragment に追加する。
    3. subrange を新しいライブレンジとして作成し、 開始を (original start node, original start offset)、 終了を (first partially contained child, first partially contained child長さ) に指定する。
    4. subfragmentextracting subrange の結果として取得する。

    5. Append を使い subfragmentclone に追加する。
  17. contained children の各 contained child に対し append を使い contained childfragment に追加する。

  18. もし last partially contained childCharacterData ノード であれば:

    この場合、last partially contained childoriginal end nodeです。

    1. cloneクローンとして original end node から作成する。
    2. clonedatasubstringingによって original end node のデータの 0 から original end offset までに設定する。
    3. Append を使い clonefragment に追加する。
    4. Replace data を使い original end node の 0 から original end offset ぶんを空文字列に置換する。
  19. そうでなく、last partially contained child が null でなければ:
    1. cloneクローンとして last partially contained child から作成する。
    2. Append を使い clonefragment に追加する。
    3. subrange を新しいライブレンジとして作成し、 開始を (last partially contained child, 0)、 終了を (original end node, original end offset) に指定する。
    4. subfragmentextracting subrange の結果として取得する。

    5. Append を使い subfragmentclone に追加する。
  20. range開始 および 終了 を (new node, new offset) に設定する。
  21. fragment を返す。

extractContents() メソッドの手順は、extracting this を返すことである。

内容を複製する live range range については、次の手順を実行する:

  1. fragment を新しい DocumentFragment ノードとして作成し、 その ノード文書range開始ノードノード文書にする。

  2. もし range折りたたまれている場合、fragment を返す。

  3. original start nodeoriginal start offsetoriginal end nodeoriginal end offset を それぞれ range開始ノード開始オフセット終了ノード終了オフセット とする。
  4. もし original start nodeoriginal end node と等しく、さらにそれが CharacterData ノードであれば:

    1. cloneクローンとして original start node から作成する。
    2. clonedata を、 original start node のデータを offset original start offset から original end offsetoriginal start offset の長さで 部分文字列化した結果に設定する。
    3. Append を使い clonefragment に追加する。
    4. fragment を返す。
  5. common ancestororiginal start node とする。
  6. common ancestor包含祖先でない間は、 original end node にたどる。
  7. first partially contained child を null とする。
  8. もし original start node包含祖先でなければ common ancestor の子(child)のうちレンジに 部分的に含まれる最初のものを first partially contained child とする。
  9. last partially contained child を null とする。
  10. もし original end node包含祖先でなければ、 common ancestor の子(child)のうちレンジに 部分的に含まれる最後のものを last partially contained child とする。

    これらの変数の代入は常に成立します。 例えば original start nodeoriginal end node包含祖先でない場合、 original start node 自体や 祖先もすべて 部分的に含まれるとして common ancestor の子に至ります。 common ancestororiginal start node であることはありません。なぜなら original end node包含祖先でなければならないためです。逆のケースも同様です。また、両者が定義されている場合でも同じ子にはなりません。

  11. contained childrencommon ancestor の子(children)のうち range含まれるもの全てを、 ツリー順でリスト化したものとする。
  12. もし contained childrendoctype が含まれていれば、 throw を投げ、 "HierarchyRequestError" DOMException

    最初または最後の部分的に含まれるノードについては考慮不要です。 doctypeは部分的に含まれることが絶対に無く、レンジの境界点にもならず、 何かの祖先にもなりません。

  13. もし first partially contained childCharacterData ノードであれば:

    この場合、first partially contained childoriginal start node です。

    1. cloneクローンとして original start node から作成する。

    2. clonedataoriginal start node のデータ offset original start offset から最後まで 部分文字列化した結果に設定する。

    3. Appendclonefragment に追加する。

  14. そうでなく、first partially contained child が null でない場合:
    1. cloneクローンとして first partially contained child から作成する。
    2. Appendclonefragment に追加する。
    3. subrange を新しいライブレンジとして作成し、 開始を (original start node, original start offset)、 終了を (first partially contained child, first partially contained child長さ) にする。
    4. subfragmentcloning the contentssubrange から得る。

    5. Appendsubfragmentclone に追加する。
  15. contained children の各 contained child に対して:

    1. cloneクローンsubtree に true を設定)として contained child から作成する。

    2. Appendclonefragment に追加する。

  16. もし last partially contained childCharacterData ノードであれば:

    この場合、last partially contained childoriginal end node です。

    1. cloneクローンとして original end node から作成する。
    2. clonedata部分文字列化original end node のデータ0から original end offset までの値に設定する。
    3. Appendclonefragment に追加する。
  17. そうでなく、last partially contained child が null でなければ:
    1. cloneクローンとして last partially contained child から作成する。
    2. Appendclonefragment に追加する。
    3. subrange を新しいライブレンジとして作成し、 開始を (last partially contained child, 0)、 終了を (original end node, original end offset) にする。
    4. subfragmentcloning the contentssubrange から得る。

    5. Appendsubfragmentclone に追加する。
  18. fragment を返す。

cloneContents() メソッドの手順は、 cloning the contents of this を返すことである。

挿入としてノード nodeライブレンジ range に挿入するには、次の手順を実行する:

  1. もしrange開始ノードProcessingInstruction または Comment ノードであるか、または Text ノードでその が null である場合、あるいは node そのものである場合、throw し、 "HierarchyRequestError" DOMException を投げる。
  2. referenceNode を null とする。
  3. もしrange開始ノードText ノードである場合、 referenceNode をその Text ノードとする。
  4. そうでなければ、referenceNode開始ノードのうち インデックス開始オフセット に等しいもの、該当する子がなければ null とする。
  5. parentreferenceNode が null なら range開始ノード、 そうでなければ referenceNodeとする。
  6. 事前挿入の有効性parentreferenceNode の前へ node を挿入する形で確認する。
  7. もしrange開始ノードText ノードなら、 それを分割し、 referenceNode をその分割結果とする(offset は range開始オフセット)。
  8. もし nodereferenceNode と等しければ、referenceNode をその 次の兄弟にする。
  9. もし node が null でなければ、removenode を親から取り除く。

  10. newOffsetreferenceNode が null なら parent長さ、そうでなければ referenceNodeインデックスを代入する。

  11. もし nodeDocumentFragment ノードなら node の長さ分、 そうでなければ 1 だけ newOffset を増やす。

  12. pre-insertnodeparentreferenceNode の前に挿入する。
  13. もし range折りたたまれているなら、 range終了 を (parent, newOffset) に設定する。

insertNode(node) メソッドの手順は 挿入 を用いて nodethis に追加することである。

surroundContents(newParent) メソッドの手順は以下の通り:

  1. もし非 Text ノード部分的に含まれる場合は、 throw し、 "InvalidStateError" DOMException を投げる。

  2. もし newParentDocumentDocumentType、 または DocumentFragment ノードなら throw し、 "InvalidNodeTypeError" DOMException を投げる。

    歴史的理由により CharacterData ノードはここではチェックされず、後で副作用としてthrowされます。

  3. fragment抽出 によって this から得る。

  4. もし newParent子ノードを持っていれば、 その中身をすべてreplace allでnullに置き換える。

  5. 挿入newParentthis に挿入する。

  6. appendfragmentnewParent に追加する。

  7. selectnewParentthis 内で選択する。

cloneRange() メソッドの手順は、新しい live range を返し、その startendthis と同じ値に設定する。

detach() メソッドの手順は何もしない。 その機能(Range オブジェクトの無効化)は廃止されたが、互換性のためメソッド自体は残されている。


position = range . comparePoint(node, offset)
点が範囲の前にあれば −1、範囲内にあれば 0、範囲の後にあれば 1 を返します。
intersects = range . intersectsNode(node)
rangenode と交差するかどうかを返します。

The isPointInRange(node, offset) method steps are:

  1. もし noderootthisroot と異なるなら、 false を返します。
  2. もし nodedoctype であれば、throw して "InvalidNodeTypeError" DOMException を発生させます。
  3. もし offsetnodelength より大きければ、 throw して "IndexSizeError" DOMException を発生させます。

  4. もし (node, offset) が before start または after end であれば、 false を返します。
  5. true を返します。

The comparePoint(node, offset) method steps are:

  1. もし noderootthisroot と異なるなら、throw して "WrongDocumentError" DOMException を発生させます。
  2. もし nodedoctype であれば、throw して "InvalidNodeTypeError" DOMException を発生させます。
  3. もし offsetnodelength より大きければ、 throw して "IndexSizeError" DOMException を発生させます。

  4. もし (node, offset) が before start であれば、 −1 を返します。
  5. もし (node, offset) が after end であれば、 1 を返します。
  6. 0 を返します。

The intersectsNode(node) method steps are:

  1. もし noderootthisroot と異なるなら、false を返します。
  2. 変数 parentnodeparent とします。
  3. もし parent が null であれば、true を返します。
  4. 変数 offsetnodeindex とします。
  5. もし (parent, offset) が before end であり、 かつ (parent, offset plus 1) が after start であれば、 true を返します。
  6. false を返します。

The stringification behavior must run these steps:

  1. s を空文字列とする。

  2. this開始ノードthis終了ノード と等しく、 かつそれが Text ノード であれば、その Text ノードデータthis開始オフセット から this終了オフセット までの部分文字列を返す。

  3. this開始ノードText ノード であれば、 その ノードデータthis開始オフセット から末尾までの部分文字列を s に追加する。

  4. 連結 した、データText ノード含まれているもの、this 内のものを ツリー順で) を s に追加する。

  5. this終了ノードText ノードであれば、 その ノードデータ の先頭から this終了オフセット までの部分文字列を s に追加する。

  6. s を返す。


createContextualFragment()getClientRects()、 および getBoundingClientRect() メソッドは他の仕様で定義されています。 [DOM-Parsing] [CSSOM-VIEW]

6. 走査

NodeIterator および TreeWalker オブジェクトは、ノード ツリーのフィルタリングおよび走査に使用できます。

NodeIterator および TreeWalker オブジェクトには、再帰的な呼び出しを避けるための active フラグ が関連付けられています。これは最初は未設定です。

NodeIterator および TreeWalker オブジェクトにはさらに、 rootノード)、 whatToShow(ビットマスク)、 filter(コールバック)も関連付けられます。

フィルタリングのために、 NodeIterator または TreeWalker オブジェクト traverser の中で、ノード node をフィルタリングするには、次の手順を行います:

  1. もし traverseractive フラグ が設定されている場合、"InvalidStateError" DOMException をスローする。

  2. nnodenodeType 属性値から 1 を引いた値とする。

  3. もし traverserwhatToShow の n ビット目(0が最下位ビット)が設定されていなければ、 FILTER_SKIP を返す。

  4. もし traverserfilter が null なら、 FILTER_ACCEPT を返す。

  5. traverseractive フラグ を設定する。

  6. result を、traverserfilter に対して、 "acceptNode"操作を node だけを引数として ユーザーオブジェクトの操作を呼び出すことで得る値とする。 これが例外をスローした場合は、traverseractive フラグ を解除し、例外を再スローする。

  7. traverseractive フラグ を解除する。

  8. result を返す。

6.1. インターフェイス NodeIterator

[Exposed=Window]
interface NodeIterator {
  [SameObject] readonly attribute Node root;
  readonly attribute Node referenceNode;
  readonly attribute boolean pointerBeforeReferenceNode;
  readonly attribute unsigned long whatToShow;
  readonly attribute NodeFilter? filter;

  Node? nextNode();
  Node? previousNode();

  undefined detach();
};

NodeIterator オブジェクトは Document オブジェクトの createNodeIterator() メソッドを使って作成できます。

NodeIterator オブジェクトには関連する イテレーターコレクションがあり、これは NodeIterator オブジェクトの root をルートとし、 すべての ノード にマッチするフィルターを持つ コレクションです。

NodeIterator オブジェクトには referenceノード)と pointer before reference(真偽値)も関連付けられています。

前述の通り、NodeIterator オブジェクトにはさらに active フラグrootwhatToShowfilter も備わっています。

NodeIterator 事前削除手順 は、nodeIteratortoBeRemovedNode を与えられたとき、次のように動作します:

  1. もし toBeRemovedNodenodeIteratorreference包含祖先でない場合、 または toBeRemovedNodenodeIteratorroot なら何もしないで戻る。

  2. もし nodeIteratorpointer before reference が true なら:

    1. nexttoBeRemovedNodefollowing ノードのうち、 nodeIteratorroot包含的子孫であり、かつ toBeRemovedNode包含的子孫でないもののうち最初のノード、なければ null とする。

    2. もし next がnullでなければ、 nodeIteratorreferencenext に設定し、終了。

    3. そうでなければ nodeIteratorpointer before reference を false に設定する。

      ここで手順は終了しない。

  3. toBeRemovedNode前の兄弟が null なら nodeIteratorreferencetoBeRemovedNode に設定し、 そうでなければ toBeRemovedNode前の兄弟包含的子孫でツリー順で最も後ろのノードに設定する。


root ゲッターの手順は、 thisroot を返す。

referenceNode ゲッターの手順は、 thisreference を返す。

pointerBeforeReferenceNode ゲッターの手順は、 thispointer before reference を返す。

whatToShow ゲッターの手順は、 thiswhatToShow を返す。

filter ゲッターの手順は、 thisfilter を返す。

走査(traverse) について、NodeIterator オブジェクト iterator と方向 direction が与えられたとき次の手順を実行する:

  1. nodeiteratorreference とする。

  2. beforeNodeiteratorpointer before reference とする。

  3. 以下を繰り返す:

    1. direction の値で分岐:

      next

      もし beforeNode が false なら、 iteratorイテレーターコレクションノードのうち nodefollowingなものの最初のものを node とする。 なければ null を返す。

      もし beforeNode が true なら false にする。

      previous

      もし beforeNode が true なら iteratorイテレーターコレクションノードのうち nodeprecedingなものの最初のものを node とする。 なければ null を返す。

      もし beforeNode が false なら、true にする。

    2. resultフィルタリングnodeiterator から得る。

    3. resultFILTER_ACCEPT なら break する。

  4. iteratorreferencenode にする。

  5. iteratorpointer before referencebeforeNode にする。

  6. node を返す。

nextNode() メソッドの手順は 走査this と next で実行した結果を返す。

previousNode() メソッドの手順は 走査this と previous で実行した結果を返す。

detach() メソッドの手順は何もしない。 この機能(NodeIterator オブジェクトを無効化すること)は削除されましたが、このメソッド自体は互換性のために残されています。

6.2. インターフェイス TreeWalker

[Exposed=Window]
interface TreeWalker {
  [SameObject] readonly attribute Node root;
  readonly attribute unsigned long whatToShow;
  readonly attribute NodeFilter? filter;
           attribute Node currentNode;

  Node? parentNode();
  Node? firstChild();
  Node? lastChild();
  Node? previousSibling();
  Node? nextSibling();
  Node? previousNode();
  Node? nextNode();
};

TreeWalker オブジェクトは Document オブジェクトの createTreeWalker() メソッドを使って作成できます。

TreeWalker オブジェクトには currentノード)が関連付けられています。

前述の通りTreeWalker オブジェクトには rootwhatToShowfilter も関連付けられています。

root ゲッターの手順は thisroot を返すことです。

whatToShow ゲッターの手順は thiswhatToShow を返すことです。

filter ゲッターの手順は thisfilter を返すことです。

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

currentNode セッターの手順は thiscurrent を指定された値に設定することです。


parentNode() メソッドの手順:

  1. nodethiscurrent とする。

  2. node が null でなく、thisroot でない限り繰り返す:

    1. nodenode に設定する。

    2. node が null でなく、フィルタリングnodethis を渡した結果が FILTER_ACCEPT であれば、thiscurrentnode にし node を返す。

  3. null を返す。

子供の走査について、walkertype を与えられたら次の手順:

  1. nodewalkercurrent にする。

  2. type が first なら nodenode最初の子 に、 last なら 最後の子 にする。

  3. node が null でない間繰り返す:

    1. resultフィルタリングnodewalker から得る。

    2. resultFILTER_ACCEPT なら walkercurrentnode にし node を返す。

    3. resultFILTER_SKIP なら:

      1. type が first なら childnode最初の子 に、 last なら 最後の子 にする。

      2. child が null でなければ nodechild にして continue

    4. node が null でない間繰り返す:

      1. type が first なら siblingnode次の兄弟 に、 last なら 前の兄弟 にする。

      2. sibling が null でない場合は nodesibling にして break

      3. parentnodeにする。

      4. parent が null、walkerroot または walkercurrent であれば null を返す。

      5. nodeparent にする。

  4. null を返す。

firstChild() メソッドの手順は 子供の走査this と first で実行する。

lastChild() メソッドの手順は 子供の走査this と last で実行する。

兄弟の走査について、walkertype を与えられたら次の手順:

  1. nodewalkercurrent にする。

  2. noderoot なら null を返す。

  3. 以下を繰り返す:

    1. type が next なら siblingnode次の兄弟 に、 previous なら 前の兄弟 にする。

    2. sibling が null でない間繰り返す:

      1. nodesibling にする。

      2. resultフィルタリングnodewalker から得る。

      3. resultFILTER_ACCEPT なら walkercurrentnode にして node を返す。

      4. type が next なら siblingnode最初の子 に、 previous なら 最後の子 にする。

      5. resultFILTER_REJECT または sibling が null なら、 type が next なら siblingnode次の兄弟 に、 previous なら 前の兄弟 にする。

    3. nodenode にする。

    4. node が null または walkerroot であれば null を返す。

    5. フィルタリングnodewalker から得た値が FILTER_ACCEPT の場合は null を返す。

nextSibling() メソッドの手順は 兄弟の走査this と next で実行する。

previousSibling() メソッドの手順は 兄弟の走査this と previous で実行する。

previousNode() メソッドの手順:

  1. nodethiscurrent にする。

  2. nodethisroot でない間繰り返す:

    1. siblingnode前の兄弟にする。

    2. sibling が null でない間繰り返す:

      1. nodesibling にする。

      2. resultフィルタリングnodethis から得る。

      3. resultFILTER_REJECT でないかつ nodeを持つ間:

        1. nodenode最後の子 にする。

        2. resultフィルタリングnodethis から得る。

      4. resultFILTER_ACCEPT なら thiscurrentnode にして node を返す。

      5. siblingnode前の兄弟 にする。

    3. nodethisroot または node が null なら null を返す。

    4. nodenode にする。

    5. フィルタリングnodethis から得る値が FILTER_ACCEPT なら、thiscurrentnode にし node を返す。

  3. null を返す。

nextNode() メソッドの手順:

  1. nodethiscurrent にする。

  2. resultFILTER_ACCEPT にする。

  3. 以下を繰り返す:

    1. resultFILTER_REJECT でない かつ nodeを持つ間繰り返す:

      1. node をその 最初の子 にする。

      2. resultフィルタリングnodethis から得る。

      3. resultFILTER_ACCEPT であれば thiscurrentnode にして node を返す。

    2. sibling を null にする。

    3. temporarynode にする。

    4. temporary が null でない間繰り返す:

      1. temporarythisroot であれば null を返す。

      2. siblingtemporary次の兄弟 にする。

      3. sibling が null でなければ nodesibling にし break

      4. temporary をその にする。

    5. resultフィルタリングnodethis から得る。

    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 オブジェクトは、関連付けられた トークン集合集合)を持ち、これは最初は空です。

DOMTokenList オブジェクトは、関連付けられた 要素属性ローカル名 も持ちます。

仕様によっては、 サポートされるトークンDOMTokenList の 関連付けられた 属性ローカル名 に対して定義する場合があります。

DOMTokenList オブジェクトの 検証手順 は、与えられた token に対して次の通りです:

  1. 関連付けられた 属性ローカル名サポートされるトークン を 定義していなければ、throwTypeError を投げます。

  2. lowercase tokentokenASCII小文字 でのコピーとします。

  3. lowercase tokenサポートされるトークン に含まれていれば、true を返します。

  4. false を返します。

DOMTokenList オブジェクトの 更新手順 は次の通りです:

  1. 関連付けられた 要素 に関連付けられた 属性 がなく、 トークン集合 が空の場合は何もせずに戻ります。

  2. 関連付けられた 要素 について、 関連付けられた 属性ローカル名順序付き集合シリアライザトークン集合 に対して実行した結果を使って 属性値を設定 します。

DOMTokenList オブジェクトの シリアライズ手順 は、 関連付けられた 要素 と 関連付けられた 属性ローカル名 を与えて 属性値取得 を実行した結果を返します。


DOMTokenList オブジェクトは、その関連付けられた 属性変更手順 を関連付けられた 要素 について持ちます:

  1. もし localName が関連付けられた属性の ローカル名 であり、 namespace が null かつ value も null であれば、 トークン集合 にします。

  2. それ以外で、localName が関連付けられた属性の ローカル名 であり、 namespace が null であれば、トークン集合valueパース したものに設定します。

DOMTokenList オブジェクトが生成されるとき、次を実行します:

  1. element を関連付けられた 要素 とします。

  2. localName を関連付けられた属性の ローカル名 とします。

  3. value属性値取得elementlocalName で実行した結果とします。

  4. elementlocalNamevaluevalue、null を使って 属性変更手順 を実行します。

tokenlist . length

トークンの数を返します。

tokenlist . item(index)
tokenlist[index]

インデックス index のトークンを返します。

tokenlist . contains(token)

token が存在する場合は true、そうでなければ false を返します。

tokenlist . add(tokens…)

渡された引数のうち、まだ存在しないものをすべて追加します。

どれかの引数が空文字列なら "SyntaxError" DOMException を投げます。

どれかの引数に ASCII空白 が含まれていれば "InvalidCharacterError" DOMException を投げます。

tokenlist . remove(tokens…)

渡された引数が存在すれば削除します。

どれかの引数が空文字列なら "SyntaxError" DOMException を投げます。

どれかの引数に ASCII空白 が含まれていれば "InvalidCharacterError" DOMException を投げます。

tokenlist . toggle(token [, force])

force が指定されていなければ token をトグルします。存在する場合は削除し、存在しない場合は追加します。force が true なら token を追加し(add() と同じ)、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トークン集合サイズ を返す必要があります。

このオブジェクトの サポートされるプロパティインデックス は、0 から オブジェクトの トークン集合サイズ−1 までの数字です。 ただし トークン集合 なら サポートされるプロパティインデックス はありません。

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

  1. indexthisトークン集合サイズ 以上なら null を返します。

  2. thisトークン集合[index] を返します。

contains(token) メソッドの手順は、 thisトークン集合[token] が 存在する なら true、そうでなければ false を返します。

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

  1. token について:

    1. token が空文字列なら throw で "SyntaxError" DOMException を投げます。

    2. tokenASCII空白 が含まれている場合、 throw で "InvalidCharacterError" DOMException を投げます。

  2. token について: 追加tokenthisトークン集合 に加えます。

  3. 更新手順 を実行します。

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

  1. token について:

    1. token が空文字列なら throw で "SyntaxError" DOMException を投げます。

    2. tokenASCII空白 が含まれている場合、 throw で "InvalidCharacterError" DOMException を投げます。

  2. tokens の各 token について:remove tokenthistoken set から削除する。

  3. 更新手順 を実行します。

toggle(token, force) メソッドの手順は次の通りです:

  1. token が空文字列なら throw で "SyntaxError" DOMException を投げます。

  2. tokenASCII空白 が含まれている場合、 throw で "InvalidCharacterError" DOMException を投げます。

  3. thisトークン集合[token] が 存在すれば

    1. force が未指定または false なら、削除tokenthisトークン集合 から削除し、更新手順 を実行して false を返します。

    2. true を返します。

  4. それ以外の場合、force が未指定または true なら、追加tokenthisトークン集合 に加え、 更新手順 を実行し true を返します。

  5. false を返します。

更新手順 は、web互換性のため toggle() で常に実行されるとは限りません。

replace(token, newToken) メソッドの手順は次の通りです:

  1. token または newToken のどちらかが空文字列なら throw で "SyntaxError" DOMException を投げます。

  2. token または newToken のどちらかに ASCII空白 が含まれている場合、 throw で "InvalidCharacterError" DOMException を投げます。

  3. thisトークン集合token が含まれていなければ false を返します。

  4. 置換tokenthisトークン集合 から newToken に置き換えます。

  5. 更新手順 を実行します。

  6. true を返します。

更新手順 はweb互換性のため replace() で常に実行されるとは限りません。

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

  1. 検証手順token で呼び出した結果を result とします。

  2. result を返します。

value 属性のゲッターは、 thisシリアライズ手順 を実行した結果を返す必要があります。

value 属性を設定するときは、 関連付けられた 要素 に対し 関連付けられた 属性ローカル名 および 指定された値を使って 属性値を設定 します。

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、 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. インフラストラクチャー標準. Living Standard. URL: https://infra.spec.whatwg.org/
[LONG-ANIMATION-FRAMES]
Long Animation Frames API. 編集者草案. 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 (第5版). 2008年11月26日. REC. URL: https://www.w3.org/TR/xml/
[XML-NAMES]
Tim Bray; et al. XML 1.0における名前空間 (第3版). 2009年12月8日. REC. URL: https://www.w3.org/TR/xml-names/

参考情報

[CSSOM-VIEW]
Simon Fraser; Emilio Cobos Álvarez. CSSOM View Module. URL: https://drafts.csswg.org/cssom-view/
[DOM-Level-3-XPath]
Ray Whitmer. Document Object Model (DOM) Level 3 XPath Specification. 2020年11月3日. NOTE. URL: https://www.w3.org/TR/DOM-Level-3-XPath/
[DOM-Parsing]
Travis Leithead. DOM Parsing and Serialization. URL: https://w3c.github.io/DOM-Parsing/
[FULLSCREEN]
Philip Jägenstedt. Fullscreen API Standard. Living Standard. URL: https://fullscreen.spec.whatwg.org/
[INDEXEDDB]
Nikunj Mehta; et al. Indexed Database API. URL: https://w3c.github.io/IndexedDB/
[XPath]
James Clark; Steven DeRose. XML Path Language (XPath) Version 1.0. 1999年11月16日. REC. URL: https://www.w3.org/TR/xpath-10/
[XSLT]
James Clark. XSL Transformations (XSLT) Version 1.0. 1999年11月16日. REC. URL: https://www.w3.org/TR/xslt-10/

IDL索引

[Exposed=*]
interface Event {
  constructor(DOMString type, optional EventInit eventInitDict = {});

  readonly attribute DOMString type;
  readonly attribute EventTarget? target;
  readonly attribute EventTarget? srcElement; // legacy
  readonly attribute EventTarget? currentTarget;
  sequence<EventTarget> composedPath();

  const unsigned short NONE = 0;
  const unsigned short CAPTURING_PHASE = 1;
  const unsigned short AT_TARGET = 2;
  const unsigned short BUBBLING_PHASE = 3;
  readonly attribute unsigned short eventPhase;

  undefined stopPropagation();
           attribute boolean cancelBubble; // legacy alias of .stopPropagation()
  undefined stopImmediatePropagation();

  readonly attribute boolean bubbles;
  readonly attribute boolean cancelable;
           attribute boolean returnValue;  // legacy
  undefined preventDefault();
  readonly attribute boolean defaultPrevented;
  readonly attribute boolean composed;

  [LegacyUnforgeable] readonly attribute boolean isTrusted;
  readonly attribute DOMHighResTimeStamp timeStamp;

  undefined initEvent(DOMString type, optional boolean bubbles = false, optional boolean cancelable = false); // legacy
};

dictionary EventInit {
  boolean bubbles = false;
  boolean cancelable = false;
  boolean composed = false;
};

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

[Exposed=*]
interface CustomEvent : Event {
  constructor(DOMString type, optional CustomEventInit eventInitDict = {});

  readonly attribute any detail;

  undefined initCustomEvent(DOMString type, optional boolean bubbles = false, optional boolean cancelable = false, optional any detail = null); // legacy
};

dictionary CustomEventInit : EventInit {
  any detail = null;
};

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

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

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

dictionary EventListenerOptions {
  boolean capture = false;
};

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

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

  [SameObject] readonly attribute AbortSignal signal;

  undefined abort(optional any reason);
};

[Exposed=*]
interface AbortSignal : EventTarget {
  [NewObject] static AbortSignal abort(optional any reason);
  [Exposed=(Window,Worker), NewObject] static AbortSignal timeout([EnforceRange] unsigned long long milliseconds);
  [NewObject] static AbortSignal _any(sequence<AbortSignal> signals);

  readonly attribute boolean aborted;
  readonly attribute any reason;
  undefined throwIfAborted();

  attribute EventHandler onabort;
};
interface mixin NonElementParentNode {
  Element? getElementById(DOMString elementId);
};
Document includes NonElementParentNode;
DocumentFragment includes NonElementParentNode;

interface mixin DocumentOrShadowRoot {
  readonly attribute CustomElementRegistry? customElementRegistry;
};
Document includes DocumentOrShadowRoot;
ShadowRoot includes DocumentOrShadowRoot;

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

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

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

  Element? querySelector(DOMString selectors);
  [NewObject] NodeList querySelectorAll(DOMString selectors);
};
Document includes ParentNode;
DocumentFragment includes ParentNode;
Element includes ParentNode;

interface mixin NonDocumentTypeChildNode {
  readonly attribute Element? previousElementSibling;
  readonly attribute Element? nextElementSibling;
};
Element includes NonDocumentTypeChildNode;
CharacterData includes NonDocumentTypeChildNode;

interface mixin ChildNode {
  [CEReactions, Unscopable] undefined before((Node or DOMString)... nodes);
  [CEReactions, Unscopable] undefined after((Node or DOMString)... nodes);
  [CEReactions, Unscopable] undefined replaceWith((Node or DOMString)... nodes);
  [CEReactions, Unscopable] undefined remove();
};
DocumentType includes ChildNode;
Element includes ChildNode;
CharacterData includes ChildNode;

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

[Exposed=Window]
interface NodeList {
  getter Node? item(unsigned long index);
  readonly attribute unsigned long length;
  iterable<Node>;
};

[Exposed=Window, LegacyUnenumerableNamedProperties]
interface HTMLCollection {
  readonly attribute unsigned long length;
  getter Element? item(unsigned long index);
  getter Element? namedItem(DOMString name);
};

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

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

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

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

[Exposed=Window]
interface MutationRecord {
  readonly attribute DOMString type;
  [SameObject] readonly attribute Node target;
  [SameObject] readonly attribute NodeList addedNodes;
  [SameObject] readonly attribute NodeList removedNodes;
  readonly attribute Node? previousSibling;
  readonly attribute Node? nextSibling;
  readonly attribute DOMString? attributeName;
  readonly attribute DOMString? attributeNamespace;
  readonly attribute DOMString? oldValue;
};

[Exposed=Window]
interface Node : EventTarget {
  const unsigned short ELEMENT_NODE = 1;
  const unsigned short ATTRIBUTE_NODE = 2;
  const unsigned short TEXT_NODE = 3;
  const unsigned short CDATA_SECTION_NODE = 4;
  const unsigned short ENTITY_REFERENCE_NODE = 5; // legacy
  const unsigned short ENTITY_NODE = 6; // legacy
  const unsigned short PROCESSING_INSTRUCTION_NODE = 7;
  const unsigned short COMMENT_NODE = 8;
  const unsigned short DOCUMENT_NODE = 9;
  const unsigned short DOCUMENT_TYPE_NODE = 10;
  const unsigned short DOCUMENT_FRAGMENT_NODE = 11;
  const unsigned short NOTATION_NODE = 12; // legacy
  readonly attribute unsigned short nodeType;
  readonly attribute DOMString nodeName;

  readonly attribute USVString baseURI;

  readonly attribute boolean isConnected;
  readonly attribute Document? ownerDocument;
  Node getRootNode(optional GetRootNodeOptions options = {});
  readonly attribute Node? parentNode;
  readonly attribute Element? parentElement;
  boolean hasChildNodes();
  [SameObject] readonly attribute NodeList childNodes;
  readonly attribute Node? firstChild;
  readonly attribute Node? lastChild;
  readonly attribute Node? previousSibling;
  readonly attribute Node? nextSibling;

  [CEReactions] attribute DOMString? nodeValue;
  [CEReactions] attribute DOMString? textContent;
  [CEReactions] undefined normalize();

  [CEReactions, NewObject] Node cloneNode(optional boolean subtree = false);
  boolean isEqualNode(Node? otherNode);
  boolean isSameNode(Node? otherNode); // legacy alias of ===

  const unsigned short DOCUMENT_POSITION_DISCONNECTED = 0x01;
  const unsigned short DOCUMENT_POSITION_PRECEDING = 0x02;
  const unsigned short DOCUMENT_POSITION_FOLLOWING = 0x04;
  const unsigned short DOCUMENT_POSITION_CONTAINS = 0x08;
  const unsigned short DOCUMENT_POSITION_CONTAINED_BY = 0x10;
  const unsigned short DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 0x20;
  unsigned short compareDocumentPosition(Node other);
  boolean contains(Node? other);

  DOMString? lookupPrefix(DOMString? namespace);
  DOMString? lookupNamespaceURI(DOMString? prefix);
  boolean isDefaultNamespace(DOMString? namespace);

  [CEReactions] Node insertBefore(Node node, Node? child);
  [CEReactions] Node appendChild(Node node);
  [CEReactions] Node replaceChild(Node node, Node child);
  [CEReactions] Node removeChild(Node child);
};

dictionary GetRootNodeOptions {
  boolean composed = false;
};

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

  [SameObject] readonly attribute DOMImplementation implementation;
  readonly attribute USVString URL;
  readonly attribute USVString documentURI;
  readonly attribute DOMString compatMode;
  readonly attribute DOMString characterSet;
  readonly attribute DOMString charset; // legacy alias of .characterSet
  readonly attribute DOMString inputEncoding; // legacy alias of .characterSet
  readonly attribute DOMString contentType;

  readonly attribute DocumentType? doctype;
  readonly attribute Element? documentElement;
  HTMLCollection getElementsByTagName(DOMString qualifiedName);
  HTMLCollection getElementsByTagNameNS(DOMString? namespace, DOMString localName);
  HTMLCollection getElementsByClassName(DOMString classNames);

  [CEReactions, NewObject] Element createElement(DOMString localName, optional (DOMString or ElementCreationOptions) options = {});
  [CEReactions, NewObject] Element createElementNS(DOMString? namespace, DOMString qualifiedName, optional (DOMString or ElementCreationOptions) options = {});
  [NewObject] DocumentFragment createDocumentFragment();
  [NewObject] Text createTextNode(DOMString data);
  [NewObject] CDATASection createCDATASection(DOMString data);
  [NewObject] Comment createComment(DOMString data);
  [NewObject] ProcessingInstruction createProcessingInstruction(DOMString target, DOMString data);

  [CEReactions, NewObject] Node importNode(Node node, optional (boolean or ImportNodeOptions) options = false);
  [CEReactions] Node adoptNode(Node node);

  [NewObject] Attr createAttribute(DOMString localName);
  [NewObject] Attr createAttributeNS(DOMString? namespace, DOMString qualifiedName);

  [NewObject] Event createEvent(DOMString interface); // legacy

  [NewObject] Range createRange();

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

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

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

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

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

  boolean hasFeature(); // 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?