DOM

現行標準 — 最終更新

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

概要

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

1. 基盤

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

この仕様で使用される用語の一部は、Encoding、 Selectors、Trusted Types、Web IDL、XML、 Namespaces in XML、およびAssociating Style Sheets with XML documentsで定義されている。 [ENCODING] [SELECTORS4] [TRUSTED-TYPES] [WEBIDL] [XML] [XML-NAMES] [XML-STYLESHEET]

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

1.1. ツリー

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

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

オブジェクトの 根 は、そのオブジェクトの 親 が null ならばオブジェクト自身であり、 そうでなければ、その 根 は そのオブジェクトの 親 の根である。木の 根 は、その 木 に 参加している オブジェクトのうち、その 木 における 親 が null である任意のオブジェクトである。

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

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

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

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

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

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

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

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

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

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

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

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

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

1.2. 順序付き集合

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

  1. inputTokensをASCII空白で分割した結果とする。

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

  3. 各inputTokensのtokenについて: tokenをtokensに追加する。

  4. tokensを返す。

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

1.3. セレクター

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

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

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

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

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

1.4. 名前の検証

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

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

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

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

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

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

    2. true を返す。

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

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

  5. true を返す。

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

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

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

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

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

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

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

  2. prefixをnullにする。

  3. localNameをqualifiedNameにする。

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

    1. prefix を qualifiedName の最初の U+003A(:)より前の部分に設定する。

    2. localName を qualifiedName の最初の U+003A(:)より後ろの部分に設定する。

    3. prefix が 有効な名前空間プレフィックス でない場合、throw する。 "InvalidCharacterError" DOMException。

  5. Assert: prefixは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"で、namespaceがXML名前空間でないなら、 throwし、 "NamespaceError" DOMExceptionを投げる。

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

  11. namespaceがXMLNS名前空間で、 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() メソッドを使って同じ引数を渡すことで削除できます。

また、AbortSignal を addEventListener() に渡し、そのシグナルを管理するコントローラーで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 属性の値は 文書 であり、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; // レガシー
  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; // .stopPropagation() のレガシーエイリアス
  undefined stopImmediatePropagation();

  readonly attribute boolean bubbles;
  readonly attribute boolean cancelable;
           attribute boolean returnValue;  // レガシー
  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); // レガシー
};

dictionary EventInit {
  boolean bubbles = false;
  boolean cancelable = false;
  boolean composed = false;
};
        

Event オブジェクトは、 単に イベント と呼ばれる。これは、 何かが発生したこと、例えば画像のダウンロードが 完了したことなどを通知できる。

潜在的なイベント ターゲット とは、null または EventTarget オブジェクトである。

イベント には、関連付けられた ターゲット ( 潜在的なイベント ターゲット)がある。特に指定されない限り、これは null である。

イベント には、関連付けられた relatedTarget ( 潜在的なイベント ターゲット)がある。特に指定されない限り、これは null である。

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

イベント には、関連付けられた タッチターゲットリスト (0個以上の リスト であり、 潜在的なイベント ターゲット からなる)がある。特に指定されない限り、これは 空のリストである。

タッチターゲットリスト は、 TouchEvent インターフェイスおよび関連インターフェイスの定義にのみ使用される。[TOUCH-EVENTS]

イベント には、関連付けられた 経路 がある。 経路 は、 リスト であり、イベント経路項目 からなる。イベント経路項目 は、 構造体 であり、 呼び出しターゲット (EventTarget オブジェクト)、 シャドウツリー内の呼び出しターゲット (真偽値)、 シャドウ調整済みターゲット ( 潜在的なイベント ターゲット)、 relatedTarget ( 潜在的なイベント ターゲット)、 タッチターゲットリスト ( リスト であり、潜在的なイベント ターゲット からなる)、 閉じた木の根 (真偽値)、 および 閉じた木のスロット ( 真偽値)で構成される。経路 は初期状態では 空のリストである。

event = new Event(type [, eventInitDict])
新しい event を返す。その type 属性の値は type に設定される。eventInitDict 引数を使用すると、 bubbles および cancelable 属性を、同じ名前のオブジェクト メンバーを介して設定できる。
event . type
event の型を返す。例えば、 "click"、"hashchange"、または "submit" である。
event . target
event が 配送 されるオブジェクト(その ターゲット)を返す。
event . currentTarget
現在、その イベントリスナー の コールバック が 呼び出されている オブジェクトを返す。
event . composedPath()
event の 呼び出しターゲット オブジェクトを、その 経路 から返す(リスナーが 呼び出されるオブジェクト)。ただし、 ノード のうち、シャドウツリー 内にあり、 その シャドウ ルート の モード が "closed" で、event の currentTarget から到達できないものを除く。
event . eventPhase
イベント の フェーズを返す。これは NONE、 CAPTURING_PHASE、 AT_TARGET、 および BUBBLING_PHASE のいずれかである。
event . stopPropagation()
配送 が 木 内で行われる場合、このメソッドを呼び出すと、 event が現在のオブジェクト以外のオブジェクトに到達するのを防ぐ。
event . stopImmediatePropagation()
このメソッドを呼び出すと、event が 現在のリスナーの実行終了後に、登録済みの他の イベントリスナー に到達するのを防ぎ、 さらに、 配送 が 木 内で行われる場合は、event が その他の オブジェクトに到達することも防ぐ。
event . bubbles
event の初期化方法に応じて true または false を返す。 event がその ターゲット の 祖先 を逆 木順 で通過する場合は true、それ以外の場合は false を返す。
event . cancelable
event の初期化方法に応じて true または false を返す。その戻り 値が常に意味を持つとは限らないが、true は、event が 配送 された処理の一部が、 preventDefault() メソッドを呼び出すことでキャンセル可能であることを示す場合がある。
event . preventDefault()
cancelable 属性の値が true であり、かつ、 event のリスナーを passive が false に設定された状態で実行している間に呼び出された場合、 event の 配送 を引き起こした処理に対し、キャンセルする必要があることを 通知する。
event . defaultPrevented
preventDefault() が正常に呼び出され、キャンセルを示した場合は true を返し、 それ以外の場合は false を返す。
event . composed
event の初期化方法に応じて true または false を返す。 event が ShadowRoot ノード を越えてリスナーを呼び出し、そのノードが 根 である ターゲット の場合は true、それ以外は false を返す。
event . isTrusted
event がユーザーエージェントによって 配送 された場合は true、 それ以外の場合は false を返す。
event . timeStamp
event のタイムスタンプを、発生時点を基準に測定されたミリ秒数として 返す。

type 属性は、初期化された 値を返さなければならない。イベント が作成されるとき、この属性は空 文字列に初期化されなければならない。

target 取得子の手順は、this の ターゲット を返すことである。

srcElement 取得子の手順は、 this の ターゲット を返すことである。

currentTarget 属性は、初期化された 値を返さなければならない。イベント が作成されるとき、この属性は null に初期化されなければならない。

composedPath() メソッドの手順は次のとおりである。

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

  2. path を this の 経路 とする。

  3. path が 空である 場合、composedPath を返す。

  4. currentTarget を this の currentTarget 属性の値とする。

  5. 表明する:currentTarget は EventTarget オブジェクトである。

  6. currentTarget を composedPath に 追加する。

  7. currentTargetIndex を 0 とする。

  8. currentTargetHiddenSubtreeLevel を 0 とする。

  9. index を path の サイズ − 1 とする。

  10. index が 0 以上である間、次を繰り返す。

    1. path[index] の 閉じた木の根 が true であれば、currentTargetHiddenSubtreeLevel を 1 増やす。

    2. path[index] の 呼び出しターゲット が currentTarget であれば、currentTargetIndex を index に設定し、 ループを抜ける。

    3. path[index] の 閉じた木のスロット が true であれば、currentTargetHiddenSubtreeLevel を 1 減らす。

    4. index を 1 減らす。

  11. currentHiddenLevel と maxHiddenLevel を currentTargetHiddenSubtreeLevel とする。

  12. index を currentTargetIndex − 1 に設定する。

  13. index が 0 以上である間、次を繰り返す。

    1. path[index] の 閉じた木の根 が true であれば、currentHiddenLevel を 1 増やす。

    2. currentHiddenLevel が maxHiddenLevel 以下であれば、 path[index] の 先頭に追加する 対象は 呼び出しターゲット であり、追加先は composedPath である。

    3. path[index] の 閉じた木のスロット が true であれば、次を実行する。

      1. currentHiddenLevel を 1 減らす。

      2. currentHiddenLevel が maxHiddenLevel 未満であれば、 maxHiddenLevel を currentHiddenLevel に設定する。

    4. index を 1 減らす。

  14. currentHiddenLevel と maxHiddenLevel を currentTargetHiddenSubtreeLevel に設定する。

  15. index を currentTargetIndex + 1 に設定する。

  16. index が path の サイズ 未満である間、次を繰り返す。

    1. path[index] の 閉じた木のスロット が true であれば、currentHiddenLevel を 1 増やす。

    2. currentHiddenLevel が maxHiddenLevel 以下であれば、 path[index] の 追加する 対象は 呼び出しターゲット であり、追加先は composedPath である。

    3. path[index] の 閉じた木の根 が true であれば、次を実行する。

      1. currentHiddenLevel を 1 減らす。

      2. currentHiddenLevel が maxHiddenLevel 未満であれば、 maxHiddenLevel を currentHiddenLevel に設定する。

    4. index を 1 増やす。

  17. composedPath を返す。

eventPhase 属性は、初期化された 値を返さなければならず、その値は次のいずれかでなければならない。

NONE (数値 0)
現在 イベント が 配送 されていない場合、このフェーズにある。
CAPTURING_PHASE (数値 1)
イベント が 配送 される先のオブジェクトが 参加している 木 において、イベントは その ターゲット に到達する前にこのフェーズにある。
AT_TARGET (数値 2)
イベント が 配送 されるとき、その ターゲット 上ではこのフェーズにある。
BUBBLING_PHASE (数値 3)
イベント が 配送 される先のオブジェクトが 参加している 木 において、イベントは その ターゲット に到達した後にこのフェーズにある。

初期状態では、この属性は NONE に初期化されなければならない。


各 イベント には、次の 関連付けられたフラグがあり、いずれも初期状態では設定されていない。

stopPropagation() メソッドの手順は、 this の 伝播停止 フラグ を設定することである。

cancelBubble 取得子の手順は、 this の 伝播停止 フラグ が設定されていれば true、それ以外の場合は false を返すことである。

cancelBubble 設定子の手順は、指定された値が true であれば、this の 伝播停止フラグ を設定し、 それ以外の場合は何もしないことである。

stopImmediatePropagation() メソッドの手順は、 次のものを設定することである。 this の 伝播停止 フラグ および this の 即時伝播停止フラグ。

bubbles および cancelable 属性は、初期化された 値を返さなければならない。

キャンセル済み フラグを設定する には、イベント event が与えられたとき、 event の cancelable 属性の値が true であり、かつ event の パッシブ リスナー内フラグ が設定されていなければ、event の キャンセル済みフラグ を設定し、 それ以外の場合は何もしない。

returnValue 取得子の手順は、 this の キャンセル済みフラグ が設定されていれば false、 それ以外の場合は true を返すことである。

returnValue 設定子の手順は、指定された値が false であれば、キャンセル済みフラグを設定する 処理を this に対して実行し、 それ以外の場合は何もしないことである。

preventDefault() メソッドの手順は、 キャンセル済み フラグを設定する 処理を this に対して実行することである。

preventDefault() を呼び出しても 効果がない場合がある。ユーザーエージェントには、デバッグを支援するため、 正確な原因を開発者コンソールに記録することが推奨される。

defaultPrevented 取得子の手順は、 this の キャンセル済みフラグ が設定されていれば true、 それ以外の場合は false を返すことである。

composed 取得子の手順は、 this の 合成フラグ が設定されていれば true、 それ以外の場合は false を返すことである。


isTrusted 属性は、初期化された 値を返さなければならない。イベント が作成されるとき、この属性は false に初期化されなければならない。

isTrusted は、 イベント が 配送 されたのがユーザーエージェントによるものか( dispatchEvent() の使用によるものではなく)を示す便利な属性である。 唯一のレガシーな例外は click() であり、 これにより ユーザーエージェントは、isTrusted 属性が false に初期化された イベント を配送する。

timeStamp 属性は、初期化された 値を返さなければならない。


event を 初期化する には、 type、bubbles、および cancelable を使用し、次の手順を実行する。

  1. event の 初期化済みフラグ を設定する。

  2. event の 伝播停止フラグ、 即時伝播停止フラグ、および キャンセル済みフラグ を解除する。

  3. event の isTrusted 属性を false に設定する。

  4. event の ターゲット を null に設定する。

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

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

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

initEvent(type, bubbles, cancelable) メソッドの手順は次のとおりである。

  1. this の 配送フラグ が設定されている場合、返る。

  2. 初期化する 対象は this であり、 type、bubbles、および cancelable を使用する。

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

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

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

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

eventゲッターの手順は、thisの current 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. thisのdispatch flagが設定されていれば、returnする。

  2. initialize:thisをtype、bubbles、cancelableで初期化する。

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

2.5. イベントの構築

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

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

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

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

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

  3. eventを返す。

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

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

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

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

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

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

  4. eventのisTrusted属性をtrueで初期化する。

  5. eventを返す。

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

内部イベント生成手順は、eventInterface・realm・time・dictionaryを受け、以下の通りです:

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

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

  2. eventのinitialized flagを設定する。

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

  4. 各dictionaryのmember→valueで: eventがmemberという識別子を持つ属性を持つなら、その属性をvalueで初期化する。

  5. イベント構築手順をeventとdictionaryで実行する。

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

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

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

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

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

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

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

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

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

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

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

target . dispatchEvent(event)

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

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

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

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

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

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

  2. onceをfalseに設定する。

  3. passiveとsignalをnullに設定する。

  4. optionsが辞書である場合:

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

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

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

  5. capture、passive、once、signalを返す。

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

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

将来的には、カスタムの親を取得するアルゴリズムを許可できるかもしれません。これが 有用であれば、issue #583 を支援してください。現時点では、すべての 作者が作成したEventTargetは ツリー構造に参加しません。

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

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

  2. falseを返す。

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

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

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

  3. listenerのcallbackがnullである場合、終了する。

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

  5. eventTarget の イベントリスナーリスト が 含む イベントリスナー のうち、型 が listener の 型 と等しく、 コールバック が listener の コールバック と等しく、かつ capture が listener の capture と等しいものが存在しない場合、追加する 対象は listener であり、追加先は eventTarget の イベント リスナーリスト である。

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

    1. イベントリスナーを削除する、対象はeventTargetとlistener。

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

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

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

  2. イベントリスナーを追加する、対象はthisとイベントリスナーであり、そのtypeがtype、callbackがcallback、captureがcapture、passiveがpassive、onceがonce、およびsignalがsignalである。

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

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

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

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

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

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

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

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

  2. もし this の イベント リスナーリスト が 含んでいる ある イベントリスナー の 型 が type、 コールバック が callback、かつ capture が capture であれば、その イベントリスナーを削除する 処理を this とその イベントリスナー を用いて実行する。

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

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

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

  2. eventのisTrusted 属性をfalseに初期化する。

  3. dispatchingをeventとthisを用いて実行した結果を返す。

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 について:listener の type が "fetch" であり、listener の callback が null でなければ、 その listener の callback を callbacks に追加する。

  3. callbacks を返す。

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

配送する には、 イベント event を 対象となる EventTarget オブジェクト target に対して、任意の legacy target override flag と 任意の legacyOutputDidListenersThrowFlag を指定し、次を実行する。

  1. event の 配送フラグ を設定する。

  2. legacy target override flag が指定されていない場合、targetOverride を target とし、 それ以外の場合は target の 関連付けられた Document とする。 [HTML]

    legacy target override flag は HTML でのみ使用され、かつ target が Window オブジェクトである場合にのみ使用される。

  3. activationTarget を null とする。

  4. relatedTarget を、event の relatedTarget を target に対して 再ターゲット化 した結果とする。

  5. clearTargets を false とする。

  6. target が relatedTarget と異なるか、または target が event の relatedTarget である場合、次を実行する。

    1. touchTargets を新しい リスト とする。

    2. event の タッチターゲットリスト の各 touchTarget に対して 繰り返す:touchTarget を target に対して 再ターゲット化 した結果を 追加する 先は touchTargets とする。

    3. event、target、 targetOverride、relatedTarget、touchTargets、および false を用いて イベント経路に追加する。

    4. event が MouseEvent オブジェクトであり、 かつ event の type 属性が "click" であれば isActivationEvent を true、それ以外は false とする。

    5. isActivationEvent が true であり、target に 活性化の振る舞い がある場合、 activationTarget を target に設定する。

    6. target が スロット可能 かつ 割り当て済み であれば slottable を target とし、それ以外は null とする。

    7. slotInClosedTree を false とする。

    8. parent を、event を用いて target の 親を 取得する 処理を呼び出した結果とする。

    9. parent が null でない間、次を繰り返す。

      1. slottable が null でない場合、次を実行する。

        1. 表明する:parent は スロット である。

        2. slottable を null に設定する。

        3. parent の 根 が シャドウルート であり、その モード が "closed" であれば、 slotInClosedTree を true に設定する。

      2. parent が スロット可能 かつ 割り当て済み であれば、 slottable を parent に設定する。

      3. relatedTarget を、event の relatedTarget を parent に対して 再ターゲット化 した結果とする。

      4. touchTargets を新しい リスト とする。

      5. event の タッチターゲットリスト の各 touchTarget に対して 繰り返す: touchTarget を parent に対して 再ターゲット化 した結果を touchTargets に 追加する。

      6. parent が Window オブジェクトであるか、または parent が ノード であり、かつ target の 根 が parent の シャドウを含む 包括的祖先 である場合、次を実行する。

        1. isActivationEvent が true、event の bubbles 属性が true、activationTarget が null、かつ parent に 活性化の 振る舞い がある場合、activationTarget を parent に設定する。

        2. event、parent、null、 relatedTarget、touchTargets、および slotInClosedTree を用いて イベント経路に追加する。

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

      8. それ以外の場合、次を実行する。

        1. target を parent に設定する。

        2. isActivationEvent が true、activationTarget が null、かつ target に 活性化の 振る舞い がある場合、 activationTarget を target に設定する。

        3. event、parent、 target、relatedTarget、touchTargets、 および slotInClosedTree を用いて イベント経路に追加する。

      9. parent が null でなければ、parent を、 event を用いて parent の 親を取得する 処理を呼び出した結果に設定する。

      10. slotInClosedTree を false に設定する。

    10. clearTargetsItem を、event の 経路 内にある イベント経路項目 のうち、 シャドウ調整済みターゲット が null でない最後のものとする。

    11. clearTargetsItem の シャドウ調整済みターゲット、 clearTargetsItem の relatedTarget、または clearTargetsItem の タッチ ターゲットリスト 内の EventTarget オブジェクトが ノード であり、その 根 が シャドウルート であれば、 clearTargets を true に設定する。

    12. activationTarget が null でなく、かつ activationTarget に レガシー事前活性化の 振る舞い がある場合、activationTarget の レガシー事前活性化の 振る舞い を実行する。

    13. event の 経路 の各 item に対して、逆順で 繰り返す。

      1. item の シャドウ調整済みターゲット が null でなければ、 event の eventPhase 属性を AT_TARGET に設定する。

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

      3. item、event、"capturing"、および 指定されていれば legacyOutputDidListenersThrowFlag を用いて 呼び出す。

    14. event の 経路 の各 item に対して 繰り返す。

      1. item の シャドウ調整済みターゲット が null でなければ、 event の eventPhase 属性を AT_TARGET に設定する。

      2. それ以外の場合、次を実行する。

        1. event の bubbles 属性が false であれば、 次の反復に進む。

        2. event の eventPhase 属性を BUBBLING_PHASE に設定する。

      3. item、event、"bubbling"、および 指定されていれば legacyOutputDidListenersThrowFlag を用いて 呼び出す。

  7. event の eventPhase 属性を NONE に設定する。

  8. event の currentTarget 属性を null に設定する。

  9. event の 経路 を空のリストに設定する。

  10. event の 配送フラグ、伝播停止フラグ、 および 即時伝播停止フラグ を解除する。

  11. clearTargets が true であれば、次を実行する。

    1. event の ターゲット を null に設定する。

    2. event の relatedTarget を null に設定する。

    3. event の タッチターゲットリスト を空のリストに設定する。

  12. activationTarget が null でなければ、次を実行する。

    1. event の キャンセル済みフラグ が設定されていなければ、 event を用いて activationTarget の 活性化の振る舞い を 実行する。

    2. それ以外の場合、activationTarget に レガシーキャンセル済み活性化の 振る舞い があれば、 activationTarget の レガシーキャンセル済み活性化の 振る舞い を実行する。

  13. event の キャンセル済みフラグ が設定されていれば false、それ以外は true を返す。

イベント 経路に追加する には、 イベント event、 EventTarget オブジェクト invocationTarget、 潜在的な イベントターゲット shadowAdjustedTarget、潜在的なイベントターゲット relatedTarget、リスト である 潜在的なイベントターゲット touchTargets、および真偽値 slotInClosedTree が与えられたとき、次を実行する。

  1. invocationTargetInShadowTree を false とする。

  2. invocationTarget が ノード であり、その 根 が シャドウ ルート であれば、invocationTargetInShadowTree を true に設定する。

  3. rootOfClosedTree を false とする。

  4. invocationTarget が シャドウルート であり、その モード が "closed" であれば、rootOfClosedTree を true に設定する。

  5. event の 経路 に、 新しいイベント経路項目 を 追加する。その 呼び出しターゲット は invocationTarget、 シャドウツリー内の呼び出しターゲット は invocationTargetInShadowTree、 シャドウ調整済みターゲット は shadowAdjustedTarget、 relatedTarget は relatedTarget、 タッチターゲットリスト は touchTargets、 閉じた木の根 は rootOfClosedTree、および 閉じた木のスロット は slotInClosedTree とする。

呼び出す には、イベント経路項目 pathItem、イベント event、文字列 phase、および任意の legacyOutputDidListenersThrowFlag が与えられたとき、次を実行する。

  1. targetItem を pathItem とする。

  2. targetItem の シャドウ調整済みターゲット が null である間、 targetItem を、event の 経路 内で targetItem の直前にある イベント経路項目 に設定する。

  3. event の ターゲット を targetItem の シャドウ調整済みターゲット に設定する。

  4. event の relatedTarget を pathItem の relatedTarget に設定する。

  5. event の タッチターゲットリスト を pathItem の タッチターゲットリスト に設定する。

  6. event の 伝播停止フラグ が設定されていれば、返る。

  7. event の currentTarget 属性を pathItem の 呼び出しターゲット に初期化する。

  8. listeners を、event の currentTarget 属性値の イベントリスナーリスト の 複製 とする。

    これにより、この時点以降に追加された イベントリスナー が 実行されるのを防ぐ。ただし、removed フィールドにより、 削除は引き続き効果を持つことに注意すること。

  9. invocationTargetInShadowTree を pathItem の シャドウツリー内の呼び出しターゲット とする。

  10. found を、event、 listeners、phase、invocationTargetInShadowTree、および 指定されていれば legacyOutputDidListenersThrowFlag を用いて 内部呼び出し を実行した結果とする。

  11. found が false であり、かつ event の isTrusted 属性が true であれば、次を実行する。

    1. originalEventType を event の type 属性値とする。

    2. event の type 属性値が、次の表の第1列にあるいずれかの文字列と一致する場合、 event の type 属性値を、一致した文字列と同じ行の第2列にある 文字列に設定し、それ以外の場合は返る。

      イベント型 レガシーイベント型
      "animationend" "webkitAnimationEnd"
      "animationiteration" "webkitAnimationIteration"
      "animationstart" "webkitAnimationStart"
      "transitionend" "webkitTransitionEnd"
    3. event、listeners、phase、 invocationTargetInShadowTree、および 指定されていれば legacyOutputDidListenersThrowFlag を用いて 内部呼び出し を実行する。

    4. event の type 属性値を originalEventType に設定する。

内部呼び出し を実行するには、 イベント event、 リスト である イベント リスナー listeners、 文字列 phase、真偽値 invocationTargetInShadowTree、および任意の legacyOutputDidListenersThrowFlag が与えられたとき、次を実行する。

  1. found を false とする。

  2. listeners の各 listener のうち、その removed が false であるものに対して 繰り返す。

    1. event の type 属性値が listener の 型 と異なる場合、次の反復に進む。

    2. found を true に設定する。

    3. phase が "capturing" であり、listener の capture が false であれば、 次の反復に進む。

    4. phase が "bubbling" であり、listener の capture が true であれば、 次の反復に進む。

    5. listener の once が true であれば、 event の currentTarget 属性値と listener を用いて イベントリスナーを削除する。

    6. targetGlobal を、event の currentTarget の ノード文書 の 関連する大域オブジェクト とする。ただし、 event の currentTarget が ノード の場合に限る。 それ以外の場合は、event の currentTarget の 関連する大域オブジェクト とする。

    7. listenerGlobal を、listener の コールバック の 関連付けられたレルム の 大域オブジェクト とする。

    8. targetGlobal または listenerGlobal が Window オブジェクトであり、その 関連付けられた Document が 完全にアクティブ でなければ、 次の反復に進む。

    9. currentEvent を undefined とする。

    10. listenerGlobal が Window オブジェクトであれば、次を実行する。

      1. currentEvent を listenerGlobal の 現在のイベント に設定する。

      2. invocationTargetInShadowTree が false であれば、 listenerGlobal の 現在のイベント を event に設定する。

    11. listener の passive が true であれば、 event の パッシブリスナー内フラグ を設定する。

    12. listenerGlobal が Window オブジェクトであれば、 event と listener を用いて イベント リスナーのタイミング情報を記録する。

    13. listener の コールバック、"handleEvent"、« event »、および event の currentTarget 属性値を用いて ユーザーオブジェクトの演算を呼び出す。これが例外 exception をスローした場合、次を実行する。

      1. listener の コールバック に対応する JavaScript オブジェクトの 関連付けられたレルム の 大域オブジェクト に対して、 exception を 報告する。

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

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

    14. event の パッシブリスナー内フラグ を解除する。

    15. listenerGlobal が Window オブジェクトであれば、listenerGlobal の 現在のイベント を currentEvent に設定する。

    16. event の 即時伝播停止フラグ が 設定されていれば、 ループを抜ける。

  3. found を返す。

2.10. イベントの発火

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

  1. recordingTimingAsTask を、 必要に応じてタスク時間の記録を開始するを呼び出した結果とする。 target の 関連する設定オブジェクトを与える。

  2. eventConstructor が与えられていない場合、eventConstructor を Event とする。

  3. event を、イベントを作成する結果とする。これには eventConstructor を、target の関連するレルムで与える。

  4. event の type 属性を e に初期化する。

  5. event のその他の IDL 属性を、この アルゴリズムの呼び出しで指定されたとおりに初期化する。

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

  6. result を、target に event を配送する結果とする。 その際、 legacy target override flag が設定されていれば、それを設定する。

  7. recordingTimingAsTask が true の場合:

    1. 表明:target の関連する設定オブジェクトは Document である。
    2. タスクの終了時刻を記録する。その際、安全でない共有現在時刻と target の 関連する設定オブジェクトを与える。

  8. result を返す。

DOM の文脈における Fire は、 作成、 初期化、および 配送を行うことを指す、 イベントについての短縮表現である。 イベントを発火するは、 その処理を書き下しやすくする。

イベントがその bubbles または cancelable 属性を初期化する必要がある場合、 「target で submit という名前のイベントを発火する。その cancelable 属性は true に初期化する」と書ける。

また、カスタムコンストラクターが必要な場合は、 「MouseEvent を用いて target で click という名前のイベントを発火する。その detail 属性は 1 に初期化する」と書ける。

戻り値が重要になることもある:

  1. target で like という名前のイベントを発火する結果を doAction とする。

  2. doAction が true である場合は、…

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

イベントは、 アクションではなく、発生した事柄を意味する。別の言い方をすれば、それは アルゴリズムからの通知を表し、そのアルゴリズムの今後の進行に影響を与えるために 使用できる(例: preventDefault() を呼び出すことによって)。 イベントは、 何らかのアルゴリズムの実行開始を引き起こすアクションや開始要因として 使用してはならない。それはイベントの目的ではない。

ここでこれを特に明記しているのは、DOM の以前の 反復版には、イベントに関連付けられた "default actions" という概念があり、人々にまったく誤った考えを与えていたためである。 イベントはアクションを表すものでも、 アクションを引き起こすものでもなく、進行中のアクションに影響を与えるためにのみ使用できる。

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

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

AbortController を利用する API は、abort() に応答して、未解決の Promise を AbortSignal の abort 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 は、同等の方法で反応するか、AbortSignal の abort reason を全く表に出さないこともできます。addEventListener() は後者が適切だった API の例です。

より細かな制御が必要な API は、AbortController や AbortSignal オブジェクトを必要に応じて拡張できます。

3.1. インターフェース AbortController

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

    [SameObject] readonly attribute AbortSignal signal;

    undefined abort(optional any reason);
};
controller = new AbortController()
新しい controller を返し、その signal は新しく作成された AbortSignal オブジェクトに設定される。
controller . signal
このオブジェクトに関連付けられた AbortSignal オブジェクトを返す。
controller . abort(reason)
このメソッドを呼び出すと、reason がこのオブジェクトの AbortSignal の abort reason に保存され、関連するアクティビティが中断されることを監視者に通知する。reason が undefined の場合は "AbortError" DOMException が保存される。

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

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

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

  2. this の signal を signal に設定する。

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

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

signal abort を AbortController controller で、オプションの reason とともに実行するには、controller の signal で reason とともに 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
signal の AbortController が中断を通知した場合は true を、そうでない場合は false を返す。
signal . reason
signal の 中断理由を返す。
signal . throwIfAborted()
signal の AbortController が中断を通知した場合、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. global を signal の 関連するグローバルオブジェクトにする。

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

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

    このタイムアウトの間、signal の abort イベントにイベントリスナーが登録されている場合、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 でない場合に 中断される。

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

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

  2. algorithm を signal の 中断アルゴリズムに 追加する。

アルゴリズム algorithm を AbortSignal signal から 削除するには、algorithm を signal の 中断アルゴリズムから 削除する。

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

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

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

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

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

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

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

      2. dependentSignal を dependentSignalsToAbort に 追加する。

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

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

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

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

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

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

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

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

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

  3. resultSignal の dependent を true に設定する。

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

    1. signal の dependent が false の場合:

      1. signal を resultSignal の source signals に 追加する。

      2. resultSignal を signal の dependent signals に 追加する。

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

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

      2. sourceSignal を resultSignal の source signals に 追加する。

      3. resultSignal を sourceSignal の dependent signals に 追加する。

  5. resultSignal を返す。

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

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

3.3. API での AbortController と AbortSignal オブジェクトの使用

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

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

  1. global を this の 関連するグローバルオブジェクトにする。

  2. p を 新しい Promise にする。

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

    1. signal を options["signal"] にする。

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

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

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

      2. signal の 中断理由で p を 拒否する。

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

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

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

  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 を実装するオブジェクトは、継承されたインターフェイスも実装する: Document, DocumentType, DocumentFragment, Element, CharacterData, or Attr。

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

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

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

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

したがって、すべてのノードの一次インターフェイスは、次のいずれかである: Document, DocumentType, DocumentFragment, ShadowRoot, Element または Element の継承されたインターフェイス, Attr, Text, CDATASection, ProcessingInstruction, or 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. nodeがDocumentType またはAttr ノードである場合、0 を返す。

  2. nodeがCharacterData ノードである場合、 nodeの データの長さを返す。

  3. nodeの子の数を返す。

ノードは、その 長さが 0 である場合、空であるとみなされる。

4.2.1. 文書ツリー

文書ツリーとは、 ノードツリーであり、その ルートが文書であるものをいう。

文書の文書要素は、 その文書を親とする要素であり、 存在する場合はその要素、そうでない場合は null である。

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

ノードは、その文書ツリー内にある場合、その ルートは 文書である。

ノードは、文書ツリー内にある場合、文書内にある。 文書内にあるという 用語は、もはや使用すべきではない。これは、それを使用している 標準がシャドウツリーを考慮するよう更新されていないことを示す。

4.2.2. シャドウツリー

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

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

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

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

4.2.2.1. スロット

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

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

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

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

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

    1. value が oldValue の場合、return する。

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

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

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

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

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

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

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

4.2.2.2. スロット可能要素

Element と Text ノードは スロット可能要素である。

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

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

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

  1. localName が slot で namespace が null の場合:

    1. value が oldValue の場合、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. shadow を slottable の親の シャドウルートにする。

  3. shadow が null の場合、null を返す。

  4. open が true で shadow のモードが "open" でない場合、null を返す。

  5. shadow のスロット割り当てが "manual" の場合、shadow の子孫の中で、その 手動で割り当てられたノードが slottable を含むスロットがあればそれを返し、そうでない場合は null を返す。

  6. shadow の子孫内でツリー順で最初のスロットで、その名前が slottable の 名前と一致するものがあればそれを返し、そうでない場合は null を返す。

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

  1. result を « » にする。

  2. root を slot のルートにする。

  3. root がシャドウルートでない場合、result を返す。

  4. host を root のホストにする。

  5. root のスロット割り当てが "manual" の場合:

    1. slot の 手動で割り当てられたノードの各スロット可能要素 slottable について繰り返し、 slottable の親が host の場合、slottable を result に追加する。

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

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

    2. foundSlot が slot の場合、slottable を result に追加する。

  7. result を返す。

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

  1. result を « » にする。

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

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

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

  5. slottables の各 node について:

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

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

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

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

  6. result を返す。

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. slot を slot の関連エージェントの シグナルスロットに追加する。

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

4.2.3. 変更アルゴリズム

ノード node、ノード parent、 null または ノード child、およびリストのノード childrenToExcludeが与えられたとき、挿入前の妥当性を保証するには:

  1. parentがDocument、 DocumentFragment、 またはElement ノードでない場合、"HierarchyRequestError" DOMExceptionをスローする。

  2. nodeがparentのホストを含む包括的 祖先である場合、 "HierarchyRequestError" DOMExceptionをスローする。

  3. childが null でなく、その親がparentでない場合、 "NotFoundError" DOMExceptionをスローする。

  4. nodeがDocumentFragment、 DocumentType、 Element、 または CharacterData ノードでない場合、 "HierarchyRequestError" DOMExceptionをスローする。

  5. parentが文書でない場合:

    1. nodeがdoctypeである場合、 "HierarchyRequestError" DOMExceptionをスローする。

    2. 返る。

  6. nodeがText ノードである場合、 "HierarchyRequestError" DOMExceptionをスローする。

  7. nodeがCharacterData ノードである場合、返る。

  8. nodeがDocumentFragment ノードである場合:

    1. nodeが複数の要素の子を持つか、Text ノードの子を持つ場合、 "HierarchyRequestError" DOMExceptionをスローする。

    2. nodeが要素の子を持たない場合、返る。

  9. nodeがDocumentFragment またはElement ノードである場合:

    1. 次のいずれかが true である場合:

      その場合、"HierarchyRequestError" DOMExceptionをスローする。

    2. 返る。

  10. 表明:nodeはdoctypeである。

  11. 次のいずれかが true である場合:

    その場合、"HierarchyRequestError" DOMExceptionをスローする。

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

  1. node、parent、 child、および « » を与えて、挿入前の妥当性を保証する。

  2. referenceChildをchildとする。

  3. referenceChildがnodeである場合、referenceChildを nodeの次の兄弟に設定する。

  4. referenceChildの前でnodeをparentに挿入する。

  5. nodeを返す。

仕様は、すべてまたは一部のノードについて 挿入 手順を定義できる。以下の挿入アルゴリズムで 示されるように、このアルゴリズムにはinsertedNodeが渡される。これらの手順は、insertedNodeが 参加するノードツリーを変更したり、閲覧コンテキストを作成したり、 イベントを発火したり、 その他の方法で JavaScript を実行してはならない。ただし、これらの手順は、これらの処理を非同期に実行するためのタスクをキューに追加してもよい。

挿入手順は(とりわけ)JavaScript を実行できないが、 実際にはスクリプトから観測可能な結果をもたらす。次の例を考える:

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

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

script.innerText= 'console.log(getComputedStyle(h1).color)'; // 'rgb(255, 0, 0)' をログ出力する
style.innerText = 'h1 {color: rgb(255, 0, 0);}';

document.body.append(fragment);

上記の例のスクリプトが'rgb(255, 0, 0)'をログ出力するのは、 次の処理が順番に行われるためである:

  1. 挿入アルゴリズムが実行され、script 要素と style 要素が順番に挿入される。

    1. HTML 標準の挿入手順が script 要素について実行されるが、何もしない。[HTML]

    2. HTML 標準の挿入手順が style 要素について実行され、そのスタイル規則が直ちに 文書に適用される。[HTML]

    3. HTML 標準の接続後手順が script 要素について実行される。これによりスクリプトが実行され、そのスクリプトは直前の 手順で適用されたスタイル規則を直ちに観測する。 [HTML]

仕様は、すべてまたは一部の ノードについて接続後手順を定義することもできる。このアルゴリズムには、以下の 挿入 アルゴリズムで示されるように、connectedNodeが渡される。

接続後手順の目的は、 ノードに、connectedNodeが 参加するノードツリーを変更したり、閲覧コンテキストを作成したり、 その他の方法で JavaScript を実行したりする、接続に関連するあらゆる処理を実行する機会を提供することである。これらの手順により、ノードの一群を、 スクリプトに対してアトミックに挿入でき、 主要な副作用はすべて、ノードツリーへの一括挿入が完了した後に 発生する。これにより、保留中のすべてのノード ツリーへの挿入が完全に終了してから、追加の挿入が行われることが保証される。

仕様は、すべてまたは一部の ノードについて子が 変更された手順を定義できる。このアルゴリズムには 引数は渡されず、挿入、 削除、およびデータの置換から呼び出される。

ノード nodeを ノード parent内の null またはノード childの前に、任意の真偽値suppressObservers(既定値 false)を指定して挿入するには:

  1. nodeがDocumentFragment ノードである場合、nodesをnodeの子とする。それ以外の場合は « node » とする。

  2. countをnodesのサイズとする。

  3. countが 0 の場合、返る。

  4. nodeがDocumentFragment ノードである場合:

    1. suppressObserversを true に設定して、その子を削除する。

    2. « »、nodes、null、および null を使用して、nodeについてツリー変異レコードをキューに追加する。

      この手順では意図的に suppressObserversを考慮しない。

  5. childが null でない場合:

    1. 開始 ノードがparentであり、 開始オフセットが childのインデックスより大きい各ライブ範囲について、その 開始オフセットをcountだけ増加させる。

    2. 終了ノードが parentであり、 終了オフセットが childのインデックスより大きい各ライブ範囲について、その 終了オフセットをcountだけ増加させる。

  6. childが null でない場合、previousSiblingをchildの前の 兄弟とし、 childが null の場合はparentの最後の子とする。

  7. nodes内の各nodeについて、ツリー順で:

    1. nodeをparentの ノード文書に移管する。

    2. childが null の場合、nodeを parentの子に付加する。

    3. それ以外の場合、nodeをparentの 子のchildのインデックスの前に挿入する。

    4. parentがシャドウホストであり、そのシャドウルートの スロット割り当てが「named」であり、 nodeが スロット可能である場合、nodeに スロットを割り当てる。

    5. parentのルートがシャドウルートであり、 parentがスロットで、その割り当てられたノードが 空のリストである場合、 parentについてスロット変更を通知する。

    6. nodeのルートを用いてツリーにスロット可能なものを割り当てる。

    7. nodeの各シャドウを含む 包括的子孫 inclusiveDescendantについて、シャドウを含むツリー順で:

      1. inclusiveDescendantを用いて挿入手順を実行する。

      2. inclusiveDescendantが接続済みでない場合、 次へ進む。

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

        1. inclusiveDescendantのカスタム要素 レジストリの スコープ付きであるが true の場合、 inclusiveDescendantのノード文書を inclusiveDescendantのカスタム要素 レジストリの スコープ付き文書集合に付加する。

        2. inclusiveDescendantがカスタムである場合、 inclusiveDescendant、コールバック名「connectedCallback」、および « » を用いて カスタム要素コールバック反応をキューに追加する。

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

          これによってinclusiveDescendantの アップグレードに成功した場合、その connectedCallbackは 要素をアップグレードする アルゴリズムの実行中に自動的にキューに追加される。

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

  8. suppressObserversが false の場合、nodes、« »、previousSibling、およびchildを使用して、 parentについてツリー 変異レコードをキューに追加する。

  9. parentについて子が変更された手順を実行する。

  10. staticNodeListをリストのノードとし、初期値を « » とする。

    いずれかのノードに対して 接続後手順を呼び出す前にすべての ノードを収集する。これは、ノードツリーを走査している間に 接続後手順を呼び出さないためである。 その理由は、接続後手順が ツリーの構造を変更でき、ライブ走査を安全でなくし、 同じノードに対して 接続後手順が複数回呼び出される可能性があるためである。

  11. nodesの各nodeについて、ツリー順で:

    1. nodeの各シャドウを含む 包括的子孫 inclusiveDescendantについて、シャドウを含むツリー順で、 inclusiveDescendantをstaticNodeListに付加する。

  12. staticNodeListの各 nodeについて、nodeが 接続済みである場合、nodeを用いて接続後手順を実行する。

ノード nodeを ノード parentに付加するには、null の前で nodeをparentに事前挿入する。


仕様は、すべてまたは一部のノードについて 移動手順を定義できる。この アルゴリズムには、以下の移動アルゴリズムで示されるように、ノード movedNode、真偽値 isSubtreeRoot、およびノード oldAncestorが渡される。 挿入 手順と同様に、これらの手順はmovedNodeが 参加するノードツリーを変更したり、閲覧コンテキストを作成したり、 イベントを発火したり、 その他の方法で JavaScript を実行してはならない。ただし、これらの手順は、これらの処理を非同期に実行するためのタスクをキューに追加してもよい。

ノード nodeを ノード newParent内の null またはノード childの前に移動するには:

  1. newParentのシャドウを含むルートが nodeのシャドウを含むルートと同一でない場合、 "HierarchyRequestError" DOMExceptionをスローする。

    これには、newParentの接続済み状態がnodeの接続済み状態と同じ場合にのみ移動が行われることを保証するという副作用がある。

  2. nodeがnewParentのホストを含む包括的 祖先である場合、 "HierarchyRequestError" DOMExceptionをスローする。

  3. childが null でなく、その親がnewParentでない場合、 "NotFoundError" DOMExceptionをスローする。

  4. nodeがElement またはCharacterData ノードでない場合、 "HierarchyRequestError" DOMExceptionをスローする。

  5. nodeがText ノードであり、 newParentが 文書である場合、 "HierarchyRequestError" DOMExceptionをスローする。

  6. newParentが文書であり、nodeがElement ノードであり、さらに newParentが要素の 子を持つか、 childがdoctypeであるか、またはchildが null でなくdoctypeがchildに後続する場合、 "HierarchyRequestError" DOMExceptionをスローする。

  7. oldParentをnodeの親とする。

  8. 表明:oldParentは null でない。

  9. nodeを与えて、ライブ範囲の削除前手順を実行する。

  10. ルートのノード文書が nodeの ノード 文書である各NodeIterator オブジェクトiteratorについて、nodeおよびiteratorを 与えてNodeIteratorの削除前手順を実行する。

  11. oldPreviousSiblingをnodeの前の 兄弟とする。

  12. oldNextSiblingをnodeの次の兄弟とする。

  13. nodeをoldParentの子から削除する。

  14. nodeが割り当て済みである場合、nodeの割り当てられたスロットについてスロット可能なものを割り当てる。

  15. oldParentのルートがシャドウルートであり、 oldParentがスロットで、その割り当てられたノードが 空である場合、oldParentについてスロット変更を通知する。

  16. nodeがスロットである包括的子孫を持つ場合:

    1. oldParentのルートを用いてツリーにスロット可能なものを割り当てる。

    2. nodeを用いてツリーにスロット可能なものを割り当てる。

  17. node と oldParent を指定して、一時的な登録済みオブザーバーを追加する。

  18. childが null でない場合:

    1. 開始 ノードがnewParentであり、 開始オフセットが childのインデックスより大きい各ライブ範囲について、その 開始オフセットを 1 増加させる。

    2. 終了ノードが newParentであり、 終了オフセットが childのインデックスより大きい各ライブ範囲について、その 終了オフセットを 1 増加させる。

  19. childが null でない場合、newPreviousSiblingをchildの前の 兄弟とし、 それ以外の場合はnewParentの最後の子とする。

  20. childが null の場合、nodeを newParentの子に付加する。

  21. それ以外の場合、nodeをnewParentの 子のchildのインデックスの前に挿入する。

  22. newParentがシャドウホストであり、そのシャドウルートの スロット割り当てが「named」であり、 nodeが スロット可能である場合、 nodeにスロットを割り当てる。

  23. newParentのルートがシャドウルートであり、 newParentがスロットで、その割り当てられたノードが 空である場合、newParentについてスロット変更を通知する。

  24. nodeのルートを用いてツリーにスロット可能なものを割り当てる。

  25. nodeの各シャドウを含む包括的 子孫 inclusiveDescendantについて、シャドウを含むツリー順で:

    1. inclusiveDescendantがnodeである場合はisSubtreeRootを true とし、 それ以外の場合は false とする。

    2. inclusiveDescendant、isSubtreeRoot、 およびoldParentを用いて移動手順を実行する。

      移動アルゴリズムは 挿入および削除とは別個のプリミティブであるため、 inclusiveDescendantについて挿入手順 または削除手順を呼び出さない。

    3. inclusiveDescendantがカスタムであり、 newParentが 接続済みである場合、 inclusiveDescendant、コールバック名「connectedMoveCallback」、および « » を用いてカスタム要素 コールバック反応をキューに追加する。

  26. « »、« node »、 oldPreviousSibling、およびoldNextSiblingを使用して、oldParentについてツリー変異レコードをキューに追加する。

  27. « node »、« »、 newPreviousSibling、およびchildを使用して、newParentについてツリー変異レコードをキューに追加する。


ノード parent内のノード childを ノード nodeで置換するには:

  1. node、parent、 child、および « child » を与えて挿入前の妥当性を保証する。

  2. referenceChildをchildの次の兄弟とする。

  3. referenceChildがnodeである場合、referenceChildを nodeの次の兄弟に設定する。

  4. previousSiblingをchildの前の 兄弟とする。

  5. removedNodesを空の集合とする。

  6. nodeをparentのノード文書に移管する。

  7. childの親が null でない場合:

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

    2. suppressObserversを true に設定して、childを削除する。

    上記が false になり得るのは、childがnodeである場合だけである。

  8. nodeがDocumentFragment ノードである場合、nodesをnodeの子とする。それ以外の場合は « node » とする。

  9. suppressObserversを true に設定し、 nodeをparent内のreferenceChildの前に挿入する。

  10. nodes、 removedNodes、previousSibling、およびreferenceChildを使用して、parentについてツリー変異レコードをキューに追加する。

  11. childを返す。

ノードまたは null nodeを用いて、ノード parent内をすべて置換するには:

  1. removedNodesをparentの子とする。

  2. addedNodesを空の集合とする。

  3. nodeがDocumentFragment ノードである場合、 addedNodesをnodeの子に設定する。

  4. それ以外の場合、nodeが null でなければ、addedNodesを « node » に設定する。

  5. suppressObserversを true に設定して、 parentのすべての子をツリー順で削除する。

  6. nodeが null でない場合、suppressObserversを true に設定し、null の前でnodeを parentに挿入する。

  7. addedNodesまたはremovedNodesのいずれかが空でない場合、 addedNodes、 removedNodes、null、および null を使用して、parentについてツリー変異レコードをキューに追加する。

このアルゴリズムは、 ノードツリーの 制約に関するいかなる検査も行わない。仕様の著者はこれを適切に使用する必要がある。


ノード childを ノード parentから事前削除するには:

  1. childの親がparentでない場合、 "NotFoundError" DOMExceptionをスローする。

  2. childを削除する。

  3. childを返す。

仕様は、すべてまたは一部のノードについて削除 手順を定義できる。この アルゴリズムには、以下の削除 アルゴリズムで示されるように、ノード removedNode、真偽値 isSubtreeRoot、およびノード oldAncestorが渡される。

ノード nodeを、任意の 真偽値suppressObservers(既定値 false)を指定して削除するには:

  1. parentをnodeの親とする。

  2. 表明:parentは null でない。

  3. nodeを与えて、ライブ範囲の削除前手順を実行する。

  4. ルートのノード文書が nodeの ノード 文書である各NodeIterator オブジェクトiteratorについて、nodeおよびiteratorを 与えてNodeIteratorの削除前手順を実行する。

  5. oldPreviousSiblingをnodeの前の 兄弟とする。

  6. oldNextSiblingをnodeの次の兄弟とする。

  7. nodeをそのparentの子から削除する。

  8. nodeが割り当て済みである場合、nodeの割り当てられたスロットについてスロット可能なものを割り当てる。

  9. parentのルートがシャドウルートであり、 parentがスロットで、その割り当てられたノードが 空のリストである場合、 parentについてスロット変更を通知する。

  10. nodeがスロットである包括的子孫を持つ場合:

    1. parentのルートを用いてツリーにスロット可能なものを割り当てる。

    2. nodeを用いてツリーにスロット可能なものを割り当てる。

  11. node、true、および parentを用いて削除手順を実行する。

  12. isParentConnectedをparentの接続済み状態とする。

  13. nodeがカスタムであり、isParentConnectedが true の場合、 node、コールバック名 「disconnectedCallback」、および « » を用いてカスタム要素コールバック 反応をキューに追加する。

    現時点では、カスタム要素に parentが渡されないのは意図的である。必要性が生じた場合、将来変更される可能性がある。

  14. nodeの各シャドウを含む子孫 descendantについて、 シャドウを含むツリー順で:

    1. descendant、false、およびparentを用いて 削除手順を実行する。

    2. descendantがカスタムであり、isParentConnectedが true の場合、descendant、 コールバック名「disconnectedCallback」、および « » を用いてカスタム要素 コールバック反応をキューに追加する。

  15. 一時的な登録済みオブザーバーを追加する このとき、node と parent を指定する。

  16. suppressObserversが false の場合、« »、« node »、oldPreviousSibling、および oldNextSiblingを使用して、parentについてツリー 変異レコードをキューに追加する。

  17. parentについて子が変更された手順を実行する。

4.2.4. ミックスイン NonElementParentNode

Web 互換性により、getElementById() メソッドは、要素上で公開されない(したがって ParentNode 上でも公開されない)。

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

node の子孫のうち、 ID が elementId である最初の要素を返す。

ID で要素を取得するには、 ノード node と 文字列 elementId が与えられたとき、 node の子孫のうち、ツリー順で最初の、ID が elementId である要素を返す。 そのような要素が存在しない場合は、null を返す。

getElementById(elementId) メソッドの手順は、this と elementId が与えられたものとして、ID で要素を取得する結果を返すことである。

4.2.5. ミックスイン DocumentOrShadowRoot

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

documentOrShadowRoot の CustomElementRegistry オブジェクトがあればそれを返し、 そうでなければ null を返す。

customElementRegistry の getter 手順は 次のとおりである:

  1. this が文書である場合、this の カスタム要素レジストリを返す。

  2. Assert: this は ShadowRoot ノードである。

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

DocumentOrShadowRoot mixin は、文書と シャドウルートの間で共有される API を定義したい他の 標準によっても使用されることが期待されている。

4.2.6. ミックスイン ParentNode

リストのノードおよび 文字列nodesと、文書 documentが与えられたとき、ノードを ノードに変換するには:

  1. nodes内の各文字列を、documentおよびその文字列を与えてテキストノードを作成した結果で 置き換える。

  2. nodesのサイズが 1 の場合、nodes[0]を返す。

  3. fragmentを、documentを与えて文書 フラグメントを作成した結果とする。

  4. nodesの各nodeについて、nodeを fragmentに付加する。

  5. fragmentを返す。

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

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

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

  Element? querySelector(DOMString selectors);
  [NewObject] NodeList querySelectorAll(DOMString selectors);
};
Document includes ParentNode;
DocumentFragment includes ParentNode;
Element includes ParentNode;
collection = node . children
子要素を返す。
element = node . firstElementChild
要素である最初の子を返す。それ以外の場合は null。
element = node . lastElementChild
要素である最後の子を返す。それ以外の場合は null。
node . prepend(nodes)

nodes内の文字列を同等のText ノードに置き換えながら、 nodeの最初の子の前にnodesを挿入する。

ノードツリーの 制約に違反する場合、"HierarchyRequestError" DOMExceptionをスローする。

node . append(nodes)

nodes内の文字列を同等のText ノードに置き換えながら、 nodeの最後の子の後にnodesを挿入する。

ノードツリーの 制約に違反する場合、"HierarchyRequestError" DOMExceptionをスローする。

node . replaceChildren(nodes)

nodes内の文字列を同等のText ノードに置き換えながら、 nodeのすべての子をnodesで置き換える。

ノードツリーの 制約に違反する場合、"HierarchyRequestError" DOMExceptionをスローする。

node . moveBefore(movedNode, child)

movedNodeを最初に削除することなく、childが null でない場合はchildの後に、 それ以外の場合はnodeの最後の子の後に、 node内へ移動する。この メソッドはmovedNodeに関連付けられた状態を保持する。

ノードツリーの 制約に違反する場合、または移動されるノードに関連付けられた状態を 保持できない場合、"HierarchyRequestError" DOMExceptionをスローする。

node . querySelector(selectors)

selectorsに一致するnodeの子孫である最初の要素を返す。

node . querySelectorAll(selectors)

selectorsに一致する nodeのすべての要素子孫を返す。

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

firstElementChildのゲッター手順は、 要素である最初の子を 返すことである。それ以外の場合は null。

lastElementChildのゲッター手順は、 要素である最後の子を返すことである。 それ以外の場合は null。

childElementCountのゲッター手順は、 thisの要素である子の数を返すことである。

prepend(nodes)メソッドの手順は次のとおり:

  1. nodeを、nodesおよびthisのノード文書を与えてノードをノードに変換した結果とする。

  2. thisの 最初の子の前で、nodeをthisに事前挿入する。

append(nodes)メソッドの手順は次のとおり:

  1. nodeを、nodesおよびthisのノード文書を与えてノードをノードに変換した結果とする。

  2. nodeをthisに付加する。

replaceChildren(nodes)メソッドの 手順 は次のとおり:

  1. nodeを、nodesおよびthisのノード文書を与えてノードをノードに変換した結果とする。

  2. node、this、null、および thisの子を与えて、挿入前の妥当性を保証する。

  3. this内をnodeですべて置換する。

moveBefore(node, child) メソッドの手順は次のとおり:

  1. referenceChildをchildとする。

  2. referenceChildがnodeである場合、referenceChildを nodeの次の兄弟に設定する。

  3. referenceChildの前で、nodeをthis内へ移動する。

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 の getter 手順は、要素である、 最初の先行する兄弟を返すことであり、そうでなければ null を返す。

nextElementSibling の getter 手順は、要素である、 最初の後続する兄弟を返すことであり、そうでなければ null を返す。

4.2.8. ミックスイン ChildNode

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

nodes内の文字列を同等のText ノードに置き換えながら、 nodeの直前にnodesを挿入する。

ノードツリーの 制約に違反する場合、"HierarchyRequestError" DOMExceptionをスローする。

node . after(...nodes)

nodes内の文字列を同等のText ノードに置き換えながら、 nodeの直後にnodesを挿入する。

ノードツリーの 制約に違反する場合、"HierarchyRequestError" DOMExceptionをスローする。

node . replaceWith(...nodes)

nodes内の文字列を同等のText ノードに置き換えながら、 nodeをnodesで置き換える。

ノードツリーの 制約に違反する場合、"HierarchyRequestError" DOMExceptionをスローする。

node . remove()
nodeを削除する。

before(nodes)メソッドの手順は次のとおり:

  1. parentをthisの親とする。

  2. parentが null の場合、返る。

  3. viablePreviousSiblingを、nodesに含まれないthisの最初の先行する 兄弟とする。そのようなものがない場合は null とする。

  4. nodeを、nodesおよびthisのノード文書を与えてノードをノードに変換した結果とする。

  5. viablePreviousSiblingが null の場合、それをparentの 最初の子に設定する。それ以外の場合は viablePreviousSiblingの 次の兄弟に設定する。

  6. viablePreviousSiblingの前で、nodeをparentに事前挿入する。

after(nodes)メソッドの手順は次のとおり:

  1. parentをthisの親とする。

  2. parentが null の場合、返る。

  3. viableNextSiblingを、nodesに含まれないthisの最初の後続する 兄弟とする。そのようなものがない場合は null とする。

  4. nodeを、nodesおよびthisのノード文書を与えてノードをノードに変換した結果とする。

  5. viableNextSiblingの前で、nodeをparentに事前挿入する。

replaceWith(nodes)メソッドの手順は次のとおり:

  1. parentをthisの親とする。

  2. parentが null の場合、返る。

  3. viableNextSiblingを、nodesに含まれないthisの最初の後続する 兄弟とする。そのようなものがない場合は null とする。

  4. nodeを、nodesおよびthisのノード文書を与えてノードをノードに変換した結果とする。

  5. thisの親がparentである場合、parent内のthisを nodeで置換する。

    thisがnodeに挿入されている可能性がある。

  6. それ以外の場合、viableNextSiblingの前でnodeをparentに事前挿入する。

remove()メソッドの手順は次のとおり:

  1. thisの親が null の場合、返る。

  2. thisを削除する。

4.2.9. ミックスイン Slottable

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

assignedSlot のgetter手順は、find a slot を this と true で呼び出した結果を返します。

4.2.10. 旧式コレクション: NodeList と HTMLCollection

コレクションは、ノードのリストを表すオブジェクトです。コレクションは、ライブまたは静的のいずれかです。特に明記されていない限り、コレクションはライブでなければなりません。

コレクションがライブの場合、そのオブジェクトの属性およびメソッドは、実際の基礎となるデータに対して動作し、データのスナップショットではありません。

コレクションが生成されると、フィルターとルートがそれに関連付けられます。

その後、コレクションは、コレクションで表されるサブツリーのビューを、コレクションのルートに基づいて、指定されたフィルターに一致するノードだけを含めて表します。ビューは線形です。特に別途要件がない場合、コレクション内のノードはツリー順でソートされなければなりません。

4.2.10.1. インターフェース NodeList

NodeList オブジェクトは、ノードのコレクションです。

[Exposed=Window]
interface NodeList {
  getter Node? item(unsigned long index);
  readonly attribute unsigned long length;
  iterable<Node>;
};
collection . length
コレクション内のノードの数を返す。
element = collection . item(index)
element = collection[index]
コレクションからインデックス indexを持つノードを返す。ノードはツリー順にソートされている。

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

length属性は、 コレクションによって表されるノードの数を返さなければならない。

item(index)メソッドは、 コレクション内のindex番目のノードを返さなければならない。コレクション内に index番目のノードが存在しない場合、このメソッドは null を返さなければならない。

4.2.10.2. インターフェース HTMLCollection
[Exposed=Window, LegacyUnenumerableNamedProperties]
interface HTMLCollection {
  readonly attribute unsigned long length;
  getter Element? item(unsigned long index);
  getter Element? namedItem(DOMString name);
};

HTMLCollection オブジェクトは、要素のコレクションである。

HTMLCollection は、Web から取り除くことのできない歴史的遺物である。 開発者がこれを使い続けることはもちろん歓迎されるが、新しい API 標準の設計者はこれを使うべきではない (代わりに IDL で sequence<T> を使うこと)。

collection . length
コレクション内の 要素数を返す。
element = collection . item(index)
element = collection[index]
コレクションから、インデックス index を持つ要素を返す。 要素は ツリー 順でソートされる。
element = collection . namedItem(name)
element = collection[name]
コレクションから、ID または名前が name である最初の要素を返す。

このオブジェクトのサポートされるプロパティインデックスは、 コレクションによって表される要素数より 1 少ない数までの、0 から始まる範囲内の数である。そのような 要素が存在しない場合、サポートされるプロパティインデックスは存在しない。

length の getter 手順は、 コレクションによって表されるノード数を返すことである。

item(index) メソッドの手順は、 コレクション内の index番目の 要素を返すことである。コレクション内に index番目の要素がない場合、このメソッドは null を返さなければならない。

サポートされるプロパティ名は、次の手順によって 返されるリストの値である:

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

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

    1. element が、result 内にないIDを持つ場合、 element のIDを result に追加する。

    2. element がHTML 名前空間内にあり、かつ、空文字列でも result 内にもない値を持つ name 属性を持つ場合、element の name 属性の値を result に追加する。

  3. result を返す。

namedItem(key) メソッドの手順は次のとおりである:

  1. key が空文字列である場合、null を返す。

  2. 次のうち少なくとも 1 つが true である、コレクション内の最初の要素を返す:

    そのような要素が存在しない場合は null。

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

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

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

各類似オリジンのウィンドウエージェントも、ミューテーションオブザーバー カウンター (数値)を持ち、その初期値は 0 である。

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

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

  2. surrounding agent の mutation observer microtask queued を true に設定する。

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

ミューテーションオブザーバーに 通知するには、次の手順を実行する:

  1. 周囲のエージェントのミューテーションオブザーバーのマイクロタスクが キューに登録済みかどうかを false に設定する。

  2. notifyList を、ソートした結果とする。 周囲のエージェントの保留中のミューテーション オブザーバーを昇順に並べ替える。ここで、a の 作成インデックスが b の作成インデックスより小さい場合、 a は b より小さいものとする。

  3. 空にする。対象は周囲のエージェントの保留中のミューテーション オブザーバーである。

  4. signalSet を、複製したものとする。対象は 周囲のエージェントの シグナル スロットである。

  5. 空にする。対象は周囲のエージェントのシグナルスロットである。

  6. notifyList の各 mo について次を実行する:

    1. records を、複製したものとする。 mo の レコード キューを対象とする。

    2. mo のレコードキューを空にする。レコードキュー。

    3. mo の一時的な登録済み オブザーバーを削除する。

    4. records が空で ない場合、呼び出す。 mo のコールバックを « records, mo » と "report" を指定し、コールバックの this 値を mo として呼び出す。

  7. signalSet の各 slot について次を実行する:イベントを 発火する。その名前は slotchange であり、 bubbles 属性を true に設定し、 slot を対象とする。


各ノードは、登録済みオブザーバー リスト(0 個以上のリストであり、 登録済み オブザーバーを含む)を持ち、初期状態では空である。

登録済み オブザーバーは、 オブザーバー(MutationObserver オブジェクト)と オプション(MutationObserverInit 辞書)から構成される。

一時的な 登録済みオブザーバーは、 登録済み オブザーバーであり、さらに ソース(登録済みオブザーバーであり、 一時的な登録済みオブザーバーではないもの)も持つ。

一時的な登録済みオブザーバーは、 指定された ノードの子孫内の変更を、ノードが削除または 移動された後も追跡するために使用される。 これにより、subtree がノードの以前の 親で true に設定されている場合に、変更が失われるのを防ぐ。 これらは、次にミューテーションオブザーバーに通知されるときに削除される。

ノード node と ノード parent を指定して、一時的な 登録済みオブザーバーを追加するには、次の手順を実行する:

  1. parent の各自身を含む祖先 inclusiveAncestor について、 続いて inclusiveAncestor の 登録済みオブザーバーリストの 各 registered について次を実行する:

    1. registered の オプション["subtree"] が false の場合、 次の反復に進む。

    2. observer を registered の オブザーバーとする。

    3. registered が 一時的な登録済みオブザーバーの場合、 source を registered の ソースとし、 それ以外の場合は registered とする。

    4. node の登録済みオブザーバーリストが、 一時的な登録済みオブザーバーを含み、その ソースが source である場合、次の反復に進む。

    5. 末尾に追加する。新しい一時的な登録済みオブザーバーであり、その オブザーバーは observer、 オプションは source の オプション、ソース は source であるものを、node の登録済み オブザーバーリストの末尾に追加する。

    6. node への弱参照を追加する。追加先は observer の 一時ノード集合である。

    7. observer を追加する。追加先は周囲のエージェントの 保留中のミューテーションオブザーバーである。

      これにより、node の一時的な登録済みオブザーバーが、 次にミューテーションオブザーバーに通知されるときに 削除されることが保証される。 これは、MutationRecord オブジェクトがキューに登録されていない場合でも同様であり、 observer に対して適用される。

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

MutationObserver オブジェクト observer の一時的な登録済みオブザーバーを削除するには、次の手順を実行する:

  1. observer の 一時ノード集合の各 node について次を実行する:すべての 一時的な登録済みオブザーバーのうち、そのオブザーバーが observer であるものを、node の登録済みオブザーバー リストから削除する。

  2. observer の一時ノード集合を空にする。一時ノード集合。

4.3.1. インターフェース MutationObserver

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

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

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

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

MutationObserver オブジェクトを使用して、 ノードのツリーに対する変更を監視できる。

各 MutationObserver オブジェクトには、次の概念が関連付けられる:

observer = new MutationObserver(callback)
MutationObserver オブジェクトを構築し、そのコールバックを callback に設定する。callback は、MutationRecord オブジェクトのリストを 第 1 引数として、構築された MutationObserver オブジェクトを第 2 引数として呼び出される。これは、 observe() メソッドで登録されたノードに 変更が加えられた後に呼び出される。
observer . observe(target, options)
指定された target (ノード)を監視し、 options(オブジェクト)で指定された条件に基づいて 変更を報告するようユーザーエージェントに指示する。

options 引数では、オブジェクトのメンバーを通じて 変更の監視オプションを設定できる。使用できるオブジェクトのメンバーは 次のとおりである:

childList
target の子に対する変更を 監視する場合は、true に設定する。
attributes
target の 属性に対する変更を 監視する場合は、true に設定する。 attributeOldValue または attributeFilter が指定されている場合は、 省略できる。
characterData
target の データに対する変更を 監視する場合は、true に設定する。 characterDataOldValue が指定されている場合は、省略できる。
subtree
target だけでなく、 target の 子孫に対する変更も 監視する場合は、true に設定する。
attributeOldValue
attributes が true であるか省略されており、 target の 属性の 変更前の値を 記録する必要がある場合は、 true に設定する。
characterDataOldValue
characterData が true に設定されているか省略されており、 target の データの 変更前の値を 記録する必要がある場合は、 true に設定する。
attributeFilter
すべての属性の変更を 監視する必要がなく、attributes が true または省略されている場合は、 属性の ローカル名(名前空間を含まない)の リストに設定する。
observer . disconnect()
observer によるすべての変更の監視を停止する。observe() メソッドが再び使用されるまで、 observer のコールバックは呼び出されない。
observer . takeRecords()
レコード キューを空にし、 そこに含まれていたものを返す。

new MutationObserver(callback) コンストラクターの手順は次のとおりである:

  1. this のコールバックを callback に設定する。

  2. this の作成インデックスを、this の 関連するエージェントのミューテーションオブザーバー カウンターに設定する。

  3. this の関連するエージェントのミューテーションオブザーバー カウンターを 1 増やす。

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

  1. options["attributeOldValue"] または options["attributeFilter"] のいずれかが存在し、 options["attributes"] が存在しない場合、 options["attributes"] を true に設定する。

  2. options["characterDataOldValue"] が存在し、options["characterData"] が 存在しない場合、options["characterData"] を true に設定する。

  3. options["childList"]、 options["attributes"]、 および options["characterData"] のいずれも true でない場合、投げる。 TypeError を。

  4. options["attributeOldValue"] が true であり、 options["attributes"] が false の場合、投げる。 TypeError を。

  5. options["attributeFilter"] が存在し、 options["attributes"] が false の場合、投げる。 TypeError を。

  6. options["characterDataOldValue"] が true であり、 options["characterData"] が false の場合、投げる。 TypeError を。

  7. registered を、target の 登録済みオブザーバーリスト内の登録済みオブザーバーのうち、 一時的な登録済みオブザーバーではなく、 オブザーバーがthis であるものとする。存在しない場合は null とする。

    target がthis によって監視される サブツリー内にあり、 削除または移動された場合、target の登録済みオブザーバーリストには、 一時的な登録済みオブザーバーで、そのオブザーバーが this であるものも含まれる場合がある。これらは、次にミューテーション オブザーバーに通知されるときに削除されるため、無視される。

  8. registered が null でない場合:

    1. this の一時ノード集合の各 node について次を実行する: node の 登録済み オブザーバーリストから、 一時的な登録済みオブザーバーのうち、 ソースが registered であるものをすべて削除する。

    2. registered のオプションを options に設定する。

  9. それ以外の場合:

    1. 新しい追加する対象は登録済み オブザーバーであり、その オブザーバーはthis、 オプションは options であり、 target の 登録済みオブザーバーリストの末尾に追加する。

    2. target への弱参照を追加する。追加先はthis の ノードリストである。

disconnect() メソッドの手順は次のとおりである:

  1. this のノードリストの各 node について次を実行する: node の登録済みオブザーバーリストから、 登録済み オブザーバーのうち、 オブザーバーがthis であるものを すべて削除する。

  2. 一時的な登録済み オブザーバーを削除する。対象はthis である。

  3. 空にする。対象はthis のノードリストである。

  4. 空にする。対象はthis のレコード キューである。

takeRecords() メソッドの手順は次のとおりである:

  1. records を、複製したものとする。対象はthis の レコード キューである。

  2. 空にする。対象はthis のレコード キューである。

  3. records を返す。

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

変更レコードを キューに入れるには、type、target、 name、namespace、oldValue、addedNodes、 removedNodes、previousSibling、および nextSibling を指定して次を実行する:

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

  2. nodes を target の自身を含む祖先とする。

  3. nodes の各 node について、続いて各要素について、 node の登録済みオブザーバー リストの各 registered について、次を実行する:

    1. options を registered の オプションとする。

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

      次を実行する:

      1. mo を registered のオブザーバーとする。

      2. interestedObservers[mo] が存在しない場合、 interestedObservers[mo] を null に設定する。

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

  4. interestedObservers が空である場合、 返る。

  5. interestedObservers の各 observer → mappedOldValue について次を実行する:

    1. record を新しい MutationRecord オブジェクトとし、その type を type に、target を target に、 attributeName を name に、attributeNamespace を namespace に、oldValue を mappedOldValue に、 addedNodes を addedNodes に、 removedNodes を removedNodes に、 previousSibling を previousSibling に、そして nextSibling を nextSibling に設定する。

    2. record を observer の レコード キューにエンキューする。

    3. observer を追加する。追加先は周囲のエージェントの 保留中のミューテーションオブザーバーである。

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

ツリーミューテーションレコードをキューに入れるには、target・addedNodes・removedNodes・previousSibling・nextSibling を使って次を行う:

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

  2. ミューテーションレコードをキューに入れるとき、"childList"・target・null・null・null・addedNodes・removedNodes・previousSibling・nextSibling を使う。

4.3.3. インターフェース MutationRecord

[Exposed=Window]
interface MutationRecord {
  readonly attribute DOMString type;
  [SameObject] readonly attribute Node target;
  [SameObject] readonly attribute NodeList addedNodes;
  [SameObject] readonly attribute NodeList removedNodes;
  readonly attribute Node? previousSibling;
  readonly attribute Node? nextSibling;
  readonly attribute DOMString? attributeName;
  readonly attribute DOMString? attributeNamespace;
  readonly attribute DOMString? oldValue;
};
record . type
"attributes" を返すのは、 属性に対する 変更の場合である。 "characterData" を返すのは、 CharacterData ノードに対する変更の場合である。また、 "childList" を返すのは、 ツリーに対する変更の場合で、そのツリーは ノードからなる。
record . target
変更の影響を受けたノードを、 変更の typeに応じて返す。 "attributes" の場合は、 要素であり、その 属性が変更されたものを返す。 "characterData" の場合は、CharacterData ノードを返す。 "childList" の場合は、 ノードであり、その 子が 変更されたものを返す。
record . addedNodes
record . removedNodes
追加されたノードと 削除されたノードを それぞれ返す。
record . previousSibling
record . nextSibling
直前の兄弟と次の兄弟を それぞれ、 追加または削除されたノードについて返す。それ以外の場合は null を返す。
record . attributeName
変更された属性のローカル名を返す。対象の属性がない場合は null を返す。
record . attributeNamespace
変更された属性の名前空間を返す。対象の属性がない場合は null を返す。
record . oldValue
戻り値は typeによって異なる。 "attributes" の場合は、 変更された属性の 値であり、 その値は 変更された属性の 変更前のものである。 "characterData" の場合は、 変更されたノードのデータであり、 ノードの変更前のデータである。 "childList" の場合は、 null である。

type、target、 addedNodes、 removedNodes、 previousSibling、 nextSibling、 attributeName、 attributeNamespace、および oldValue 属性は、それらが初期化された値を 返さなければならない。

4.4. インターフェース Node

[Exposed=Window]
interface Node : EventTarget {
  const unsigned short ELEMENT_NODE = 1;
  const unsigned short ATTRIBUTE_NODE = 2;
  const unsigned short TEXT_NODE = 3;
  const unsigned short CDATA_SECTION_NODE = 4;
  const unsigned short ENTITY_REFERENCE_NODE = 5; // legacy
  const unsigned short ENTITY_NODE = 6; // legacy
  const unsigned short PROCESSING_INSTRUCTION_NODE = 7;
  const unsigned short COMMENT_NODE = 8;
  const unsigned short DOCUMENT_NODE = 9;
  const unsigned short DOCUMENT_TYPE_NODE = 10;
  const unsigned short DOCUMENT_FRAGMENT_NODE = 11;
  const unsigned short NOTATION_NODE = 12; // legacy
  readonly attribute unsigned short nodeType;
  readonly attribute DOMString nodeName;

  readonly attribute USVString baseURI;

  readonly attribute boolean isConnected;
  readonly attribute Document? ownerDocument;
  Node getRootNode(optional GetRootNodeOptions options = {});
  readonly attribute Node? parentNode;
  readonly attribute Element? parentElement;
  boolean hasChildNodes();
  [SameObject] readonly attribute NodeList childNodes;
  readonly attribute Node? firstChild;
  readonly attribute Node? lastChild;
  readonly attribute Node? previousSibling;
  readonly attribute Node? nextSibling;

  [CEReactions] attribute DOMString? nodeValue;
  [CEReactions] attribute DOMString? textContent;
  [CEReactions] undefined normalize();

  [CEReactions, NewObject] Node cloneNode(optional boolean subtree = false);
  boolean isEqualNode(Node? otherNode);
  boolean isSameNode(Node? otherNode); // legacy alias of ===

  const unsigned short DOCUMENT_POSITION_DISCONNECTED = 0x01;
  const unsigned short DOCUMENT_POSITION_PRECEDING = 0x02;
  const unsigned short DOCUMENT_POSITION_FOLLOWING = 0x04;
  const unsigned short DOCUMENT_POSITION_CONTAINS = 0x08;
  const unsigned short DOCUMENT_POSITION_CONTAINED_BY = 0x10;
  const unsigned short DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 0x20;
  unsigned short compareDocumentPosition(Node other);
  boolean contains(Node? other);

  DOMString? lookupPrefix(DOMString? namespace);
  DOMString? lookupNamespaceURI(DOMString? prefix);
  boolean isDefaultNamespace(DOMString? namespace);

  [CEReactions] Node insertBefore(Node node, Node? child);
  [CEReactions] Node appendChild(Node node);
  [CEReactions] Node replaceChild(Node node, Node child);
  [CEReactions] Node removeChild(Node child);
};

dictionary GetRootNodeOptions {
  boolean composed = false;
};

Node は、すべての ノード が使用する抽象 インターフェイスである。これを直接 インスタンス化することはできない。

各 ノード には、関連付けられた ノード 文書 があり、作成時に設定される。これは 文書 である。

ノード の ノード文書 は、 採用 アルゴリズムによって変更できる。

ノードの親を取得するアルゴリズムは、 eventが与えられたとき、 ノードの割り当て先スロットを返す。ただし、ノードが割り当てられている場合に限る。それ以外の場合は、 ノードの親を返す。

各 ノード には、登録済みオブザーバーリスト もある。

インターフェイス interface を実装する ノードを作成する には、 文書 document が与えられたとき、次を実行する。

  1. 表明:interface は Document でも、Document を継承するインターフェイス でもない。 文書を作成するには、代わりに 文書を 作成するを使用する。

  2. document のノードであり、 interface を実装する新しいノードを、 document の関連するレルムで返す。そのノード文書は document に設定される。


node . nodeType

node の型に対応する数値を、次のとおり返す。

Element
Node . ELEMENT_NODE (1)。
Attr
Node . ATTRIBUTE_NODE (2)。
排他的な Text ノード
Node . TEXT_NODE (3)。
CDATASection
Node . CDATA_SECTION_NODE (4)。
ProcessingInstruction
Node . PROCESSING_INSTRUCTION_NODE (7)。
Comment
Node . COMMENT_NODE (8)。
Document
Node . DOCUMENT_NODE (9)。
DocumentType
Node . DOCUMENT_TYPE_NODE (10)。
DocumentFragment
Node . DOCUMENT_FRAGMENT_NODE (11)。
node . nodeName

node の型に対応する文字列を、次のとおり返す。

Element
その HTML 大文字化修飾名。
Attr
その 修飾名。
排他的な Text ノード
"#text"。
CDATASection
"#cdata-section"。
ProcessingInstruction
その ターゲット。
Comment
"#comment"。
Document
"#document"。
DocumentType
その 名前。
DocumentFragment
"#document-fragment"。

nodeType 取得子の手順は、this が 実装する インターフェイスに応じて、最初に一致する 項目を返すことである。

Element
ELEMENT_NODE (1)
Attr
ATTRIBUTE_NODE (2);
排他的な Text ノード
TEXT_NODE (3);
CDATASection
CDATA_SECTION_NODE (4);
ProcessingInstruction
PROCESSING_INSTRUCTION_NODE (7);
Comment
COMMENT_NODE (8);
Document
DOCUMENT_NODE (9);
DocumentType
DOCUMENT_TYPE_NODE (10);
DocumentFragment
DOCUMENT_FRAGMENT_NODE (11).

nodeName 取得子の手順は、this が 実装する インターフェイスに応じて、最初に一致する 項目を返すことである。

Element
その HTML 大文字化修飾名。
Attr
その 修飾名。
排他的な Text ノード
"#text"。
CDATASection
"#cdata-section"。
ProcessingInstruction
その ターゲット。
Comment
"#comment"。
Document
"#document"。
DocumentType
その 名前。
DocumentFragment
"#document-fragment"。

node . baseURI
node のノード文書の基底 URL を返す。

baseURI 取得子の手順は次のとおりである。

  1. baseURL を、this のノード 文書の 基底 URL を取得する アルゴリズムを実行した結果とする。

  2. baseURL が null の場合、baseURL をthis の ノード 文書のURL に設定する。

  3. baseURL を直列化して返す。


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 取得子の手順は、次の場合に true を返し、 this が接続されている場合である。それ以外の場合は false を返す。

ownerDocument 取得子の手順は、次の場合に null を返し、 this が文書である場合、それ以外の場合はthis のノード 文書を返す。

文書のノード文書は、その 文書自体である。すべてのノードは、常にノード 文書を 持つ。

getRootNode(options) メソッドの手順は、 options["composed"] が true の場合、this のシャドウを含むルートを返し、 それ以外の場合はthis の ルートを返す。

parentNode 取得子の手順は、 this の親を返すことである。

parentElement 取得子の手順は、 this の親要素を返すことである。

hasChildNodes() メソッドの手順は、 this に子がある場合は true、 それ以外の場合は false を返すことである。

childNodes 取得子の手順は、 this をルートとし、 子のみに一致する NodeList を返すことである。

firstChild 取得子の手順は、 this の最初の 子を返すことである。

lastChild 取得子の手順は、this の 最後の 子を返すことである。

previousSibling 取得子の手順は、 this の直前の兄弟を返すことである。

nextSibling 取得子の手順は、 this の直後の 兄弟を返すことである。


nodeValue 取得子の手順は、 this が実装するインターフェイスに応じて、以下を返す。

Attr
this の値。
CharacterData
this のデータ。
それ以外の場合
null。

nodeValue 設定子の手順は、指定された値が null の場合、それを 空文字列として扱ったうえで、this が 実装するインターフェイスに応じて、以下のように処理することである。

Attr

既存の属性値を設定する処理を、this と指定された値を使用して実行する。

CharacterData

データを置換する 処理を、this に対して、0、this の長さ、および 指定された値を使用して実行する。

それ以外の場合

何もしない。

ノード node を使用して テキスト内容を取得するには、 node が実装するインターフェイスに応じて、以下を返す。

DocumentFragment
Element
node の子孫のテキスト内容。
Attr
node の値。
CharacterData
node のデータ。
それ以外の場合
null。

textContent 取得子の手順は、 テキスト内容を取得する処理を、this を使用して実行した結果を返すことである。

文字列をすべて置換するには、 ノード parent 内で 文字列 string を使用して、次の手順を実行する。

  1. node を null とする。

  2. string が空文字列でない場合、node を テキスト ノードを作成する処理に、parent のノード文書と string を渡して得られた結果に設定する。

  3. すべてを置換する処理を、parent 内で node を使用して 実行する。

テキスト内容を設定するには、 ノード node と 文字列 value を使用し、 node が実装するインターフェイスに応じて、以下のように処理する。

DocumentFragment
Element

文字列を すべて置換する処理を、node 内で value を使用して実行する。

Attr

既存の属性値を設定する処理を、 node と value を使用して実行する。

CharacterData

データを置換する 処理を、node に対して、0、node の長さ、および value を使用して実行する。

それ以外の場合

何もしない。

textContent 設定子の手順は、指定された値が null の場合、それを 空文字列として扱ったうえで、テキスト内容を設定する処理を、this と指定された値を使用して実行することである。


node . normalize()
空の 排他的な Text ノードを削除し、残りの データを、連続する排他的な Text ノードから それらの最初のノードに連結する。

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

  1. length を node の長さとする。

  2. length がゼロの場合、node を削除し、存在する場合は 次の排他的な Text ノードの処理を続ける。

  3. data を、node の 連続する排他的な Text ノード(自身を除く)の データを 連結したものとし、 ツリー順に従う。

  4. データを 置換する処理を、node に対して length、0、data を使用して実行する。

  5. currentNode を node の直後の兄弟とする。

  6. currentNode が排他的な Text ノードである間、繰り返す。

    1. 開始 ノードが currentNode である各ライブ範囲について、 その開始オフセットに length を加算し、 開始ノードを node に設定する。

    2. 終了ノードが currentNode である 各ライブ範囲について、 その終了オフセットに length を加算し、終了ノードを node に設定する。

    3. 開始 ノードが currentNode の 親であり、開始 オフセットが currentNode の インデックスである各ライブ範囲について、開始 ノードを node に設定し、その 開始オフセットを length に設定する。

    4. 終了ノードが currentNode の 親であり、終了 オフセットが currentNode の インデックスである各ライブ範囲について、終了ノードを node に設定し、その 終了オフセットを length に設定する。

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

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

  7. node の連続する排他的な Text ノードを (自身を除いて)ツリー順に削除する。


node . cloneNode([subtree = false])
node のコピーを返す。 subtree が true の場合、コピーには node の子孫も含まれる。
node . isEqualNode(otherNode)
node と otherNode が 同じプロパティを持つかどうかを返す。
仕様は、 すべてまたは一部のノードに対して 複製手順を定義してもよい。 アルゴリズムには、ノードを 複製するアルゴリズムに示されるとおり、 node、copy、subtree が渡される。

HTML は、 input、 script、 および template など、いくつかの要素に対して複製手順を定義している。SVG もその script 要素に対して同様に定義すべきだが、定義していない。

ノード node と、省略可能な文書 document (既定値は node のノード文書)、真偽値 subtree(既定値は false)、ノードまたは null の parent(既定値は null)、および null または CustomElementRegistry オブジェクト fallbackRegistry (既定値は null)を指定して、ノードを複製するには、次の手順を実行する。

  1. 表明: node は文書でないか、node が document である。

  2. copy を、node、 document、fallbackRegistry を指定して単一のノードを複製する処理の結果とする。

  3. node に対して他の適用可能な仕様で定義された 複製手順を実行し、 node、copy、および subtree を引数として渡す。

  4. parent が null でない場合、copy を parent に追加する。

  5. subtree が true の場合、node の 子である各 child について、ツリー順に、 ノードを 複製する処理を child に対して実行し、 document を document に設定し、 subtree を subtree に設定し、 parent を copy に設定し、 fallbackRegistry を fallbackRegistry に設定する。

  6. node が要素であり、node が シャドウ ホストであり、node のシャドウルートの 複製可能が true である場合、次を実行する。

    1. 表明: copy はシャドウホストではない。

    2. shadowRootRegistry を node のシャドウ ルートの カスタム要素レジストリとする。

    3. shadowRootRegistry がグローバルカスタム要素 レジストリである場合、 shadowRootRegistry を document の カスタム要素レジストリの有効なグローバルカスタム 要素レジストリに設定する。

    4. シャドウルートを取り付ける処理を、 copy、node の シャドウルートのモード、node の シャドウルートのフォーカスの 委譲、node の シャドウルートの直列化可能、node の シャドウルートのスロット 割り当て、true、および shadowRootRegistry を使用して実行する。

    5. copy のシャドウルートの宣言的を node のシャドウルートの宣言的に設定する。

    6. copy のシャドウルートの カスタム要素 レジストリを null に維持するを node の シャドウルートのカスタム要素 レジストリを null に維持するに設定する。

    7. node のシャドウルートの 子である各 child について、ツリー順に、 ノードを複製する処理を child に対して実行し、 document を document に設定し、 subtree を true に設定し、 parent を copy のシャドウルートに設定する。

      ここでは意図的に fallbackRegistry 引数を渡さない。

  7. copy を返す。

ノード node、 文書 document、および null または CustomElementRegistry オブジェクト fallbackRegistry を指定して、単一の ノードを複製するには、次の手順を実行する。

  1. copy を null とする。

  2. node が要素である場合、次を実行する。

    1. registry を node のカスタム要素レジストリとする。

    2. registry が null の場合、registry を fallbackRegistry に設定する。

    3. registry がグローバルカスタム要素 レジストリである場合、 registry を document のカスタム要素レジストリの 有効なグローバルカスタム 要素レジストリに設定する。

    4. copy を、document、 node のローカル 名、node の 名前空間、node の名前空間接頭辞、 node のis 値、false、および registry を指定して要素を 作成する処理の結果に設定する。

    5. node の属性リストの各 attribute に対して、次を実行する。

      1. copyAttribute を、attribute、 document、null を指定して 単一の ノードを複製する処理の結果とする。

      2. copyAttribute を copy に追加する。

  3. それ以外の場合、node が文書であれば、copy を node と同じインターフェイスを実装する文書を作成する処理の結果に設定する。その際、 document の関連するレルムを指定する。

  4. それ以外の場合、copy を、node と同じインターフェイスを 実装するノードを作成する処理の結果に設定する。その際、 document を指定する。

  5. node が実装するインターフェイスに応じて、 次の追加要件を満たす。

    Document
    1. copy の符号化方式、コンテンツタイプ、 URL、オリジン、型、 モード、および宣言的 シャドウルートを許可するを、 node の対応する値に設定する。

    2. copy の基底 URL の上書きを、 node の 基底 URL を取得する処理を実行した結果に設定する。

    3. node のカスタム要素レジストリの スコープ付きであるが true の場合、copy の カスタム要素レジストリを node の カスタム要素レジストリに設定する。

    DocumentType

    copy の名前、公開 ID、および システム IDを node の対応する値に設定する。

    Attr

    copy の名前空間、名前空間接頭辞、 ローカル名、および値を node の対応する値に設定する。

    Text
    Comment

    copy のデータを node のデータに設定する。

    ProcessingInstruction

    copy の対象と データを node の対応する値に設定する。

    それ以外の場合

    何もしない。

  6. 表明: copy はノードである。

  7. node が文書である場合、document を copy に設定する。

  8. copy のノード文書を document に設定する。

  9. copy を返す。

cloneNode(subtree) メソッドの手順は次のとおりである。

  1. this がシャドウルートである場合、 "NotSupportedError" DOMException を投げる。

  2. this を指定してノードを複製する処理を実行し、 subtree を subtree に設定した結果を返す。

ノード A は、以下の 条件がすべて true である場合、ノード B と 等しい。

isEqualNode(otherNode) メソッドの手順は、 otherNode が null でなく、this が otherNode と等しい場合は true、 それ以外の場合は false を返すことである。

isSameNode(otherNode) メソッドの手順は、 otherNode がthis である場合は true、それ以外の場合は false を返すことである。


node . compareDocumentPosition(other)
node に対する other の位置を示すビットマスクを返す。 設定できるビットは次のとおりである。
Node . DOCUMENT_POSITION_DISCONNECTED (1)
node と other が同じ ツリーにない場合に設定される。
Node . DOCUMENT_POSITION_PRECEDING (2)
other が node に先行する場合に設定される。
Node . DOCUMENT_POSITION_FOLLOWING (4)
other が node に後続する場合に設定される。
Node . DOCUMENT_POSITION_CONTAINS (8)
other が node の祖先である場合に設定される。
Node . DOCUMENT_POSITION_CONTAINED_BY (16、16 進数では 10)
other が node の子孫である場合に設定される。
node . contains(other)
other が node の自身を含む子孫である場合は true、 それ以外の場合は false を返す。

compareDocumentPosition() がマスクとして返す定数は次のとおりである。

compareDocumentPosition(other) メソッドの 手順は次のとおりである。

  1. this が other である場合、ゼロを返す。

  2. node1 を other、node2 をthis とする。

  3. attr1 と attr2 を null とする。

  4. node1 が属性である場合、attr1 を node1 に設定し、 node1 を attr1 の要素に設定する。

  5. node2 が属性である場合、次を実行する。

    1. attr2 を node2 に設定し、node2 を attr2 の 要素に設定する。

    2. attr1 と node1 が null でなく、node2 が node1 である場合、次を実行する。

      1. node2 の属性リストの各 attr に対して、次を実行する。

        1. attr が attr1 と等しい場合、 DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC と DOCUMENT_POSITION_PRECEDING を 加算した結果を返す。

        2. attr が attr2 と等しい場合、 DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC と DOCUMENT_POSITION_FOLLOWING を 加算した結果を返す。

  6. node1 または node2 が null であるか、node1 のルートが node2 のルートでない場合、 DOCUMENT_POSITION_DISCONNECTED、 DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC、 および DOCUMENT_POSITION_PRECEDING または DOCUMENT_POSITION_FOLLOWING のいずれかを加算した結果を返す。ただし、 その選択は一貫していなければならない。

    DOCUMENT_POSITION_PRECEDING または DOCUMENT_POSITION_FOLLOWING のどちらを返すかは、通常ポインター比較によって実装される。 JavaScript の実装では、キャッシュされた Math.random() の値を使用できる。

  7. node1 が node2 の祖先であり、attr1 が null であるか、または node1 が node2 であり、attr2 が null でない場合、 DOCUMENT_POSITION_CONTAINS と DOCUMENT_POSITION_PRECEDING を加算した結果を返す。

  8. node1 が node2 の子孫であり、attr2 が null であるか、または node1 が node2 であり、attr1 が null でない場合、 DOCUMENT_POSITION_CONTAINED_BY と DOCUMENT_POSITION_FOLLOWING を加算した結果を返す。

  9. node1 が node2 に先行する場合、 DOCUMENT_POSITION_PRECEDING を返す。

    このアルゴリズムでは属性をこのように扱うため、 ノードの属性は、 そのノードの 子に 先行するものとして扱われる。 属性が同じツリーに参加していないにもかかわらず、 このように扱われる。

  10. DOCUMENT_POSITION_FOLLOWING を返す。

contains(other) メソッドの手順は、 other がthis の自身を含む子孫である場合は true、それ以外の場合は false を返すことである。 (other が null の場合も含む。)


namespace を使用して element の 名前空間 接頭辞を特定するには、次の手順を実行する。

  1. element の名前空間が namespace であり、その 名前空間接頭辞が null でない場合、その 名前空間接頭辞を返す。

  2. element が、名前空間接頭辞が "xmlns" であり、値が namespace である属性を持つ場合、element の最初の該当する 属性の ローカル名を返す。

  3. element の親要素が null でない場合、その要素に対して namespace を使用して名前空間接頭辞を特定する処理を実行した結果を返す。

  4. null を返す。

prefix を使用して node の 名前空間を特定するには、 node が実装するインターフェイスに応じて処理する。

Element
  1. prefix が "xml" の場合、XML 名前空間を返す。

  2. prefix が "xmlns" の場合、XMLNS 名前空間を返す。

  3. その名前空間が null でなく、その 名前空間接頭辞が prefix である場合、 名前空間を返す。

  4. その要素が、名前空間が XMLNS 名前空間であり、 名前空間接頭辞が "xmlns" であり、 ローカル名が prefix である 属性を持つ場合、 または prefix が null で、その要素が 名前空間が XMLNS 名前空間であり、 名前空間接頭辞が null で、ローカル名 が "xmlns" である属性を持つ場合、その 値が 空文字列でなければその値を返し、 それ以外の場合は null を返す。

  5. その親 要素が null の場合、null を返す。

  6. その親要素に対して、prefix を使用して 名前空間を特定する処理を実行した結果を返す。

Document
  1. その文書要素が null の場合、null を返す。

  2. その文書要素に対して、 prefix を使用して名前空間を特定する処理を実行した結果を返す。

DocumentType
DocumentFragment

null を返す。

Attr
  1. その要素が null の場合、null を返す。

  2. その要素に対して、 prefix を使用して名前空間を特定する処理を実行した結果を返す。

それ以外の場合
  1. その親 要素が null の場合、null を返す。

  2. その親要素に対して prefix を使用し、 名前空間を特定する処理を実行した結果を返す。

lookupPrefix(namespace) メソッドの手順は次のとおりである。

  1. namespace が null または空文字列の場合、null を返す。

  2. this が実装するインターフェイスに応じて処理する。

    Element

    this に対して namespace を使用して名前空間接頭辞を特定する処理の結果を返す。

    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. this に対して prefix を使用して 名前空間を特定する処理を実行した結果を返す。

isDefaultNamespace(namespace) メソッドの 手順 は次のとおりである。

  1. namespace が空文字列の場合、それを null に設定する。

  2. defaultNamespace を、 this に対して null を使用して名前空間を特定する処理を実行した結果とする。

  3. defaultNamespace が namespace と同一である場合は true、それ以外の場合は false を返す。


insertBefore(node, child) メソッドの手順は、this 内で child の前に node を事前挿入する処理の結果を返すことである。

appendChild(node) メソッドの手順は、 node をthis に 追加する処理の結果を返すことである。

replaceChild(node, child) メソッドの手順は、this 内で child を node で置換する処理の結果を返すことである。

removeChild(child) メソッドの手順は、 child をthis から 事前削除する処理の結果を返すことである。


ノード root に対する 修飾名 qualifiedName を持つ要素のリストは、 以下のアルゴリズムによって返される HTMLCollection である。

  1. qualifiedName が U+002A (*) の場合、 root をルートとし、 子孫の要素のみに一致するフィルターを持つ HTMLCollection を返す。

  2. それ以外の場合、root のノード文書がHTML 文書であれば、 root をルートとする HTMLCollection を返し、 そのフィルターは以下の 子孫の要素に一致する。

  3. それ以外の場合、 root をルートとし、 子孫の要素のうち、 修飾名が qualifiedName であるものに一致するフィルターを持つ HTMLCollection を返す。

同じ引数で呼び出され、root の ノード 文書の型が変更されていない限り、 以前の呼び出しで返されたものと同じ HTMLCollection オブジェクトを返してもよい。

ノード root に対する 名前空間 namespace とローカル名 localName を持つ要素のリストは、 以下のアルゴリズムによって返される HTMLCollection である。

  1. namespace が空文字列の場合、それを null に設定する。

  2. namespace と localName の両方が U+002A (*) の場合、 root をルートとし、子孫の 要素に一致するフィルターを持つ HTMLCollection を返す。

  3. namespace が U+002A (*) の場合、 root をルートとし、 子孫の要素のうち、 ローカル名が localName であるものに一致する HTMLCollection を返す。

  4. localName が U+002A (*) の場合、 root をルートとし、 子孫の要素のうち、 名前空間が namespace であるものに一致する HTMLCollection を返す。

  5. root をルートとし、 子孫の要素のうち、 名前空間が namespace であり、ローカル名が localName であるものに一致するフィルターを持つ HTMLCollection を返す。

同じ引数で呼び出された場合、以前の呼び出しで 返されたものと同じ HTMLCollection オブジェクトを返してもよい。

ノード root に対する クラス名 classNames を持つ要素のリストは、 以下のアルゴリズムによって返される HTMLCollection である。

  1. classes を、classNames に対して 順序付き集合パーサーを実行した結果とする。
  2. classes が空集合の場合、空の HTMLCollection を返す。
  3. root をルートとし、 子孫の要素のうち、すべての クラスが classes に含まれるものに一致するフィルターを持つ HTMLCollection を返す。

    root のノード 文書の モードが "quirks" の場合、クラスの比較は ASCII 大文字小文字を区別しない方法で行わなければならない。 それ以外の場合は、同一であるかどうかによって 比較しなければならない。

同じ引数で呼び出された場合、以前の呼び出しで返されたものと同じ HTMLCollection オブジェクトを返してもよい。

4.5. インターフェース Document

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

  [SameObject] readonly attribute DOMImplementation implementation;
  readonly attribute USVString URL;
  readonly attribute USVString documentURI;
  readonly attribute DOMString compatMode;
  readonly attribute DOMString characterSet;
  readonly attribute DOMString charset; // legacy alias of .characterSet
  readonly attribute DOMString inputEncoding; // legacy alias of .characterSet
  readonly attribute DOMString contentType;

  readonly attribute DocumentType? doctype;
  readonly attribute Element? documentElement;
  HTMLCollection getElementsByTagName(DOMString qualifiedName);
  HTMLCollection getElementsByTagNameNS(DOMString? namespace, DOMString localName);
  HTMLCollection getElementsByClassName(DOMString classNames);

  [CEReactions, NewObject] Element createElement(DOMString localName, optional (DOMString or ElementCreationOptions) options = {});
  [CEReactions, NewObject] Element createElementNS(DOMString? namespace, DOMString qualifiedName, optional (DOMString or ElementCreationOptions) options = {});
  [NewObject] DocumentFragment createDocumentFragment();
  [NewObject] Text createTextNode(DOMString data);
  [NewObject] CDATASection createCDATASection(DOMString data);
  [NewObject] Comment createComment(DOMString data);
  [NewObject] ProcessingInstruction createProcessingInstruction(DOMString target, DOMString data);

  [CEReactions, NewObject] Node importNode(Node node, optional (boolean or ImportNodeOptions) options = false);
  [CEReactions] Node adoptNode(Node node);

  [NewObject] Attr createAttribute(DOMString localName);
  [NewObject] Attr createAttributeNS(DOMString? namespace, DOMString qualifiedName);

  [NewObject] Event createEvent(DOMString interface); // legacy

  [NewObject] Range createRange();

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

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

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

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

Document ノードは単に 文書と呼ばれる。

文書のノード文書は、それ自体である。

各文書には、関連付けられた エンコーディング(エンコーディング)、 コンテンツ型(文字列)、 URL(URL)、 オリジン(オリジン)、 型("xml" または "html")、 モード("no-quirks"、"quirks"、または "limited-quirks")、 宣言的シャドウルートを許可するか(真偽値)、および カスタム要素レジストリー(null または CustomElementRegistry オブジェクト)がある。 [ENCODING] [URL] [HTML]

別途指定されない限り、文書のエンコーディングは utf-8 エンコーディングであり、コンテンツ型は "application/xml"、URLは "about:blank"、 オリジンは 不透明なオリジンであり、 型は "xml"、モードは "no-quirks"、宣言的シャドウルートを許可するかは false、そして カスタム要素レジストリーは null である。

文書は、その 型が "xml" である場合、XML 文書と呼ばれる。それ以外の場合は HTML 文書である。 文書が HTML 文書であるか XML 文書であるかによって、一部の API の動作が変わる。

各文書には、関連付けられた 基底 URL を取得するアルゴリズムがあり、 URLまたは null を返す。別途指定されない限り、null を返す。

各文書には、 基底 URL の上書き値(URLまたは null)があり、初期値は null である。

基底 URL の上書き値は、複製によって 文書を複製するときに設定される。HTML は、 基底 URL を取得するアルゴリズムを上書きし、 base 要素、および基底 URL のスキームが "about:" である 文書が継承する基底 URL を考慮する。 [HTML]

文書は、その no-quirks モードにあると呼ばれるのは、その モードが "no-quirks" の場合であり、 quirks モードにあると呼ばれるのは、その モード が "quirks" の場合であり、 limited-quirks モードにあると呼ばれるのは、その モードが "limited-quirks" の場合である。

モードが既定値から変更されるのは、 文書が HTML パーサーによって作成される場合に限られ、DOCTYPE 文字列の有無や値に基づいて変更されるほか、新しい 閲覧コンテキスト(初期値 "about:blank")によっても変更される。 [HTML]

no-quirks モードは、以前は「standards mode」と呼ばれ、 limited-quirks モードはかつて「almost standards mode」と呼ばれていた。詳細が標準によって定義されるようになったため、名称が変更された。(また、Ian Hickson が、元の名称は意味をなさないという理由でその採用を拒否したためでもある。)

文書の 親を取得するアルゴリズムは、 event を与えられると、event の type 属性値が "load" である場合、または 文書に 閲覧コンテキストがない場合は null を返す。それ以外の場合は、 文書の 関連するグローバルオブジェクトを返す。

文書を作成するには、インターフェイス interface を実装する文書を、 レルム realm を与えて、次の手順を実行する。

  1. アサート: interface は Document または Document を継承するインターフェイスである。

  2. ノードを新たに返す。このノードは 実装するインターフェイスが interface であり、 realm に属する。


document = new Document()
新しい文書を返す。
document . implementation
document に関連付けられた DOMImplementation オブジェクトを返す。
document . URL
document . documentURI
document のURLを返す。
document . compatMode
document のモードが "quirks" の場合は文字列 "BackCompat" を返し、それ以外の場合は "CSS1Compat" を返す。
document . characterSet
document の エンコーディングを返す。
document . contentType
document の コンテンツ型を返す。

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

createDocument()とは異なり、 このコンストラクターは XMLDocument オブジェクトではなく、文書 (Document オブジェクト)を返す。

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

URL および documentURI のゲッター手順は、 this の URLを シリアライズしたものを返すことである。

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

characterSet、 charset、および inputEncoding のゲッター手順は、 this の エンコーディングの 名前を返すことである。

contentType のゲッター手順は、 this の コンテンツ型を返すことである。


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

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

それ以外の場合、qualifiedName を 修飾名とする 子孫 要素すべてを含む HTMLCollection を返す。(要素が HTML 名前空間に属する HTML 文書内では、大文字と小文字を区別せずに照合する。)

collection = document . getElementsByTagNameNS(namespace, localName)

namespace と localName の両方が "*" の場合、すべての 子孫 要素を含む HTMLCollection を返す。

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

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

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

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

返されるのは HTMLCollection であり、これに含まれるのは 要素 のうち、メソッドの呼び出し先のオブジェクト (文書 または 要素)内にあり、すべてのクラスを持つもので、 そのクラスを指定するのは classNames である。classNames 引数は、空白区切りのリストとして解釈され、 その項目はクラスである。

この doctype 取得子の手順は、次のものを返すことである: 子のうち、this に属し、 文書型であるもの;それ以外の場合は null。

この documentElement 取得子の手順は、次を返すことである: this の 文書要素。

この getElementsByTagName(qualifiedName) メソッドの手順は、次を返すことである:要素のリストで、修飾名が qualifiedName であるもの。 対象は this である。

したがって、HTML 文書では、 document.getElementsByTagName("FOO") は次のものに一致する: <FOO> 要素のうち、次に属さないもの: HTML 名前空間、および <foo> 要素のうち、次に属するもの: HTML 名前空間。ただし、<FOO> 要素には一致しない、 それが次に属する場合:HTML 名前空間。

この getElementsByTagNameNS(namespace, localName) メソッドの手順は、次を返すことである:要素のリストで、名前空間が namespace であり、 ローカル 名が localName であるもの。対象は this である。

この getElementsByClassName(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 つの段落: p1 と p2 である。

次の呼び出し: getElementsByClassName("ccc bbb") は、しかし、1 つのノード、すなわち p3 のみを返す。次の呼び出し: document.getElementById("example").getElementsByClassName("bbb ccc ") も同じものを返す。

次の呼び出し: getElementsByClassName("aaa,bbb") はノードを返さない;上記の要素はいずれも、 aaa,bbb クラスに属さない。


element = document . createElement(localName [, options])

返されるのは 要素 であり、localName を ローカル名とする (document が HTML 文書である場合、localName は小文字化される)。この 要素の 名前空間は HTML 名前空間となる、次の場合: document が HTML 文書であるか、document の 内容型が "application/xhtml+xml" である場合;それ以外の場合は null。

指定された場合、options の customElementRegistry は利用できる、 次の設定に:CustomElementRegistry。

指定された場合、options の is は次のものを作成するために利用できる: カスタマイズされた組み込み要素。

localName が 有効な要素のローカル名でない場合、 "InvalidCharacterError" DOMException が投げられる。

options の customElementRegistry と options の is の両方が指定された場合、 "NotSupportedError" DOMException が投げられる。

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

返されるのは 要素 であり、その 名前空間は namespace である。その 名前空間接頭辞は、次の文字より前のすべてとなる: U+003A (:)、その文字があるのは qualifiedName 内であり、なければ null となる。その ローカル名は、次の文字より後のすべてとなる: qualifiedName 内の U+003A (:)、または qualifiedName となる。

指定された場合、options の customElementRegistry は利用できる、 次の設定に:CustomElementRegistry。

指定された場合、options の is は次のものを作成するために利用できる: カスタマイズされた組み込み要素。

qualifiedName が(接頭辞を持つこともある) 有効な要素のローカル名でない場合、"InvalidCharacterError" DOMException が 投げられる。

次の条件のいずれかが真である場合、"NamespaceError" DOMException が投げられる:

options の customElementRegistry と options の is の両方が指定された場合、 "NotSupportedError" DOMException が投げられる。

documentFragment = document . createDocumentFragment()
返されるのは DocumentFragment ノードである。
text = document . createTextNode(data)
返されるのは Text ノード であり、その データは data である。
text = document . createCDATASection(data)
返されるのは CDATASection ノードであり、その データは data である。
comment = document . createComment(data)
返されるのは Comment ノードであり、その データは data である。
processingInstruction = document . createProcessingInstruction(target, data)
返されるのは ProcessingInstruction ノードであり、その ターゲットは target であり、 データは data である。 target が次に一致しない場合: Name 生成規則、 "InvalidCharacterError" DOMException が投げられる。 data が "?>" を含む場合、 "InvalidCharacterError" DOMException が投げられる。

この 要素 インターフェイスは、任意の name と namespace に対して Element である。ただし、 別途規定されている場合を除く。

例えば、HTML 標準は、html と HTML 名前空間に対しては、HTMLHtmlElement インターフェイスが使用されると定義する。[HTML]

この createElement(localName, options) メソッドの手順は、次のとおりである:

  1. localName が 有効な要素のローカル名でない場合、 投げる例外は "InvalidCharacterError" DOMException とする。

  2. もし this が HTML 文書であるなら、localName を次のものに設定する: localName に ASCII 小文字化を施したもの。

  3. registry と is を、次の結果とする: 要素作成オプションの平坦化に、次を与えた結果: options と this。

  4. namespace を HTML 名前空間とする、次の場合:this が HTML 文書であるか、 this の 内容 型が "application/xhtml+xml" である場合;それ以外の場合は null とする。

  5. 次の結果を返す:要素の作成に、this、 localName、 namespace、null、is、true、および registry を与えた結果。

この 内部 createElementNS 手順に、 document、 namespace、qualifiedName、および options が与えられた場合、次のようにする:

  1. (namespace, prefix, localName) を、次の結果とする: 検証して抽出する対象を namespace と qualifiedName とし、"element" を与えた結果。

  2. registry と is を、次の結果とする: 要素作成オプションの平坦化に、次を与えた結果: options と this。

  3. 次の結果を返す:要素の作成に、document、 localName、namespace、prefix、is、true、および registry を与えた結果。

この createElementNS(namespace, qualifiedName, options) メソッドの手順は、次を実行した結果を返すことである: 内部 createElementNS 手順に、次を与える: this、 namespace、 qualifiedName、および options。

要素作成オプションを平坦化するには、文字列または ElementCreationOptions 辞書 options と 文書 document が与えられた下で:

  1. registry を、次の結果とする:カスタム要素レジストリーの検索 に document を与えた結果。

  2. is を null とする。

  3. options が辞書である場合:

    1. もし options["is"] が 存在するなら、 is をそれに設定する。

    2. もし options["customElementRegistry"] が 存在するなら:

      1. is が非 null である場合、次を 投げる:"NotSupportedError" DOMException。

      2. registry を次に設定する: options["customElementRegistry"]。

    3. registry が非 null であり、registry の スコープ付きかが false であり、かつ registry が document の カスタム要素レジストリーでない場合、次を 投げる: "NotSupportedError" DOMException。

  4. registry と is を返す。

createElement() と createElementNS() の options パラメーターには、ウェブ互換性のために文字列が許容される。

この createDocumentFragment() メソッドの手順は、 次の結果を返すことである:文書断片の作成に、this を与えた結果。

この createTextNode(data) メソッドの手順は、 次の結果を返すことである:テキストノードの作成に、this と data を与えた結果。

この createCDATASection(data) メソッドの手順は、 次のとおりである:

  1. もし this が HTML 文書であるなら、 次を 投げる: "NotSupportedError" DOMException。

  2. data が文字列 "]]>" を含む場合、次を 投げる: "InvalidCharacterError" DOMException。

  3. 次の結果を返す:CDATA セクションノードの作成に、this と data を与えた結果。

この createComment(data) メソッドの手順は、 次の結果を返すことである:コメントノードの作成に、this と data を与えた結果。

この createProcessingInstruction(target, data) メソッドの手順は、次の結果を返すことである:作成する 処理命令ノードに対して、次を与える: this、 target、および data。


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

node のコピーを返す。options が true であるか、options が 辞書であり、その selfOnly が false である場合、コピーには次のものも含まれる: node の 子孫。

options の customElementRegistry は、次を設定するために利用できる: CustomElementRegistry を持たない要素の当該レジストリー。

node が 文書または シャドウ根である場合、次を投げる: "NotSupportedError" DOMException。

node = document . adoptNode(node)

node を別の 文書から移動し、それを返す。

node が 文書である場合、次を投げる:"NotSupportedError" DOMException。 または、node が シャドウ根である場合、次を投げる: "HierarchyRequestError" DOMException。

この importNode(node, options) メソッドの手順は、次のとおりである:

  1. node が 文書または シャドウ根である場合、次を 投げる: "NotSupportedError" DOMException。

  2. subtree を false とする。

  3. registry を null とする。

  4. options が真偽値である場合、subtree を options に設定する。

  5. それ以外の場合:

    1. subtree を、次の否定に設定する: options["selfOnly"]。

    2. もし options["customElementRegistry"] が 存在するなら、registry をそれに設定する。

    3. registry の スコープ付きかが false であり、かつ registry が this の カスタム要素レジストリーでない場合、 次を投げる:"NotSupportedError" DOMException。

  6. registry が null である場合、registry を次の結果に設定する: カスタム要素レジストリーの検索 に、this を与えた結果。

  7. 次の結果を返す:ノードの複製に node を与え、 document を this に設定し、 subtree を subtree に設定し、 fallbackRegistry を次に設定した結果: registry。

仕様は、次を定義してもよい: 移入時の 手順。対象は、すべてまたは一部の ノードである。この アルゴリズムには node と oldDocument が渡される。その方法は、 移入アルゴリズムで示される。

移入する対象が ノード node であり、 移入先が 文書 document である場合:

  1. oldDocument を node の ノード文書とする。

  2. node の 親が非 null である場合、次を 除去する: node。

  3. document が oldDocument でない場合、各 inclusiveDescendant について、node の シャドウを含む広義 子孫の中で、 シャドウを含む木順序で:

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

    2. inclusiveDescendant が シャドウ根であり、かつ 次のいずれかが 真である場合:

      その場合、inclusiveDescendant の カスタム要素レジストリーを次に設定する: document の カスタム要素レジストリーの 実効グローバルカスタム 要素レジストリー。

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

      1. 設定する ノード文書は、各 属性のものであり、対象は inclusiveDescendant の 属性リスト内のもので、設定先は document とする。

      2. inclusiveDescendant の カスタム要素レジストリーが null であるか、 inclusiveDescendant の カスタム要素レジストリーの スコープ付きかが false である場合:

        1. registry を null とする。

        2. inclusiveDescendant の カスタム要素 レジストリーが 非 null であるか、inclusiveDescendant の 親が null であるか、 inclusiveDescendant の 親が 排他的 DocumentFragment ノードである場合、registry を設定する、 次のものに: document の カスタム要素 レジストリー。

        3. それ以外の場合、registry を次の結果に設定する: カスタム 要素レジストリーの検索に、inclusiveDescendant の 親を与えた結果。

        4. inclusiveDescendant の カスタム要素 レジストリーを次に設定する: registry の 実効 グローバルカスタム要素レジストリー。

      3. inclusiveDescendant が カスタムである場合、 カスタム要素 コールバック反応をキューに入れる。引数は inclusiveDescendant、コールバック 名 "adoptedCallback"、および « oldDocument, document » とする。

    4. 次の 移入時の手順を実行する。引数は inclusiveDescendant と oldDocument とする。

この adoptNode(node) メソッドの手順は、次のとおりである:

  1. node が 文書である場合、次を 投げる: "NotSupportedError" DOMException。

  2. node が シャドウ根である場合、次を 投げる: "HierarchyRequestError" DOMException。

  3. 移入する: node を this へ。

  4. node を返す。


null または CustomElementRegistry オブジェクト registry が グローバル カスタム要素レジストリーであるのは、registry が非 null であり、かつ registry の スコープ 付きかが false である場合である。

null または CustomElementRegistry オブジェクト registry の 実効グローバルカスタム要素レジストリーは、次のとおりである:

  1. registry が グローバルカスタム要素レジストリーである場合、 次を返す: registry。

  2. null を返す。


この createAttribute(localName) メソッドの 手順は、次のとおりである:

  1. localName が 有効な属性のローカル名でない場合、 次を投げる:"InvalidCharacterError" DOMException。

  2. もし this が HTML 文書であるなら、設定する: localName を、 localName に ASCII 小文字化を施したものに。
  3. 次の結果を返す:属性の作成に、this と localName を与えた結果。

この createAttributeNS(namespace, qualifiedName) メソッドの手順は、次のとおりである:

  1. (namespace, prefix, localName) を、次の結果とする: 検証して 抽出する対象を namespace と qualifiedName とし、"attribute" を与えた結果。

  2. 次の結果を返す:属性の作成に、this、localName、 namespace、および prefix を与えた結果。


この createEvent(interface) メソッドの手順は、 次のとおりである:

  1. constructor を null とする。

  2. interface が ASCII 大文字小文字を区別しない一致を、いずれかの文字列との間で示す場合、 その文字列があるのは 次の表の第 1 列であり、constructor を次のインターフェイスに設定する: 一致した文字列と同じ行の第 2 列にあるもの。

    文字列 インターフェイス 注記
    "beforeunloadevent" BeforeUnloadEvent [HTML]
    "compositionevent" CompositionEvent [UIEVENTS]
    "customevent" CustomEvent
    "devicemotionevent" DeviceMotionEvent [DEVICE-ORIENTATION]
    "deviceorientationevent" DeviceOrientationEvent
    "dragevent" DragEvent [HTML]
    "event" Event
    "events"
    "focusevent" FocusEvent [UIEVENTS]
    "hashchangeevent" HashChangeEvent [HTML]
    "htmlevents" Event
    "keyboardevent" KeyboardEvent [UIEVENTS]
    "messageevent" MessageEvent [HTML]
    "mouseevent" MouseEvent [UIEVENTS]
    "mouseevents"
    "storageevent" StorageEvent [HTML]
    "svgevents" Event
    "textevent" TextEvent [UIEVENTS]
    "touchevent" TouchEvent [TOUCH-EVENTS]
    "uievent" UIEvent [UIEVENTS]
    "uievents"
  3. constructor が null である場合、次を 投げる:"NotSupportedError" DOMException。

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

    通常、ユーザーエージェントはタッチイベントのサポートを一部の 構成で無効にする。その 場合、この条項は次のインターフェイスに対して適用される:TouchEvent。

  5. event を、次の結果とする:イベントの作成に constructor を与えた結果。

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

  7. event の timeStamp 属性を、次を呼び出した結果に初期化する: 現在の高分解能時刻に、this の 関連するグローバルオブジェクトを与える。

  8. event の isTrusted 属性を false に初期化する。

  9. event の 初期化済みフラグを解除する。

  10. event を返す。

イベント コンストラクターを代わりに使用するべきである。


この createRange() メソッドの手順は、新しい 生きた範囲を返すことである。(this, 0) を その 始端および 終端とする。

この Range() コンストラクターを代わりに使用できる。


この createNodeIterator(root, whatToShow, filter) メソッドの手順は、次のとおりである:

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

  2. iterator の 根を root に設定する。

  3. iterator の 参照を (root, true) に設定する。

  4. iterator の whatToShow を whatToShow に設定する。

  5. iterator の フィルターを filter に設定する。

  6. iterator を返す。

この createTreeWalker(root, whatToShow, filter) メソッドの手順は、次のとおりである:

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

  2. walker の 根と walker の 現在ノードを次に設定する: root。

  3. walker の whatToShow を whatToShow に設定する。

  4. walker の フィルターを filter に設定する。

  5. walker を返す。

4.5.1. インターフェース DOMImplementation

ユーザーエージェントは、DOMImplementation オブジェクトを作成しなければならない、文書が 作成されるたびに。そして、それをその 文書に関連付けなければならない。

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

  boolean hasFeature(); // 歴史的なもの;常に true を返す
};
doctype = document . implementation . createDocumentType(name, publicId, systemId)
返されるのは 文書型であり、 与えられた name、publicId、および systemId を持つ。

name が 有効な文書型名でない場合、"InvalidCharacterError" DOMException が投げられる。

doc = document . implementation . createDocument(namespace, qualifiedName [, doctype = null])
返されるのは XMLDocumentであり、 次のものを持つ: 文書要素。 その ローカル名は qualifiedName であり、その 名前空間は namespace である(ただし、qualifiedName が 空文字列である場合を除く)。また、doctype が与えられた場合、それを自身の 文書型とする。

このメソッドは、次と同じ例外を投げる:createElementNS() メソッドが、 namespace と qualifiedName を伴って呼び出された場合。

doc = document . implementation . createHTMLDocument([title])
返されるのは 文書であり、 基本的な 木がすでに構築されており、 次のものを含む: title 要素。ただし、title 引数が省略された場合を除く。

この createDocumentType(name, publicId, systemId) メソッドの手順は、次のとおりである:

  1. name が 有効な文書型名でない場合、次を投げる:"InvalidCharacterError" DOMException。

  2. 次の結果を返す:文書型の作成に、関連付けられた 文書(関連付け元は this)、 name、publicId、および systemId を与えた結果。

この createDocument(namespace, qualifiedName, doctype) メソッドの手順は、次のとおりである:

  1. document を、次の結果とする:文書の作成。その文書が実装するのは XMLDocumentであり、 引数は this の 関連する realmとする。

  2. element を null とする。

  3. qualifiedName が空文字列でない場合、element を次に設定する: 内部 createElementNS 手順を実行した結果。 引数は document、namespace、qualifiedName、および空の辞書とする。

  4. doctype が非 null である場合、追加する:doctype を document に。

  5. element が非 null である場合、追加する:element を document に。

  6. document の オリジンは this に関連付けられた 文書の オリジンである。

  7. document の 内容型は、次によって決定される: namespace:

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

この createHTMLDocument(title) メソッドの手順は、次のとおりである:

  1. doc を、次の結果とする:文書の作成。その文書が実装するのは Documentであり、 引数は this の 関連する realmとする。

  2. doc の 種別を "html" に設定し、 内容型を "text/html" に設定する。

  3. doctype を、次の結果とする:文書型の作成に、doc と "html" を与えた結果。

  4. 追加する: doctype を doc に。

  5. 追加する対象は、 次の結果である:要素の作成に、doc、 "html"、および HTML 名前空間を与えた結果。追加先は doc とする。

  6. 追加する対象は、 次の結果である:要素の作成に、doc、 "head"、および HTML 名前空間を与えた結果。追加先は html 要素で、前に作成されたものとする。

  7. title が与えられた場合:

    1. 追加する対象は、次の結果である:作成する 要素に対して、doc、 "title"、および HTML 名前空間を与えた結果。追加先は head 要素で、前に作成されたものとする。

    2. text を、次の結果とする:テキストノードの作成に、doc と title(空文字列であってもよい)を与えた結果。

    3. 追加する:text を次に: title 要素で、前に作成されたもの。

  8. 追加する対象は、 次の結果である:要素の作成に、doc、 "body"、および HTML 名前空間を与えた結果。追加先は html 要素で、前に作成されたものとする。

  9. doc の オリジンは this に関連付けられた 文書の オリジンである。

  10. doc を返す。

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

hasFeature() は元々、ユーザーエージェントについて報告していた、 指定された DOM 機能のサポートを主張するかどうかを。しかし、経験から、それは次ほど 信頼性が高くも、細かな判定ができるものでもないとわかった:必要なオブジェクト、属性、または メソッドが存在するか単純に調べること。そのため、もはや使用すべきではないが、存続している(単に true を返す)。古いページが動作しなくなることを防ぐためである。

4.6. インターフェース DocumentType

[Exposed=Window]
interface DocumentType : Node {
  readonly attribute DOMString name;
  readonly attribute DOMString publicId;
  readonly attribute DOMString systemId;
};

DocumentType ノードは、単に次のように呼ばれる: 文書型。

文書型は、次のものを持つ: 関連付けられた 名前(文字列)、 公開 ID(文字列)、および システム ID(文字列)。

文書型を作成するには、 引数として 文書 document、文字列 name、および省略可能な文字列 publicId(既定値は空文字列)と文字列 systemId(既定値は空文字列)が与えられた下で:

  1. doctype を、次の結果とする:ノードの作成。そのノードが実装するのは DocumentTypeであり、 引数は document とする。

  2. doctype の 名前を name に設定し、公開 IDを publicId に設定し、システム IDを systemId に設定する。

  3. doctype を返す。

この name 取得子の手順は、次を返すことである: this の 名前。

この publicId 取得子の手順は、次を返すことである: this の 公開 ID。

この systemId 取得子の手順は、次を返すことである: this の システム ID。

4.7. インターフェイス DocumentFragment

[Exposed=Window]
interface DocumentFragment : Node {
  constructor();
};
tree = new DocumentFragment()
新しい DocumentFragment ノードを返す。

排他的な DocumentFragment ノードは、DocumentFragment ノードであり、ShadowRoot ノードではない。

DocumentFragment ノードには、関連付けられた ホスト(null または別のノードツリー内の 要素)がある。特に明記されていない限り、 null である。

オブジェクト A が ホストを含む自身を含む祖先 としてオブジェクト B に対して成立するのは、A が B の自身を含む 祖先である場合、 または B のルートに null でないホストがあり、 A がホストを含む自身を含む祖先 として B のルートの ホストに対して成立する場合である。

DocumentFragment ノードのホスト という概念は、HTML の template 要素やシャドウルートに役立ち、 事前挿入 および置換 アルゴリズムに影響を与える。

作成する: 文書断片。引数として 文書 document が与えられた下で:次の結果を返す:ノードの作成。そのノードが実装するのは DocumentFragmentであり、 引数は document とする。

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

4.8. インターフェイス ShadowRoot

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

  attribute EventHandler onslotchange;
};

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

ShadowRoot ノード は、単に シャドウルート と呼ばれる。

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

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

シャドウルート には、 関連付けられた フォーカスを委譲する (真偽値)がある。初期状態では false に設定される。

シャドウルート には、 関連付けられた 要素内部から利用可能 (真偽値)がある。これは 初期状態では false に設定される。

シャドウルート には、 関連付けられた 宣言的 (真偽値)がある。初期状態では false に設定される。

シャドウルート には、 関連付けられた 直列化可能 (真偽値)がある。 初期状態では false に設定される。

シャドウルート には、 関連付けられた スロット割り当て ("manual" または "named")がある。

シャドウルート には、 関連付けられた 複製可能 (真偽値)がある。 初期状態では false に設定される。

シャドウルート には、 関連付けられた カスタム要素レジストリ (null または CustomElementRegistry オブジェクト)がある。初期状態では null である。

シャドウルート には、 関連付けられた カスタム要素レジストリを null に保つ (真偽値)がある。 初期状態では false である。

これは宣言的シャドウルートと組み合わせた場合にのみ true になり得る。また、 シャドウルート の カスタム 要素レジストリ が null である間にのみ意味を持つ。


シャドウルート の 親を取得する アルゴリズムは、 event が与えられたとき、 event の 合成フラグ が設定されておらず、かつ シャドウルート が event の 経路 の最初の イベント経路項目 の 呼び出しターゲット の 根 であれば null を返し、それ以外の場合は シャドウルート の ホスト を返す。


この mode 取得子の手順は、次を返すことである: this の モード。

この delegatesFocus 取得子の手順は、次を返すことである: this の フォーカスを委譲するか。

この serializable 取得子の手順は、次を返すことである: this の 直列化可能か。

この slotAssignment 取得子の手順は、次を返すことである: this の スロット 割り当て。

この clonable 取得子の手順は、次を返すことである: this の 複製可能か。

この host 取得子の手順は、次を返すことである: this の ホスト。


onslotchange 属性は、 onslotchange イベントハンドラー のための イベントハンドラー IDL 属性 であり、その イベントハンドラーイベント型 は slotchange である。


シャドウを含む木順 とは、 ノードツリー の シャドウを含む先行順・深さ優先 走査 による順序である。 シャドウを含む先行順・深さ優先 走査 とは、ノードツリー tree に対する先行順・深さ優先走査であり、tree 内で各 シャドウホスト に 遭遇した際、その直後に、 シャドウを含む先行順・深さ優先 走査 を、その 要素 の シャドウルート の ノードツリー に対して行う。

オブジェクトの シャドウを含む根 は、その 根 が シャドウルート であれば、 その 根 の ホスト の シャドウを含む 根 であり、それ以外の場合は そのオブジェクトの 根 である。

オブジェクト A がオブジェクト B の シャドウを含む子孫 であるのは、 A が B の 子孫 であるか、または A の 根 が シャドウルート であり、 A の 根 の ホスト が B の シャドウを含む包括的子孫 である 場合である。

シャドウを含む包括的子孫 とは、オブジェクト自身、またはその シャドウを含む子孫 のいずれかである。

オブジェクト A がオブジェクト B の シャドウを含む祖先 であるのは、 B が A の シャドウを含む子孫 である場合、かつその場合に限る。

シャドウを含む包括的祖先 とは、オブジェクト自身、またはその シャドウを含む祖先 のいずれかである。

ノード A が ノード B から 閉じたシャドウによって隠されている のは、 以下のすべての条件が true である場合である。

オブジェクト A をオブジェクト B に対して 再ターゲット化する には、 オブジェクトが返されるまで次の手順を繰り返す。

  1. 次のいずれかが true である場合、

    その場合、A を返す。

  2. A を A の 根 の ホスト に設定する。

再ターゲット化 アルゴリズムは、イベント配送 だけでなく、 Fullscreen などの他の仕様でも使用される。[FULLSCREEN]

4.9. インターフェイス Element

[Exposed=Window]
interface Element : Node {
  readonly attribute DOMString? namespaceURI;
  readonly attribute DOMString? prefix;
  readonly attribute DOMString localName;
  readonly attribute DOMString tagName;

  [CEReactions] attribute DOMString id;
  [CEReactions] attribute DOMString className;
  [SameObject, PutForwards=value] readonly attribute DOMTokenList classList;
  [CEReactions, Unscopable] attribute DOMString slot;

  boolean hasAttributes();
  [SameObject] readonly attribute NamedNodeMap attributes;
  sequence<DOMString> getAttributeNames();
  DOMString? getAttribute(DOMString qualifiedName);
  DOMString? getAttributeNS(DOMString? namespace, DOMString localName);
  [CEReactions] undefined setAttribute(DOMString qualifiedName, (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;
  boolean serializable = false;
  SlotAssignmentMode slotAssignment = "named";
  boolean clonable = 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 疑似クラスの動作を決定するために使用される。要素がカスタムかどうかは、 変更アルゴリズムの動作を決定するために使用される。 "failed" および "precustomized" 状態は、 カスタム要素コンストラクターの最初の実行が正常に完了しなかった場合に、 アップグレードによって再び実行されないようにするために使用される。

次のコードは、これら 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() を省略している
    }
  })
</script>

<!-- "undefined"(未定義、非カスタム) -->
<sw-han></sw-han>
<p is="sw-luke"></p>
<p is="asdf"></p>

<!-- "failed"(未定義、非カスタム) -->
<sw-kylo></sw-kylo>

<!-- "uncustomized"(定義済み、非カスタム) -->
<p></p>
<asdf></asdf>

<!-- "custom"(定義済み、カスタム) -->
<sw-rey></sw-rey>
<p is="sw-finn"></p>

要素には、 関連付けられた シャドウルート(null または シャドウルート)もある。 特に明記されていない限り null である。要素は、その シャドウルートが null でない場合、 シャドウホストである。

要素の 修飾名は、その 名前空間接頭辞が null の場合は ローカル 名であり、それ以外の場合は 名前空間接頭辞の後に ":"、 さらに ローカル 名を続けたものである。

要素のHTML 形式で大文字化された修飾名は、 次の手順の戻り値である:

  1. qualifiedName を this の 修飾名とする。

  2. もし this が HTML 名前空間に属し、その ノード文書が HTML 文書であるなら、 qualifiedName を ASCII 大文字化して返す。

  3. qualifiedName を返す。

ユーザーエージェントは、修飾名と HTML 形式で大文字化された修飾名を 内部スロットに格納することで最適化できる。

要素を 作成するには、文書 document、文字列 localName、文字列または null の namespace、および 省略可能な文字列または null の prefix(既定値は null)、文字列または null の is(既定値は null)、真偽値 synchronousCustomElements(既定値は false)、および "default"、 null、または CustomElementRegistry オブジェクト registry(既定値は "default")を指定して、次を実行する:

  1. result を null とする。

  2. registry が "default" の場合、registry を、 document を指定してカスタム要素レジストリを検索した 結果に設定する。

  3. definition を、 registry、namespace、localName、および is を 指定してカスタム要素定義を検索した結果とする。

  4. definition が null でなく、その 名前が ローカル名と等しくない場合(すなわち、 definition が カスタマイズされた組み込み要素を表す場合):

    1. interface を、localName と HTML 名前空間に対する 要素インターフェイスとする。

    2. result を、 document、interface、localName、 HTML 名前空間、 prefix、"undefined"、is、および registry を指定して 内部的に要素を作成した結果に設定する。

    3. synchronousCustomElements が true の場合、例外を捕捉しながら 次の手順を実行する:

      1. definition を使用して result をアップグレードする。

      この手順で例外 exception が投げられた場合:

      1. exception を、 definition のコンストラクターに 対応する JavaScript オブジェクトの 関連付けられたレルムのグローバルオブジェクトに対して 報告する。

      2. result のカスタム要素の状態を "failed" に設定する。

    4. それ以外の場合、result と definition を指定して カスタム要素の アップグレード反応をキューに入れる。

  5. それ以外の場合、definition が null でなければ:

    1. synchronousCustomElements が true の場合:

      1. C を definition の コンストラクターとする。

      2. previousRegistry を周囲のエージェントの アクティブなカスタム要素 コンストラクターマップ[C] とし、 既定値は null とする。

      3. 周囲のエージェントの アクティブなカスタム要素 コンストラクターマップ[C] を registry に設定する。

      4. 例外を捕捉しながら次の手順を実行する:

        1. result を、引数なしで C を構築した 結果に設定する。

        2. 表明:次のいずれかが真である:

          customElements.define("x-example", class extends HTMLElement {
            constructor() {
              // 非準拠:super() を呼び出す代わりに既存の要素を返す。
              return document.createElement("p");
            }
          });
          
          document.createElement("x-example");
          

          ここで result は p 要素であり、その カスタム 要素の状態は "uncustomized" であり、 カスタム 要素定義は null である。

        3. 表明:result の名前空間は HTML 名前空間である。

          IDL により、result は HTMLElement オブジェクトであることが保証される。これらはすべて 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. result のis 値を null に設定する。

        11. result のカスタム要素 レジストリを registry に設定する。

        これらの手順のいずれかで例外 exception が投げられた場合:

        1. exception を、 definition のコンストラクターに対応する JavaScript オブジェクトの関連付けられたレルムのグローバルオブジェクトに対して 報告する。

        2. result を、 document、HTMLUnknownElement、 localName、HTML 名前空間、 prefix、"failed"、null、および registry を指定して 内部的に要素を 作成した結果に設定する。

      5. previousRegistry が null の場合、 周囲のエージェントの アクティブなカスタム要素 コンストラクターマップ[C] を 削除する。

      6. それ以外の場合、周囲のエージェントの アクティブなカスタム要素 コンストラクターマップ[C] を previousRegistry に設定する。

    2. それ以外の場合:

      1. result を、 document、HTMLElement、 localName、HTML 名前空間、 prefix、"undefined"、null、および registry を指定して 内部的に要素を作成した結果に設定する。

      2. result と definition を指定して カスタム要素の アップグレード反応をキューに入れる。

  6. それ以外の場合:

    1. interface を、 localName と namespace に対する 要素インターフェイスとする。

    2. result を、 document、interface、localName、namespace、 prefix、"uncustomized"、is、および registry を指定して 内部的に要素を作成した結果に設定する。

    3. namespace がHTML 名前空間であり、localName が 妥当なカスタム要素名であるか、 is が null でない場合、result の カスタム要素の状態を "undefined" に設定する。

  7. result を返す。

内部的に 要素を作成するには、文書 document、 インターフェイス interface、文字列 localName、文字列または null の namespace、 文字列または null の prefix、文字列 state、文字列または null の is、および null または CustomElementRegistry オブジェクト registry を指定して、次を実行する:

  1. element を、document を指定して interface を実装するノードを作成した結果とする。

  2. element の名前空間を namespace に、 名前空間接頭辞を prefix に、 ローカル名を localName に、カスタム要素レジストリを registry に、 カスタム要素の状態を state に、 カスタム要素定義を null に、is 値を is に設定する。

  3. 表明:element の属性リストは 空である。

  4. element を返す。

要素には、 属性リストもあり、これは NamedNodeMap を通じて公開されるリストである。 要素の作成時に明示的に指定されない限り、 その属性 リストは空である。

要素が 属性 A を持つのは、その 属性リストに A が含まれる場合である。

この仕様および他の仕様は、 要素に対する 属性変更手順を定義できる。このアルゴリズムには element、localName、 oldValue、value、および namespace が渡される。

属性 attribute の 属性の 変更を処理するには、element、oldValue、および newValue を指定して 次の手順を実行する:

  1. element に対して "attributes" 型の変更レコードを キューに入れる。その際、 attribute のローカル名、attribute の 名前空間、oldValue、« »、« »、null、 および null を指定する。

  2. element がカスタムである場合、 element、コールバック名 "attributeChangedCallback"、および « attribute のローカル名、 oldValue、newValue、attribute の名前空間 » を指定して カスタム要素のコールバック 反応をキューに入れる。

  3. element、attribute の ローカル名、oldValue、 newValue、および attribute の 名前空間を指定して、 属性変更手順を実行する。

属性 attribute を value に変更するには、次を実行する:

  1. oldValue を attribute の値とする。

  2. attribute の値を value に設定する。

  3. attribute の要素、oldValue、および value を指定して、attribute の 属性の変更を処理する。

属性 attribute を要素 element に追加するには、次を実行する:

  1. attribute を element の 属性リストに追加する。

  2. attribute の要素を element に設定する。

  3. attribute のノード文書を element の ノード 文書に設定する。

  4. element、null、および attribute の値を指定して、 属性の変更を処理する。

属性 attribute を削除するには、次を実行する:

  1. element を attribute の要素とする。

  2. element の属性 リストから attribute を削除する。
  3. attribute の要素を null に設定する。

  4. element、 attribute の値、および null を指定して 属性の変更を処理する。

属性 oldAttribute を属性 newAttribute で置換するには、次を実行する:

  1. element を oldAttribute の要素とする。

  2. element の属性リスト内の oldAttribute を newAttribute で置換する。

  3. newAttribute の要素を element に設定する。

  4. newAttribute のノード文書を element の ノード 文書に設定する。

  5. oldAttribute の要素を null に設定する。

  6. element、 oldAttribute の値、および newAttribute の 値を指定して、oldAttribute の 属性の変更を処理する。


文字列 qualifiedName と要素 element を指定して 名前で属性を取得するには、次を実行する:

  1. element がHTML 名前空間に属し、そのノード文書が HTML 文書である場合、qualifiedName を ASCII 小文字化した qualifiedName に設定する。

  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 を、 attr のローカル名、attr の名前空間、element、および attr の値を指定して Trusted Types に準拠した属性値を 取得する処理を呼び出した結果とする。[TRUSTED-TYPES]

  2. attr の要素が null でも element でもない場合、 "InUseAttributeError" DOMException を投げる。

  3. oldAttr を、 attr の名前空間、attr のローカル名、および element を指定して属性を取得した結果とする。

  4. oldAttr が attr である場合、attr を返す。

  5. attr の値を verifiedValue に設定する。

  6. oldAttr が null でない場合、oldAttr を attr で 置換する。

  7. それ以外の場合、attr を element に 追加する。

  8. oldAttr を返す。

要素 element、文字列 localName、文字列 value、 省略可能な null または文字列 prefix(既定値は null)、および省略可能な null または文字列 namespace(既定値は null)を指定して属性値を 設定するには、次を実行する:

  1. attribute を、 namespace、localName、および element を指定して 属性を取得した結果とする。
  2. attribute が null の場合、 element のノード文書、 localName、namespace、prefix、および value を指定して 属性を 作成した結果を 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 の概念とし、各要素に対して id 属性によって与えられる 1 つだけを許可する。

要素の IDを更新するには、次の 属性変更手順を使用する:

  1. localName が id、namespace が null であり、 value が null または空文字列の場合、element の IDを解除する。

  2. それ以外の場合、localName が id、namespace が null なら、 element のIDを value に設定する。

この仕様は、任意の要素における class、 id、および slot 属性の要件を定義するが、 これらの使用が適合するかどうかについては規定しない。


ノードの親が Element 型である場合、 その親を 親要素と呼ぶ。ノードの 親が 別の型である場合、その 親要素は null である。


namespace = element . namespaceURI
名前空間を返す。
prefix = element . prefix
名前空間接頭辞を返す。
localName = element . localName
ローカル名を返す。
qualifiedName = element . tagName
HTML 形式で大文字化された修飾名を返す。

この namespaceURI 取得子の手順は、次を返すことである: this の 名前空間。

この prefix 取得子の手順は、次を返すことである: this の 名前空間接頭辞。

この localName 取得子の手順は、次を返すことである: this の ローカル 名。

この tagName 取得子の手順は、次を返すことである: this の HTML 大文字化修飾名。


element . id [ = value ]

element の id 内容属性の値を返す。設定することで、 その値を変更できる。

element . className [ = value ]

element の class 内容属性の値を返す。設定することで、 その値を変更できる。

element . classList

element の class 内容属性を、次のものとして操作できる: 空白区切りのトークンの集合。操作には DOMTokenList オブジェクトを使用する。

element . slot [ = value ]

element の slot 内容属性の値を返す。設定することで、 その値を変更できる。

IDL 属性が反映すると定義されている文字列が name である場合、次の取得子および設定子の手順を持たなければならない:

取得子の手順

次を実行した結果を返す:属性値の取得に、this と name を与える。

設定子の手順

属性値を設定する。対象は this とし、name と与えられた値を使用する。

この id 属性は、次を 反映しなければならない: "id"。

この className 属性は、次を 反映しなければならない: "class"。

この classList 取得子の手順は、次のものを返すことである: DOMTokenList オブジェクトであり、関連付けられた 要素は this であり、関連付けられた 属性の ローカル名は class である。この トークン集合は、この 特定の DOMTokenList オブジェクトのものであり、要素の クラスとも呼ばれる。

この slot 属性は、次を 反映しなければならない: "slot"。

id、class、および slot は、事実上、 スーパーグローバル属性である。どの要素にも現れることができ、その要素の 名前空間に依存しないためである。


element . hasAttributes()

element が属性を持つ場合は true を返し、それ以外の場合は false を返す。

element . getAttributeNames()

返されるのは 修飾名であり、対象は element のすべての 属性である。 重複を含むことがある。

element . getAttribute(qualifiedName)

返されるのは element の最初の 属性であり、その 修飾名は qualifiedName である。それ以外の場合、そのような 属性がなければ null を返す。

element . getAttributeNS(namespace, localName)

返されるのは element の 属性であり、その 名前空間は namespace であり、ローカル名は localName である。null を返すのは、 それ以外の場合で、 そのような 属性が存在しないときである。

element . setAttribute(qualifiedName, value)

設定する 値は、element の最初の 属性のものであり、 その 修飾名は qualifiedName であり、設定先の値は value とする。

element . setAttributeNS(namespace, localName, value)

設定する 値は、element の 属性のものであり、その 名前空間は namespace であり、ローカル名は localName である。値を value に設定する。

element . removeAttribute(qualifiedName)

除去するのは element の最初の 属性であり、その 修飾名は qualifiedName である。

element . removeAttributeNS(namespace, localName)

除去するのは element の 属性であり、その 名前空間は namespace であり、ローカル名は localName である。

element . toggleAttribute(qualifiedName [, force])

force が与えられない場合、qualifiedName を「切り替える」。それが 存在する場合は除去し、存在しない場合は追加する。force が true である場合、追加する: qualifiedName を。force が false である場合、qualifiedName を除去する。

qualifiedName が現在存在する場合は true を返し、それ以外の場合は false を返す。

element . hasAttribute(qualifiedName)

true を返すのは、element が 属性を持ち、その 修飾名が qualifiedName である場合である; それ以外の場合は false を返す。

element . hasAttributeNS(namespace, localName)

true を返すのは、element が 属性を持ち、その 名前空間 が namespace であり、ローカル名が localName である場合である。

この hasAttributes() メソッドの手順は、false を返すことである、 もし this の 属性リストが 空であるなら; それ以外の場合は true を返す。

この attributes 取得子の手順は、次を返すことである: 関連付けられた NamedNodeMap。

この getAttributeNames() メソッドの手順は、返すことである: 次の 修飾名。対象の 属性は、this の 属性リスト内のもので、その順序とする;それ以外の場合は新しい リストを返す。

これらが一意であることは保証されない。

この getAttribute(qualifiedName) メソッドの 手順は、次のとおりである:

  1. attr を、次の結果とする: 属性の取得に、 qualifiedName と this を与えた結果。

  2. attr が null である場合、null を返す。

  3. attr の 値を返す。

この getAttributeNS(namespace, localName) メソッドの手順は、次のとおりである:

  1. attr を、次の結果とする: 属性の取得に、 namespace、localName、および this を与えた結果。

  2. attr が null である場合、null を返す。

  3. attr の 値を返す。

この setAttribute(qualifiedName, value) メソッドの手順は、次のとおりである:

  1. qualifiedName が 有効な属性のローカル名でない場合、次を 投げる: "InvalidCharacterError" DOMException。

    パラメーターの名前にかかわらず、 qualifiedName が 修飾名として使用されるのは、属性がすでに その修飾名で存在する場合のみである。それ以外の場合、それは ローカル 名として使用される、対象は新しい 属性である。検証が必要なのは、後者の場合のみである。

  2. もし this が HTML 名前空間に属し、その ノード文書が HTML 文書であるなら、 qualifiedName を、qualifiedName に ASCII 小文字化を施したものに設定する。

  3. verifiedValue を、次を呼び出した結果とする: 信頼型に準拠する 属性値の取得。引数は qualifiedName、null、this、 および value とする。[TRUSTED-TYPES]

  4. attribute を、最初の 属性とする。対象は this の 属性リスト内にあり、その 修飾名が qualifiedName であるものとし、 それ以外の場合は null とする。

  5. attribute が非 null である場合、変更する: attribute を verifiedValue に変更し、戻る。

  6. attribute を、次の結果に設定する:属性の作成に、this の ノード 文書、qualifiedName、null、null、および verifiedValue を与えた結果。

  7. 追加する:attribute を this に。

この setAttributeNS(namespace, qualifiedName, value) メソッドの手順は、次のとおりである:

  1. (namespace, prefix, localName) を、次の結果とする: 検証して抽出する対象を namespace と qualifiedName とし、"attribute" を与えた結果。

  2. verifiedValue を、次を呼び出した結果とする: 信頼型に準拠する 属性値の取得。引数は localName、namespace、 this、および value とする。[TRUSTED-TYPES]

  3. 属性値を設定する。対象は this とし、使用するのは localName、 verifiedValue、prefix、および namespace とする。

この removeAttribute(qualifiedName) メソッドの手順は、属性を除去することである。引数は qualifiedName と this とし、その後 undefined を返す。

この removeAttributeNS(namespace, localName) メソッドの手順は、属性を除去することである。 引数は namespace、localName、および this とし、その後、返すのは undefined とする。

この hasAttribute(qualifiedName) メソッドの 手順は、次のとおりである:

  1. もし this が HTML 名前空間に属し、その ノード文書が HTML 文書であるなら、 qualifiedName を、qualifiedName に ASCII 小文字化を施したものに設定する。

  2. true を返すのは、this が 持つ 属性の 修飾名が qualifiedName である場合であり、それ以外の場合は false を返す。

この toggleAttribute(qualifiedName, force) メソッドの手順は、次のとおりである:

  1. qualifiedName が 有効な属性のローカル名でない場合、次を 投げる: "InvalidCharacterError" DOMException。

    上記の説明を参照。 そこでは、次の理由を説明している: 修飾名としてではなく、ローカル名として検証する理由。

  2. もし this が HTML 名前空間に属し、その ノード文書が HTML 文書であるなら、 qualifiedName を、qualifiedName に ASCII 小文字化を施したものに設定する。

  3. attribute を、最初の 属性とする。対象は this の 属性リスト内にあり、その 修飾名が qualifiedName であるものとし、 それ以外の場合は null とする。

  4. attribute が null である場合:

    1. force が与えられないか true である場合、次を 追加する: 次の結果を:属性の作成に、this の ノード文書 と qualifiedName を与えた結果を、this に。その後、 true を返す。

    2. false を返す。

  5. force が与えられないか false である場合、 属性を除去する。引数は qualifiedName と this とし、その後 false を返す。

  6. true を返す。

この hasAttributeNS(namespace, localName) メソッドの手順は、次のとおりである:

  1. namespace が空文字列である場合、それを null に設定する。

  2. true を返すのは、this が 持つ 属性の 名前空間が namespace であり、ローカル名が localName である場合であり、それ以外の場合は false を返す。

この getAttributeNode(qualifiedName) メソッドの 手順は、次の結果を返すことである:属性の取得に、 qualifiedName と this を与えた結果。

この getAttributeNodeNS(namespace, localName) メソッドの手順は、次の結果を返すことである: 属性の取得に、 namespace、localName、および this を与えた結果。

この setAttributeNode(attr) と setAttributeNodeNS(attr) メソッドの 手順は、 次の結果を返すことである:属性の設定に、attr と this を与えた結果。

この removeAttributeNode(attr) メソッドの 手順は、 次のとおりである:

  1. もし this の 属性リストが、次を 含まないなら: attr、次を 投げる:"NotFoundError" DOMException。

  2. 除去する:attr を。

  3. attr を返す。


shadow = element . attachShadow(init)

作成する シャドウ根は element のものであり、それを返す。

shadow = element . shadowRoot

element の シャドウ根を返す、それが存在し、かつ シャドウ 根の モードが "open" である場合;それ以外の場合は null を返す。

有効なシャドウホスト 名は、次のいずれかである:

このリストは意図的に制限されている。組み込み要素が内部の シャドウ木を、将来、 必要に応じて持てるようにするためである。

この attachShadow(init) メソッドの手順は、次のとおりである:

  1. registry を this の ノード文書の カスタム要素レジストリーとする。

  2. もし init["customElementRegistry"] が 存在するなら、 registry をそれに設定する。

  3. registry が非 null であり、registry の スコープ付きかが false であり、かつ registry が this の ノード 文書の カスタム要素レジストリーでない場合、次を 投げる: "NotSupportedError" DOMException。

  4. 次を実行する:シャドウ根の取り付け。引数は this、 init["mode"]、 init["delegatesFocus"]、 init["serializable"]、 init["slotAssignment"]、 init["clonable"]、 および registry とする。

  5. this の シャドウ根を返す。

取り付ける: シャドウ根。引数として 要素 element、文字列 mode、真偽値 delegatesFocus、真偽値 serializable、文字列 slotAssignment、真偽値 clonable、および null または CustomElementRegistry オブジェクト registry が与えられた下で:

  1. element の 名前空間が HTML 名前空間でない場合、 次を 投げる:"NotSupportedError" DOMException。

  2. element の ローカル名が 有効な シャドウホスト名でない場合、次を 投げる:"NotSupportedError" DOMException。

  3. element の ローカル名が 有効なカスタム要素名であるか、 element の is 値が非 null である場合:

    1. definition を、次の結果とする:カスタム要素 定義の検索 に、element の カスタム要素レジストリー、その 名前空間、その ローカル 名、およびその is 値を与えた結果。

    2. definition が非 null であり、かつ definition の シャドウを無効にするかが true である場合、次を 投げる: "NotSupportedError" DOMException。

  4. element が シャドウホストである場合:

    1. currentShadowRoot を element の シャドウ根とする。

    2. 次のいずれかが真である場合:

      • currentShadowRoot の 宣言的かが false である;または

      • currentShadowRoot の モードが mode でない、

      その場合、次を 投げる:"NotSupportedError" DOMException。

    3. 除去するのは、currentShadowRoot のすべての 子であり、 木順序で行う。

    4. currentShadowRoot の 宣言的かを false に設定する。

    5. 戻る。

  5. shadow を、次の結果とする:ノードの作成。そのノードが実装するのは ShadowRootであり、 引数は element の ノード文書とする。

  6. shadow の ホストを element に設定する。

  7. shadow の モードを mode に設定する。

  8. shadow の フォーカスを委譲するかを delegatesFocus に設定する。

  9. element の カスタム要素状態が "precustomized" または "custom" である場合、shadow の 要素の内部機構から利用可能かを true に設定する。

  10. shadow の 宣言的かを false に設定する。

  11. shadow の 直列化可能かを serializable に設定する。

  12. shadow の スロット割り当てを slotAssignment に設定する。

  13. shadow の 複製可能かを clonable に設定する。

  14. shadow の カスタム要素レジストリーを registry に設定する。

  15. element の シャドウ根を shadow に設定する。

この shadowRoot 取得子の手順は、次のとおりである:

  1. shadow を this の シャドウ根とする。

  2. shadow が null であるか、その モードが "closed" である場合、 null を返す。

  3. shadow を返す。


registry = element . customElementRegistry

element の CustomElementRegistry オブジェクトがあればそれを返し、それ以外の場合は null を返す。

この customElementRegistry 取得子の手順は、 次を返すことである:this の カスタム要素レジストリー。


element . closest(selectors)
返されるのは、最初の(element から始めて) 広義祖先であり、一致する対象は selectors である。それ以外の場合は null を返す。
element . matches(selectors)
true を返すのは、selectors を element の 根に対して照合し、 element が得られる場合である;それ以外の場合は false を返す。

この closest(selectors) メソッドの手順は、次のとおりである:

  1. selector を、次の結果とする:セレクターの構文解析を selectors から行った結果。 [SELECTORS4]

  2. selector が失敗である場合、次を 投げる:"SyntaxError" DOMException。

  3. elements を this の 広義祖先のうち、 要素であるものとする。順序は 逆の 木順序とする。

  4. elements の各 element について:もし 要素に対するセレクターの照合を、 selector、element、および スコープ根 this を使用して行い、成功が返されるなら、 element を返す。[SELECTORS4]

  5. null を返す。

この matches(selectors) と webkitMatchesSelector(selectors) メソッドの手順は、 次のとおりである:

  1. selector を、次の結果とする:セレクターの構文解析を selectors から行った結果。 [SELECTORS4]

  2. selector が失敗である場合、次を 投げる:"SyntaxError" DOMException。

  3. もし次の結果が、要素に対するセレクターの照合を、 selector、 this、および スコープ 根 this を使用して行い、成功を返すなら、true を返す;それ以外の場合は、 false を返す。[SELECTORS4]


この getElementsByTagName(qualifiedName) メソッドの手順は、次を返すことである:要素のリストで、修飾名が qualifiedName であるもの。 対象は this である。

この getElementsByTagNameNS(namespace, localName) メソッドの手順は、次を返すことである:要素のリストで、名前空間が namespace であり、 ローカル 名が localName であるもの。対象は this である。

この getElementsByClassName(classNames) メソッドの手順は、次を返すことである:クラス名が classNames である要素のリスト。 対象は this である。


隣接位置に挿入するには、 引数として 要素 element、文字列 where、および ノード node が与えられた下で、最初に該当するものに関連付けられた手順を実行する: ASCII 大文字小文字を区別しない比較で where に一致するもの:

"beforebegin"

element の 親が null である場合、null を返す。

次の結果を返す:事前挿入する対象を node とし、挿入先を element の 親とし、 element の前に挿入した結果。

"afterbegin"

次の結果を返す:事前挿入する対象を node とし、挿入先を element とし、 挿入位置を次のものの前とする: element の 最初の子。

"beforeend"

次の結果を返す:事前挿入する対象を node とし、挿入先を element とし、 挿入位置を次のものの前とする: null。

"afterend"

element の 親が null である場合、null を返す。

次の結果を返す:事前挿入する対象を node とし、挿入先を element の 親とし、 挿入位置を element の 次の同胞の前とした結果。

それ以外の場合

投げる:"SyntaxError" DOMException。

この insertAdjacentElement(where, element) メソッドの手順は、次を実行した結果を返すことである:隣接位置への挿入。引数は this、 where、および element とする。

この insertAdjacentText(where, data) メソッドの手順は、次のとおりである:

  1. text を、次の結果とする:テキストノードの作成に、this の ノード 文書と data を与えた結果。

  2. 次を実行する:挿入する: 隣接位置。引数は this、where、および text とする。

このメソッドは何も返さない。私たちが設計する機会を得る前から存在していたためである。

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 オブジェクトのサポートされるプロパティインデックスは、0 から その属性リストのサイズ − 1 までの範囲の 数値である。ただし、属性リストが空である場合は、 サポートされるプロパティインデックスは存在しない。

length の取得手順は、 属性リストのサイズを返すことである。

item(index) メソッドの手順は次のとおりである:

  1. index が次の値以上である場合:this の 属性リスト の サイズ、次を返す: null。

  2. それ以外の場合は、次を返す:this の 属性リスト[index]。

この NamedNodeMap オブジェクトの サポートするプロパティ名 は、次の実行による戻り値である: 以下の 手順:

  1. names を次の 修飾名 とする。対象の 属性 が含まれるのは、この NamedNodeMap オブジェクトの 属性リスト であり、重複を省き、 順序どおりとする。

  2. この NamedNodeMap オブジェクトの 要素 が次の名前空間に属する場合: HTML 名前空間、かつ、その ノード文書 が HTML 文書 である場合は、 それぞれについて、name を names の項目として:

    1. lowercaseName を、name に次を施したものとする:ASCII 小文字化。

    2. lowercaseName が name と等しくない場合は、name を次から除去する: names。

  3. names を返す。

getNamedItem(qualifiedName) メソッドの手順は、qualifiedName と要素を指定して属性を取得した結果を返すことである。

getNamedItemNS(namespace, localName) メソッドの手順は、namespace、localName、および要素を指定して 属性を取得した結果を返すことである。

setNamedItem(attr) および setNamedItemNS(attr) メソッドの 手順は、attr と 要素を指定して属性を設定した結果を返すことである。

removeNamedItem(qualifiedName) メソッドの手順は次のとおりである:

  1. attr を、qualifiedName と要素を指定して 属性を除去した結果とする。

  2. attr が null の場合は、"NotFoundError" DOMException をスローする。

  3. attr を返す。

removeNamedItemNS(namespace, localName) メソッドの手順は次のとおりである:

  1. attr を、namespace、localName、および要素を指定して 属性を除去した結果とする。

  2. attr が null の場合は、"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; // historical; always returns true
};

Attr ノードは、単に 属性と呼ばれる。また、 IDL 属性との混同を避けるため、内容属性と呼ばれることもある。

属性には、 名前空間(null または空でない文字列)、 名前空間接頭辞(null または空でない文字列)、 ローカル名(空でない文字列)、 値(文字列)、および 要素(null または 要素)がある。

現在設計するなら、名前と値だけを持つことになっていただろう。☹

属性の 修飾名は、その ローカル名である。ただし、その名前空間 接頭辞が null の場合に限る。それ以外の場合は、 名前空間接頭辞の後に ":"、 さらにその ローカル名を続けたものである。

ユーザーエージェントは、最適化のためにこれを内部スロットとして保持できる。

次を 作成する: 属性。与えられる引数は 文書 document、 文字列 localName、および省略可能な、文字列または null の namespace(既定値は null)、 文字列または null の prefix(既定値は null)、文字列 value(既定値は空の 文字列)とする:

  1. attribute を次の結果とする:ノードの作成。実装するインターフェイスは Attr、 与える引数は document とする。

  2. 次を設定する:attribute の 名前空間 を namespace に、 名前空間接頭辞 を prefix に、 ローカル名 を localName に、および 値 を value に。

  3. attribute を返す。

ある A 属性 は、次の 属性 である。その ローカル名 は A であり、その 名前空間 および 名前空間接頭辞 は null である。


この namespaceURI 取得子の手順は、次を返すことである: this の 名前空間。

この prefix 取得子の手順は、次を返すことである:this の 名前空間接頭辞。

この localName 取得子の手順は、次を返すことである: this の ローカル名。

この name 取得子の手順は、次を返すことである:this の 修飾名。

この value 取得子の手順は、次を返すことである:this の 値。

次を 設定する: 既存の属性値。与えられる引数は 属性 attribute および 文字列 value とし、次の手順を実行する:

  1. attribute の 要素 が null である場合は、attribute の 値 を value に設定して戻る。

  2. element を attribute の 要素 とする。

  3. verifiedValue を次の呼び出しの結果とする: 信頼型に準拠する属性 値の取得。引数は attribute の ローカル名、attribute の 名前空間、element、 および value とする。[TRUSTED-TYPES]

  4. attribute の 要素 が null である場合は、attribute の 値 を verifiedValue に設定して戻る。

  5. 変更する:attribute を次の値に: verifiedValue。

この value 設定子の手順は、次を実行することである:既存の属性値の設定。引数は this および与えられた値とする。


この ownerElement 取得子の手順は、次を返すことである: this の 要素。


この specified 取得子の手順は、true を返すことである。

4.10. インターフェイス CharacterData

[Exposed=Window]
interface CharacterData : Node {
  attribute [LegacyNullToEmptyString] DOMString data;
  readonly attribute unsigned long length;
  DOMString substringData(unsigned long offset, unsigned long count);
  undefined appendData(DOMString data);
  undefined insertData(unsigned long offset, DOMString data);
  undefined deleteData(unsigned long offset, unsigned long count);
  undefined replaceData(unsigned long offset, unsigned long count, DOMString data);
};

CharacterData は抽象インターフェイスである。直接インスタンスを取得することはできない。これは Text、ProcessingInstruction、 および Comment ノードによって使用される。

CharacterData インターフェイスを継承する各ノードには、 データと呼ばれる変更可能な 文字列が関連付けられている。

ノード node の データを置換するには、 整数 offset、整数 count、文字列 data、および省略可能な 真偽値 piAttributesAlreadyUpdated(既定値は false)を指定して、次を実行する:

  1. length を node の長さとする。

  2. offset が length より大きい場合、 "IndexSizeError" DOMException を投げる。

  3. offset + count が length より大きい場合、 count を length − offset に設定する。

  4. node に対して "characterData" 型の 変更レコードをキューに入れる。 その際、null、null、node のデータ、« »、« »、null、および null を指定する。

  5. node のデータの offset コード単位の後に data を挿入する。

  6. deleteOffset を offset + data の 長さとする。

  7. deleteOffset コード単位の位置から、 node のデータから count 個の コード単位を削除する。

  8. 開始ノードが node であり、 開始オフセットが offset より大きく、 offset + count 以下である各ライブ 範囲について、その開始オフセットを offset に設定する。

  9. 終了ノードが node であり、 終了オフセットが offset より大きく、 offset + count 以下である各ライブ範囲について、その 終了オフセットを offset に設定する。

  10. 開始ノードが node であり、 開始オフセットが offset + count より大きい各ライブ範囲について、その 開始オフセットを data の長さだけ増加させ、 count だけ減少させる。

  11. 終了ノードが node であり、 終了オフセットが offset + count より大きい各ライブ範囲について、その 終了オフセットを data の長さだけ増加させ、 count だけ減少させる。

  12. node がProcessingInstruction ノードであり、 piAttributesAlreadyUpdated が false の場合、 node を指定してデータから 属性を更新する。

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

ノード node の データの部分文字列を取得するには、 整数 offset と整数 count を指定して、次を実行する:

  1. length を node の長さとする。

  2. offset が length より大きい場合、 "IndexSizeError" DOMException を投げる。

  3. offset + count が length より大きい場合、 node のデータの末尾まで、 offset番目の コード単位からの コード単位を値とする文字列を返す。

  4. node のデータ内の、 offset番目の コード単位から、 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 ノードの 兄弟の データを結合したものを返す。

排他的な Text ノード は、Text ノードのうち、 CDATASection ノードではないものである。

ノード node の 連続する Text ノード は、 node、node の直前の兄弟である Text ノード(存在する場合)、 およびその連続する Text ノード、ならびに node の次の兄弟である Text ノード(存在する場合)、 およびその連続する Text ノードであり、 重複は除外する。

ノード node の 連続する排他的な Text ノード は、node、node の直前の兄弟である 排他的な Text ノード(存在する場合)、およびその 連続する排他的な Text ノード、ならびに node の 次の 兄弟である排他的な Text ノード(存在する場合)、およびその 連続する排他的な Text ノードであり、 重複は除外する。

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

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

次を 作成する:テキスト ノード。与えられる引数は 文書 document および 文字列 data とする:

  1. text を次の結果とする:ノードの作成。実装するインターフェイスは Text、与える引数は document とする。

  2. text の データ を data に設定する。

  3. text を返す。


この new Text(data) 構築子の手順は、次を設定することである:this の データ を data に、および this の ノード 文書 を次に:現在のグローバルオブジェクト の 関連付けられた Document。

次を 分割する:Text ノード node。使用する引数は 整数 offset とする:

  1. length を node の 長さ とする。

  2. offset が length より大きい場合は、次を 投げる: "IndexSizeError" DOMException。

  3. count を length − offset とする。

  4. newData を次の結果とする:データの部分文字列の取得。対象は node とし、引数は offset および count とする。

  5. newNode を次の結果とする:テキストノードの作成。与える引数は node の ノード 文書 および newData とする。

  6. parent を node の 親 とする。

  7. parent が null でない場合:

    1. 挿入する:newNode を parent 内の、node の 次の同胞 の前に。

    2. 各 生きた範囲 のうち、始端 ノード が node であり、かつ 始端オフセット が次より大きいものについて: offset。その 始端ノード を newNode に設定し、 減らすのは、その 始端オフセット であり、減少量は offset とする。

    3. 各 生きた範囲 のうち、終端ノード が node であり、かつ 終端オフセット が次より大きいものについて: offset。その 終端ノード を newNode に設定し、減らすのは、その 終端 オフセット であり、減少量は offset とする。

    4. 各 生きた範囲 のうち、始端 ノード が parent であり、かつ 始端オフセット が次に等しいものについて:インデックス(対象は node)に 1 を加えた値。 増やすのは、その 始端オフセット であり、増加量は 1 とする。

    5. 各 生きた範囲 のうち、終端ノード が parent であり、かつ 終端オフセット が次に等しいものについて:インデックス(対象は node)に 1 を加えた値。 増やすのは、その 終端オフセット であり、増加量は 1 とする。

  8. 置換する: データ。対象は node とし、引数は offset、count、および 空文字列とする。

  9. newNode を返す。

この splitText(offset) メソッドの手順は、次を 分割する ことである:this。使用する引数は オフセット offset とする。

この wholeText 取得子の手順は、次の結果を返すことである: 連結。連結するのは データ であり、その所属先は 連続する Text ノード(対象は this)であり、順序は 木順序 とする。

4.12. インターフェイス CDATASection

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

文書 document と文字列 data が与えられたとき、CDATA セクションノードを作成するには: document と文字列 data:

  1. node を、ノードを作成した結果とする。そのノードは CDATASection を実装し、 document が与えられる。

  2. node のデータを data に設定する。

  3. node を返す。

4.13. インターフェイス ProcessingInstruction

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

  readonly attribute DOMString target;

  boolean hasAttributes();
  sequence<DOMString> getAttributeNames();
  DOMString? getAttribute(DOMString name);
  undefined setAttribute(DOMString name, DOMString value);
  undefined removeAttribute(DOMString name);
  boolean toggleAttribute(DOMString name, optional boolean force);
  boolean hasAttribute(DOMString name);
};
pi = new ProcessingInstruction(target [, data = ""])
新しい ProcessingInstruction ノードを返す。その ターゲットは target であり、 データは data である。
pi . target
ターゲットを返す。
pi . hasAttributes()

pi に属性がある場合は true、それ以外の場合は false を返す。

pi . getAttributeNames()

pi のすべての属性の名前を返す。重複は含まれない。

pi . getAttribute(name)

pi の name という名前の属性の値を返す。そのような 属性が存在しない場合は null を返す。

pi . setAttribute(name, value)

pi の name という名前の属性を value に設定する。

pi . removeAttribute(name)

pi の name という名前の属性を削除する。

pi . toggleAttribute(name [, force])

force が指定されていない場合、name を「切り替え」、 存在すれば削除し、存在しなければ追加する。force が true の場合は name を追加する。force が false の場合は name を削除する。

name が現在存在する場合は true、それ以外の場合は false を返す。

pi . hasAttribute(name)

pi に name という名前の属性がある場合は true、それ以外の場合は false を返す。

ProcessingInstruction ノードには、関連付けられた ターゲットがある。

ProcessingInstruction ノードには、関連付けられた 属性マップがあり、これは マップであり、 初期状態では空である。

文書 document、文字列 target、および文字列 data を指定して 処理命令ノードを作成するには、次を実行する:

  1. pi を、document を指定して ProcessingInstruction を実装する ノードを作成した結果とする。

  2. target と data を指定して pi を 初期化する。

  3. pi を返す。

ProcessingInstruction ノード pi を target と data で 初期化するには、次を実行する:

  1. target が Name 生成規則に一致しない場合、 "InvalidCharacterError" DOMException を投げる。

  2. data に文字列 "?>" が含まれる場合、 "InvalidCharacterError" DOMException を投げる。

  3. pi のターゲットを target に設定する。

  4. pi のデータを data に設定する。

  5. pi を指定して データから属性を更新する。

ProcessingInstruction ノード pi を指定してデータから 属性を更新するには、次を実行する:

  1. pi の属性マップを 空にする。

  2. result を、 pi の データを指定して 文字列から擬似属性を解析する規則を呼び出した 解析結果とする。

  3. result がエラーの場合、返る。

  4. result の各擬似属性 pseudoAttr について、 pi の 属性マップ[pseudoAttr の名前] を pseudoAttr の値に 設定する。

ProcessingInstruction ノード pi を指定して属性から データを更新するには、次を実行する:

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

  2. pi の属性マップの 各 name → value について 次を実行する:

    1. data が空文字列でない場合、U+0020 SPACE を data に追加する。

    2. name を data に追加する。

    3. U+003D (=) を data に追加する。

    4. U+0022 (") を data に追加する。

    5. value 内のすべての U+0026 (&) を "&amp;" に置換する。

    6. value 内のすべての U+003C (<) を "&lt;" に置換する。

    7. value 内のすべての U+003E (>) を "&gt;" に置換する。

    8. value 内のすべての U+0022 (") を "&quot;" に置換する。

    9. value を data に追加する。

    10. U+0022 (") を data に追加する。

  3. pi のデータを 置換する。その際、0、pi の長さ、 data、および true を指定する。

ProcessingInstruction ノード pi と 文字列 name を指定して処理命令の属性を取得するには、 pi の 属性マップ[name] を返す。その際、 既定値は null とする。


この new ProcessingInstruction(target, data) 構築子の手順は、次のとおりである:

  1. 次を設定する:this の ノード文書 を次に:現在のグローバルオブジェクト の 関連付けられた Document。

  2. 初期化する:this を。引数は target および data とする。

この target 取得子の手順は、 次を返すことである: this の ターゲット。

この hasAttributes() メソッドの 手順は、次のとおりである: false を返すのは、this の 属性マップ が 空である 場合とし、それ以外の場合は true を返す。

この getAttributeNames() メソッドの手順 は、次の結果を返すことである:取得する: キー群。対象は this の 属性マップ とする。

この getAttribute(name) メソッドの 手順は、次の結果を返すことである:処理命令の属性の取得。 与える引数は this および name とする。

この setAttribute(name, value) メソッドの手順は、次のとおりである:

  1. name が 妥当な属性ローカル名 でない場合は、次を 投げる: "InvalidCharacterError" DOMException。

  2. 設定する:this の 属性マップ[name] を value に。

  3. 属性からデータを更新する。与える引数は this とする。

この removeAttribute(name) メソッドの手順は、次のとおりである:

  1. 除去する:this の 属性マップ[name] を。

  2. 属性からデータを更新する。与える引数は this とする。

この toggleAttribute(name, force) メソッドの手順は、次のとおりである:

  1. name が 妥当な属性ローカル名 でない場合は、次を 投げる: "InvalidCharacterError" DOMException。

  2. attributes を this の 属性マップ とする。

  3. attributes[name] が 存在 しない場合:

    1. force が与えられていないか true である場合は、次を 設定する: attributes[name] を空文字列に。その後、更新する: 属性からデータを。 与える引数は this とし、その後 true を返す。

    2. false を返す。

  4. force が与えられていないか false である場合は、次を 除去する: attributes[name]。その後、データを更新する: 属性から。与える引数は this とし、 その後 false を返す。

  5. true を返す。

この hasAttribute(name) メソッドの手順は、true を返すことである。ただし、this の 属性マップ[name] が 存在する 場合とし、それ以外の場合は false を返す。

4.14. インターフェイス Comment

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

次を 作成する:コメント ノード。与えられる引数は 文書 document および 文字列 data とする:

  1. comment を次の結果とする:ノードの作成。実装するインターフェイスは Comment、 与える引数は document とする。

  2. comment の データ を data に設定する。

  3. comment を返す。

この new Comment(data) 構築子の手順は、次を設定することである:this の データ を data に、および this の ノード 文書 を次に:現在のグローバルオブジェクト の 関連付けられた Document。

5. Range(範囲)

5.1. 「DOM Range」について

StaticRange および Range オブジェクト(範囲)は、 ノードツリー内の 内容の列を表す。各範囲には、始点と終点があり、それらは 境界点である。境界点は、タプルであり、 ノードとオフセットから成る。 言い換えると、 範囲は、ノード ツリー内の、2 つの 境界点の間にある 内容の一部を表す。

範囲は、 内容の選択やコピーのために、編集で頻繁に使用される。

上記のノードツリーでは、 範囲を使用して、 “syndata is awes” というシーケンスを表現できる。p が p 要素に、 そして em が em 要素に割り当てられていると 仮定すると、これは次のように行われる:

var range = new Range(),
    firstText = p.childNodes[1],
    secondText = em.firstChild
range.setStart(firstText, 9) // 先頭の空白を忘れないこと
range.setEnd(secondText, 4)
// range は、文字列化すると前述の引用になる

上記の ノードツリー内の src や alt のような属性は、範囲によって表現することはできない。範囲が有用なのは、 ノードに対してのみである。

Range オブジェクトは、 StaticRange オブジェクトとは異なり、 ノードツリーへの 変更の影響を受ける。そのため、ライブ範囲とも呼ばれる。このような変更によって 無効になることはなく、引き続き同じ内容部分を表すように維持される。 必然的に、たとえば表している内容の一部が変更される場合、ライブ範囲自体も、 ノードツリーへの 変更の一環として変更されることがある。

詳細については、挿入および除去アルゴリズム、 normalize() メソッド、ならびにデータを置換するおよび分割する アルゴリズムを参照。

ノード ツリーの変更に応じてライブ範囲を更新する処理は、高コストになる可能性がある。 ノードツリーが 変更されるたびに、影響を受けるすべての Range オブジェクトを更新する必要がある。アプリケーションが一部のライブ範囲に関心がなくても、 変更が発生した際には、それらを最新の状態に保つためのコストを負担しなければならない。

StaticRange オブジェクトは、ノードツリーが変更されても更新されない、軽量な 範囲である。そのため、 ライブ範囲と同じ保守コストは発生しない。

5.2. 境界点

境界点は、 ノード(ノード)と オフセット(非負整数)からなる タプルである。

正しい境界点のオフセットは、 0 以上、その境界点のノードの 長さ以下である。

境界点 (nodeB、offsetB)に対する 境界点 (nodeA、offsetA)の 位置は、次の手順によって返される 前、 等しい、または 後である:

  1. 表明:nodeAとnodeBは同じ ルートを持つ。

  2. nodeAがnodeBである場合、offsetAが offsetBであれば等しいを返し、offsetAが offsetBより小さければ前を返し、offsetAが offsetBより大きければ後を返す。
  3. nodeAがnodeBに後続する場合、 (nodeA、offsetA)に対する (nodeB、offsetB)の 位置が 前であれば 後を返し、それが 後であれば 前を返す。

  4. nodeAがnodeBの祖先である場合:

    1. childをnodeBとする。

    2. childがnodeAの子でない間、 childをその親に設定する。

    3. childのインデックスが offsetAより小さい場合、 後を返す。

  5. 前を返す。

5.3. インターフェイス AbstractRange

[Exposed=Window]
interface AbstractRange {
  readonly attribute Node startContainer;
  readonly attribute unsigned long startOffset;
  readonly attribute Node endContainer;
  readonly attribute unsigned long endOffset;
  readonly attribute boolean collapsed;
};

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

範囲には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 取得子の手順は、true を返すことである。ただし、this が 折り畳まれている 場合とし、それ以外の場合は 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" DOMException を投げる。

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

StaticRange は、次のすべてが true である場合に妥当である:

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. parent を node の親とする。

  2. 表明:parent は null でない。

  3. index を node のインデックスとする。

  4. 開始ノードが node の自身を含む子孫である各ライブ範囲について、その 開始点を (parent, index) に設定する。

  5. 終了ノードが node の自身を含む子孫である 各ライブ範囲について、その終了点を (parent, index) に設定する。

  6. 開始ノードが parent であり、 開始オフセットが index より大きい 各ライブ範囲について、その 開始オフセットを 1 減少させる。

  7. 終了ノードが parent であり、 終了オフセットが index より大きい 各ライブ範囲について、その 終了オフセットを 1 減少させる。


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

この new Range() 構築子の 手順は、 次を設定することである:this の 始端 および 終端 を次に: (現在のグローバルオブジェクト の 関連付けられた Document, 0)。


container = range . commonAncestorContainer
次の ノード を返す。最も遠く 離れている対象は 文書 であり、このノードは 祖先 である。その対象は、range の 始端ノード および 終端 ノード の両方である。

次を 取得する:共通 祖先。対象は 生きた範囲 range とする:

  1. container を range の 始端ノード とする。

  2. container が次の 広義祖先 でない間: range の 終端ノード。container を次に設定する: container の 親。

  3. container を返す。

この commonAncestorContainer 取得子の手順は、 次のとおりである: 次の結果を返す:共通祖先の取得。対象は this とする。


次を行う: 始端または終端を設定する。 対象は range とし、設定先は 境界点 (node, offset) とする:

  1. node が 文書型 である場合は、次を 投げる: "InvalidNodeTypeError" DOMException。

  2. offset が node の 長さ より大きい場合は、 投げる:"IndexSizeError" DOMException。

  3. boundaryPoint を 境界点 (node, offset) とする。

  4. これらの手順が「始端を設定する」として呼び出された場合
    1. range の 根 が node の 根 でないか、boundaryPoint が次より 後 にある場合: range の 終端。range の 終端 を boundaryPoint に設定する。

    2. range の 始端 を boundaryPoint に設定する。

    これらの手順が「終端を設定する」として呼び出された場合
    1. range の 根 が node の 根 でないか、boundaryPoint が次より 前 にある場合: range の 始端。range の 始端 を boundaryPoint に設定する。

    2. range の 終端 を boundaryPoint に設定する。

この setStart(node, offset) メソッドの 手順は、次を 設定する: 始端。対象は this とし、設定先は 境界点 (node, offset) とする。

この setEnd(node, offset) メソッドの 手順は、次を 設定する: 終端。対象は this とし、設定先は 境界点 (node, offset) とする。

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

  1. parent を node の 親 とする。

  2. parent が null である場合は、次を 投げる: "InvalidNodeTypeError" DOMException。

  3. 設定する: 始端。対象は this とし、設定先は 境界点 (parent, node の インデックス) とする。

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

  1. parent を node の 親 とする。

  2. parent が null である場合は、次を 投げる: "InvalidNodeTypeError" DOMException。

  3. 設定する: 始端。対象は this とし、設定先は 境界点 (parent, node の インデックス に 1 を加えた値) とする。

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

  1. parent を node の 親 とする。

  2. parent が null である場合は、次を 投げる: "InvalidNodeTypeError" DOMException。

  3. 設定する: 終端。対象は this とし、設定先は 境界点 (parent, node の インデックス) とする。

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

  1. parent を node の 親 とする。

  2. parent が null である場合は、次を 投げる: "InvalidNodeTypeError" DOMException。

  3. 設定する: 終端。対象は this とし、設定先は 境界点 (parent, node の インデックス に 1 を加えた値) とする。

この collapse(toStart) メソッドの手順は、次のとおりである: toStart が true である場合は、終端 を 始端 に設定する。それ以外の場合は、 始端 を 終端 に設定する。

次を 選択する:ノード node。 選択を行う 範囲 は range とする:

  1. parent を node の 親 とする。

  2. parent が null である場合は、次を 投げる: "InvalidNodeTypeError" DOMException。

  3. index を node の インデックス とする。

  4. 設定する:range の 始端 を 境界点 (parent, index) に。

  5. 設定する:range の 終端 を 境界点 (parent, index に 1 を加えた値) に。

この selectNode(node) メソッドの手順は、次を 選択する ことである: node。選択を行う範囲は this とする。

この selectNodeContents(node) メソッドの 手順 は、次のとおりである:

  1. node が 文書型 である場合は、次を 投げる: "InvalidNodeTypeError" DOMException。

  2. length を次の 長さ とする:node。

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

  4. 設定する:終端 を 次の 境界 点 (node, length) に。


この compareBoundaryPoints(how, sourceRange) メソッドの手順は:

  1. how が次のいずれでもない場合:

    次を 投げる:"NotSupportedError" DOMException。

  2. もし this の 根 が sourceRange の 根 でない場合は、 次を 投げる:"WrongDocumentError" DOMException。

  3. thisPoint および sourcePoint を null とする。

  4. how に応じて分岐する:

    START_TO_START:

    設定する:thisPoint を this の 始端 に、および sourcePoint を sourceRange の 始端 に。

    START_TO_END:

    設定する:thisPoint を this の 終端 に、および sourcePoint を sourceRange の 始端 に。

    END_TO_END:

    設定する:thisPoint を this の 終端 に、および sourcePoint を sourceRange の 終端 に。

    END_TO_START:

    設定する:thisPoint を this の 始端 に、および sourcePoint を sourceRange の 終端 に。

  5. 次の 位置 に応じて分岐する:thisPoint の、次に対する相対位置: sourcePoint:

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

この deleteContents() メソッドの手順は:

  1. もし this が 折り畳まれている 場合は、戻る。

  2. originalStartNode、originalStartOffset、 originalEndNode、および originalEndOffset を this の 始端ノード、始端 オフセット、終端ノード、および 終端オフセット とそれぞれする。

  3. originalStartNode が originalEndNode であり、かつ、それが CharacterData ノード である場合:

    1. データを置換する。対象は originalStartNode とし、 引数は originalStartOffset、 originalEndOffset − originalStartOffset、および空文字列とする。

    2. 戻る。

  4. nodesToRemove を、次のすべての ノード のリストとする。それらは 包含されている。包含先は this とし、並びは 木順序 とする。ただし、次の各 ノード を省く。その 親 も 包含されている。包含先は this である。

  5. newNode および newOffset を null とする。

  6. originalStartNode が次の 広義祖先 である場合: originalEndNode。newNode を originalStartNode に設定し、 newOffset を originalStartOffset に設定する。

  7. それ以外の場合:

    1. referenceNode を originalStartNode とする。

    2. referenceNode の 親 が null でなく、かつ次の 広義祖先 でない間: originalEndNode。referenceNode を次に設定する: その 親。

    3. 設定する:newNode を referenceNode の 親 に、および newOffset を referenceNode の インデックス + 1 に。

      referenceNode の 親 が null であったなら、 それは次の 根 である:this。その場合、 それは次の 広義祖先 である: originalEndNode。したがって、この 箇所には到達し得ない。

  8. 設定する:this の 始端 および 終端 を (newNode, newOffset) に。

  9. originalStartNode が CharacterData ノード である場合は、 置換する: データ。対象は originalStartNode とし、引数は originalStartOffset、 originalStartNode の 長さ − originalStartOffset、および 空文字列とする。

  10. 各 node(nodesToRemove の項目)について、木順序 で: 除去する:node を。

  11. originalEndNode が CharacterData ノード である場合は、 置換する: データ。対象は originalEndNode とし、引数は 0、originalEndOffset、および 空文字列とする。

次を 抽出する:生きた範囲 range:

  1. fragment を次の結果とする:作成する: 文書断片。与える引数は range の 始端ノード の ノード文書 とする。

  2. range が 折り畳まれている 場合は、fragment を返す。

  3. originalStartNode、originalStartOffset、 originalEndNode、および originalEndOffset を range の 始端ノード、始端 オフセット、終端ノード、および 終端オフセット とそれぞれする。

  4. originalStartNode が originalEndNode であり、かつ、それが CharacterData ノード である場合:

    1. clone を次の 複製 とする:originalStartNode。

    2. 設定する:clone の データ を、次の結果に: データの部分文字列の取得。対象は originalStartNode とし、引数は originalStartOffset および originalEndOffset − originalStartOffset とする。

    3. 追加する:clone を fragment に。

    4. データを置換する。対象は originalStartNode とし、 引数は originalStartOffset、 originalEndOffset − originalStartOffset、および空文字列とする。

    5. fragment を返す。
  5. commonAncestor を次の結果とする:取得する:共通 祖先。対象は range とする。

  6. firstPartiallyContainedChild を null とする。

  7. originalStartNode が次の 広義 祖先 でない場合: originalEndNode。firstPartiallyContainedChild を、最初の 子 に設定する。その親は commonAncestor であり、その子は 部分的に 包含されている(包含先は range)。
  8. lastPartiallyContainedChild を null とする。

  9. originalEndNode が次の 広義祖先 でない場合: originalStartNode。lastPartiallyContainedChild を、最後の 子 に設定する。 その親は commonAncestor であり、その子は 部分的に 包含されている(包含先は range)。

    これらの変数への代入は、実際に常に意味をなす。例えば、 次の場合を考える: originalStartNode が次の 広義祖先 でない: originalEndNode。この場合、originalStartNode 自体が 部分的に 包含されている(包含先は range)。また、そのすべての 祖先 も、次の 子 に至るまで同様である。その親は commonAncestor である。 commonAncestor は originalStartNode ではあり得ない。前者は次の 広義祖先 でなければならないためである: originalEndNode。もう一方の場合も同様である。また、 これら 2 つの 子 は、両方が定義されている場合、決して同じにはならないことに注意。

  10. containedChildren を、すべての 子 のリストとする。その親は commonAncestor であり、それらの子は 包含されている(包含先は range)。並びは 木 順序 とする。

  11. containedChildren のいずれかの項目が 文書型 である場合は、次を 投げる: "HierarchyRequestError" DOMException。

    最初または最後の部分的に 包含されているノードについては、考慮する必要はない。文書型 は、決して 部分的に包含され得ないためである。範囲の境界点にはなれず、また、 何かの祖先にもなれない。

  12. newNode および newOffset を null とする。

  13. originalStartNode が次の 広義祖先 である場合: originalEndNode。newNode を originalStartNode に設定し、 newOffset を originalStartOffset に設定する。

  14. それ以外の場合:

    1. referenceNode を originalStartNode とする。

    2. referenceNode の 親 が null でなく、かつ次の 広義祖先 でない間: originalEndNode。referenceNode を次に設定する: その 親。

    3. newNode を次の 親 に設定する:referenceNode。また、 newOffset を referenceNode の インデックス + 1 に設定する。

      referenceNode の 親 が null であるなら、 それは次の 根 である:range。その場合、それは 次の 広義祖先 である: originalEndNode。したがって、この 箇所には到達し得ない。

  15. 設定する:range の 始端 および 終端 を (newNode, newOffset) に。

  16. firstPartiallyContainedChild が CharacterData ノード である場合:

    この場合、firstPartiallyContainedChild は originalStartNode である。

    1. clone を次の 複製 とする: originalStartNode。

    2. 次の データ(所属先は clone)を、次の結果に設定する: データの部分文字列の取得。対象は originalStartNode とし、引数は originalStartOffset および originalStartNode の 長さ − originalStartOffset とする。

    3. 追加する:clone を fragment に。

    4. データを置換する。対象は originalStartNode とし、 引数は originalStartOffset、 originalStartNode の 長さ − originalStartOffset、および 空文字列とする。

  17. それ以外の場合、firstPartiallyContainedChild が null でなければ:

    1. clone を次の 複製 とする: firstPartiallyContainedChild。

    2. 追加する:clone を fragment に。

    3. subrange を新たな 生きた範囲 とする。その 始端 は (originalStartNode, originalStartOffset)、その 終端 は (firstPartiallyContainedChild, firstPartiallyContainedChild の 長さ) とする。

    4. subfragment を次の結果とする:抽出。対象は subrange とする。

    5. 追加する:subfragment を clone に。
  18. 各 contained child(containedChildren の項目)について:追加する: contained child を fragment に。

  19. lastPartiallyContainedChild が CharacterData ノード である場合:

    この場合、lastPartiallyContainedChild は originalEndNode である。

    1. clone を次の 複製 とする:originalEndNode。

    2. 設定する:clone の データ を、次の結果に: データの部分文字列の取得。対象は originalEndNode とし、引数は 0 および originalEndOffset とする。

    3. 追加する:clone を fragment に。

    4. データを置換する。対象は originalEndNode とし、 引数は 0、originalEndOffset、 および空文字列とする。

  20. それ以外の場合、lastPartiallyContainedChild が null でなければ:

    1. clone を次の 複製 とする: lastPartiallyContainedChild。

    2. 追加する:clone を fragment に。

    3. subrange を新たな 生きた範囲 とする。その 始端 は (lastPartiallyContainedChild, 0)、その 終端 は (originalEndNode, originalEndOffset) とする。

    4. subfragment を次の結果とする:抽出。対象は subrange とする。

    5. 追加する:subfragment を clone に。

  21. fragment を返す。

この extractContents() メソッドの手順は、次の 結果を返すことである:抽出。対象は this とする。

次を行う: 内容を複製する。 対象は 生きた範囲 range とする:

  1. fragment を次の結果とする:作成する: 文書断片。与える引数は range の 始端ノード の ノード文書 とする。

  2. range が 折り畳まれている 場合は、fragment を返す。

  3. originalStartNode、originalStartOffset、 originalEndNode、および originalEndOffset を range の 始端ノード、始端 オフセット、終端ノード、および 終端オフセット とそれぞれする。

  4. originalStartNode が originalEndNode であり、かつ、それが CharacterData ノード である場合:

    1. clone を次の 複製 とする:originalStartNode。

    2. 設定する:clone の データ を、次の結果に: データの部分文字列の取得。対象は originalStartNode とし、引数は originalStartOffset および originalEndOffset − originalStartOffset とする。

    3. 追加する:clone を fragment に。

    4. fragment を返す。

  5. commonAncestor を次の結果とする:取得する:共通 祖先。対象は range とする。

  6. firstPartiallyContainedChild を null とする。

  7. originalStartNode が次の 広義祖先 でない場合: originalEndNode。firstPartiallyContainedChild を、最初の 子 に設定する。 その親は commonAncestor であり、その子は 部分的に 包含されている(包含先は range)。

  8. lastPartiallyContainedChild を null とする。

  9. originalEndNode が次の 広義祖先 でない場合: originalStartNode。lastPartiallyContainedChild を、最後の 子 に設定する。 その親は commonAncestor であり、その子は 部分的に 包含されている(包含先は range)。

    これらの変数への代入は、実際に常に意味をなす。例えば、 次の場合を考える: originalStartNode が次の 広義祖先 でない: originalEndNode。この場合、originalStartNode 自体が 部分的に 包含されている(包含先は range)。また、そのすべての 祖先 も、次の 子 に至るまで同様である。その親は commonAncestor である。 commonAncestor は originalStartNode ではあり得ない。前者は次の 広義祖先 でなければならないためである: originalEndNode。もう一方の場合も同様である。また、 これら 2 つの 子 は、両方が定義されている場合、決して同じにはならないことに注意。

  10. containedChildren を、すべての 子 のリストとする。その親は commonAncestor であり、それらの子は 包含されている(包含先は range)。並びは 木 順序 とする。

  11. containedChildren のいずれかの項目が 文書型 である場合は、次を 投げる: "HierarchyRequestError" DOMException。

    最初または最後の部分的に 包含されているノードについては、考慮する必要はない。文書型 は、決して 部分的に包含され得ないためである。範囲の境界点にはなれず、また、 何かの祖先にもなれない。

  12. firstPartiallyContainedChild が CharacterData ノード である場合:

    この場合、firstPartiallyContainedChild は originalStartNode である。

    1. clone を次の 複製 とする:originalStartNode。

    2. 次の データ(所属先は clone)を、次の結果に設定する: データの部分文字列の取得。対象は originalStartNode とし、引数は originalStartOffset および originalStartNode の 長さ − originalStartOffset とする。

    3. 追加する:clone を fragment に。

  13. それ以外の場合、firstPartiallyContainedChild が null でなければ:

    1. clone を次の 複製 とする: firstPartiallyContainedChild。

    2. 追加する:clone を fragment に。

    3. subrange を新たな 生きた範囲 とする。その 始端 は (originalStartNode, originalStartOffset)、その 終端 は (firstPartiallyContainedChild, firstPartiallyContainedChild の 長さ) とする。

    4. subfragment を次の結果とする:複製する: 内容。 対象は subrange とする。

    5. 追加する:subfragment を clone に。

  14. 各 contained child(containedChildren の項目)について:

    1. clone を次の 複製 とする:contained child。 このとき、subtree を true に設定する。

    2. 追加する:clone を fragment に。

  15. lastPartiallyContainedChild が CharacterData ノード である場合:

    この場合、lastPartiallyContainedChild は originalEndNode である。

    1. clone を次の 複製 とする:originalEndNode。

    2. 設定する:clone の データ を、次の結果に: データの部分文字列の取得。対象は originalEndNode とし、引数は 0 および originalEndOffset とする。

    3. 追加する:clone を fragment に。

  16. それ以外の場合、lastPartiallyContainedChild が null でなければ:

    1. clone を次の 複製 とする: lastPartiallyContainedChild。

    2. 追加する:clone を fragment に。

    3. subrange を新たな 生きた範囲 とする。その 始端 は (lastPartiallyContainedChild, 0)、その 終端 は (originalEndNode, originalEndOffset) とする。

    4. subfragment を次の結果とする:複製する: 内容。 対象は subrange とする。

    5. 追加する:subfragment を clone に。

  17. fragment を返す。

この cloneContents() メソッドの手順は、次の 結果を返すことである:複製する: 内容。対象は this とする。

次を 挿入する:ノード node。挿入先は 生きた範囲 range とする:

  1. range の 始端ノード が ProcessingInstruction または Comment ノード であるか、Text ノード であって、その 親 が null であるか、または node である場合は、次を 投げる:"HierarchyRequestError" DOMException。

  2. referenceNode を null とする。

  3. range の 始端ノード が Text ノード である場合は、設定する: referenceNode を、その Text ノード に。

  4. それ以外の場合は、referenceNode を次の 子 に設定する。その親は range の 始端ノード であり、その インデックス は range の 始端オフセット である。ただし、そのような 子 が存在する場合とし、 それ以外の場合は null に設定する。

  5. parent を range の 始端ノード とする。ただし、 referenceNode が null である場合とし、それ以外の場合は referenceNode の 親 とする。

  6. 事前挿入の妥当性を確保する。 与える引数は node、parent、 referenceNode、および « » とする。

  7. range の 始端ノード が Text ノード である場合は、設定する: referenceNode を次の結果に:分割。対象はそのノードとし、オフセットは range の 始端オフセット とする。

  8. node が referenceNode である場合は、referenceNode をその 次の同胞 に設定する。

  9. node の 親 が null でない場合は、除去する: node を。

  10. newOffset を parent の 長さ とする。ただし、 referenceNode が null である場合とし、それ以外の場合は referenceNode の インデックス とする。

  11. newOffset を増やす。増加量は node の 長さ とする。ただし、node が DocumentFragment ノード である場合とし、それ以外の場合は 1 とする。

  12. 事前挿入する:node を parent 内の referenceNode の前に。

  13. range が 折り畳まれている 場合は、range の 終端 を (parent, newOffset) に設定する。

この insertNode(node) メソッドの手順は、次を 挿入する ことである: node。挿入先は this とする。

この surroundContents(newParent) メソッドの 手順 は、次のとおりである:

  1. もし、Text でない ノード が 部分的に包含されている 場合(包含先は this)、次を 投げる: "InvalidStateError" DOMException。

  2. newParent が Document、 DocumentType、 または DocumentFragment ノード である場合は、次を 投げる:"InvalidNodeTypeError" DOMException。

    歴史的な理由により、CharacterData ノード は、ここでは 検査されず、後で副作用として例外が投げられることになる。

  3. fragment を次の結果とする:抽出。対象は this とする。

  4. newParent に 子 がある場合は、すべてを置換する。置換に用いるのは null とし、対象は newParent の内部とする。

  5. 挿入する:newParent を this に。

  6. 追加する: fragment を newParent に。

  7. 選択する:newParent を。選択を行う範囲は this とする。

この cloneRange() メソッドの手順は、新たな 生きた範囲 を返すことである。その 始端 および 終端 は、次と同じとする:this。

この detach() メソッドの手順は、何もしないことである。 その機能(Range オブジェクトの無効化) は除去されたが、メソッド自体は 互換性のために維持されている。


position = range . comparePoint(node, offset)
点が範囲より前にある場合は −1、点が 範囲内にある場合は 0、点が範囲より後にある場合は 1 を返す。
intersects = range . intersectsNode(node)
range が次と交差するかどうかを返す: node。

この isPointInRange(node, offset) メソッドの手順は:

  1. node の 根 が this の 根 でない場合は、 false を返す。

  2. node が 文書型 である場合は、次を 投げる: "InvalidNodeTypeError" DOMException。

  3. offset が node の 長さ より大きい場合は、 投げる:"IndexSizeError" DOMException。

  4. (node, offset) が次より 前 にある場合: 始端、 または次より 後 にある場合:終端。次を返す: false。

  5. true を返す。

この comparePoint(node, offset) メソッドの手順は:

  1. node の 根 が this の 根 でない場合は、 次を 投げる:"WrongDocumentError" DOMException。

  2. node が 文書型 である場合は、次を 投げる: "InvalidNodeTypeError" DOMException。

  3. offset が node の 長さ より大きい場合は、 投げる:"IndexSizeError" DOMException。

  4. (node, offset) が次より 前 にある場合: 始端。−1 を返す。

  5. (node, offset) が次より 後 にある場合: 終端。その場合は、 1 を返す。

  6. 0 を返す。


この intersectsNode(node) メソッドの手順は:

  1. node の 根 が this の 根 でない場合は、 false を返す。

  2. parent を node の 親 とする。

  3. parent が null である場合は、true を返す。

  4. offset を node の インデックス とする。

  5. (parent, offset) が次より 前 にある場合: 終端、かつ (parent, offset + 1) が 後 にある場合(比較対象は 始端)、true を返す。

  6. false を返す。


この 文字列化の挙動 は、実行しなければならない: 次の手順を:

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

  2. もし this の 始端ノード が this の 終端ノード であり、かつ それが Text ノード である場合は、返す: 次の部分文字列を。その Text ノード の データ のうち、 開始位置は this の 始端オフセット とし、終了 位置は this の 終端オフセット とする。

  3. もし this の 始端ノード が Text ノード である場合は、追加する: その ノード の データ の部分文字列を。開始位置は this の 始端オフセット とし、末尾までとする。追加先は string とする。

  4. 次の 連結 の結果を追加する。連結するのは データ とし、その所属先はすべての Text ノード であって、包含されている ものとする。包含先は this とし、連結の順序は 木 順序、追加先は string とする。

  5. もし this の 終端ノード が Text ノード である場合は、 その ノード の データ の部分文字列を追加する。その先頭から this の 終端オフセット までとし、追加先は string とする。

  6. string を返す。


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

6. 走査

NodeIterator および TreeWalker オブジェクトを使用して、ノード ツリーをフィルタリングおよび走査できる。

各 NodeIterator および TreeWalker オブジェクトには、再帰的な呼び出しを防ぐための真偽値 アクティブであるが関連付けられている。これは 初期状態では false である。

各 NodeIterator および TreeWalker オブジェクトには、さらに関連付けられた ルート(ノード)、 whatToShow(ビットマスク)、および フィルター(コールバック)がある。

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

  1. traverser のアクティブであるが true の場合、 "InvalidStateError" DOMException を投げる。

  2. n を node のnodeType 属性値から 1 を引いた値とする。

  3. traverser のwhatToShow で、n番目のビット(0 を最下位ビットとする)が設定されていない場合、 FILTER_SKIP を返す。

  4. traverser のフィルターが null の場合、 FILTER_ACCEPT を返す。

  5. traverser のアクティブであるを true に設定する。

  6. result を、ユーザーオブジェクトの演算を呼び出した戻り値とする。その際、 traverser のフィルター、"acceptNode"、および « node » を指定する。これによって例外が投げられた場合、traverser の アクティブであるを false に設定し、その例外を再度投げる。

  7. traverser のアクティブであるを false に設定する。

  8. result を返す。

6.1. インターフェイス NodeIterator

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

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

  undefined detach();
};

NodeIterator オブジェクトは、 Document オブジェクトの createNodeIterator() メソッドを使用して作成できる。

各 NodeIterator オブジェクトには、 イテレーターコレクションが関連付けられている。これは、 NodeIterator オブジェクトのルートをルートとする コレクションであり、 そのフィルターはすべてのノードに一致する。

ノードポインターは、 ノード(ノード)と ポインターが前にある(真偽値)から構成される タプルである。

各 NodeIterator オブジェクトには、関連付けられた参照( ノードポインター)と候補参照(null または ノードポインターであり、初期値は null)もある。

前述のとおり、NodeIterator オブジェクトには、 アクティブ である、ルート、whatToShow、および フィルター も関連付けられている。

NodeIterator オブジェクト nodeIterator とノード toBeRemovedNode を指定した場合のNodeIterator の削除前手順は次のとおりである:

  1. nodeIterator の参照を、 nodeIterator の 参照、nodeIterator、および toBeRemovedNode を指定して ノードポインターを調整した結果に設定する。

  2. nodeIterator の候補参照が null でない場合、 nodeIterator の候補参照を、 nodeIterator の 候補参照、 nodeIterator、および toBeRemovedNode を指定して ノードポインターを調整した結果に設定する。


ノードポインター nodePointer、NodeIterator オブジェクト nodeIterator、およびノード toBeRemovedNode を指定してノードポインターを調整するには、次の手順を実行する。これらは ノードポインターを返す。

  1. toBeRemovedNode が nodePointer のノードの自身を含む祖先でないか、 toBeRemovedNode が nodeIterator のルートの自身を含む祖先である場合、 nodePointer を返す。

  2. nodePointer のポインターが前にあるが true の場合:

    1. next を、toBeRemovedNode に後続する最初の ノードのうち、 nodeIterator の ルートの自身を含む子孫であり、 toBeRemovedNode の自身を含む子孫ではないものとする。 そのようなノードがあればそれを使用し、それ以外の場合は null とする。

    2. next が null でない場合、(next, true) を返す。

  3. newNode を、toBeRemovedNode の 直前の兄弟が null の場合は toBeRemovedNode の親とし、それ以外の場合は toBeRemovedNode の直前の兄弟の 自身を含む子孫のうち、 ツリー順で最後に現れるものとする。

  4. (newNode, false) を返す。


この root 取得子の手順は、次を返すことである: this の 根。

この referenceNode 取得子の手順は、次を返すことである: this の 参照 の ノード。

この pointerBeforeReferenceNode 取得子の手順は、 次を返すことである:this の 参照 の ポインターが前にあるか。

この whatToShow 取得子の手順は、次を返すことである: this の whatToShow。

この filter 取得子の手順は、次を返すことである: this の フィルター。

次の手順で 走査する。与えられるものは、 NodeIterator オブジェクト iterator と、"next" または "previous" である type である:

  1. 設定する:iterator の 候補参照 を iterator の 参照 に。

  2. result を null とする。

  3. true の間、次を繰り返す:

    1. type が "next" である場合:

      1. iterator の 候補参照 の ポインターが前にあるか が false である場合:

        1. following を、次の条件を満たす最初の ノード とする:後続する対象が iterator の 候補 参照 の ノード であり、 iterator の イテレーターコレクション 内にある。そのような 条件を満たす ノード が存在しない場合は、反復を中断する。

        2. 設定する:iterator の 候補 参照 を (following, false) に。

      2. それ以外の場合は、設定する:iterator の 候補参照 を (iterator の 候補参照 の ノード, false) に。

    2. それ以外の場合:

      1. iterator の 候補参照 の ポインターが前にあるか が true である場合:

        1. preceding を、次の条件を満たす最初の ノード とする:先行する対象が iterator の 候補 参照 の ノード であり、 iterator の イテレーターコレクション 内にある。そのような 条件を満たす ノード が存在しない場合は、反復を中断する。

        2. 設定する:iterator の 候補 参照 を (preceding, true) に。

      2. それ以外の場合は、設定する:iterator の 候補参照 を (iterator の 候補参照 の ノード, true) に。

    3. node を次とする:iterator の 候補参照 の ノード。

    4. filterResult を次の結果とする:フィルター処理する: node を、次の中で: iterator。これが例外を投げた場合は、iterator の 候補参照 を null に設定し、 その例外を再度投げる。

    5. filterResult が FILTER_ACCEPT である場合:

      1. 設定する:iterator の 参照 を iterator の 候補参照 に。

      2. result を node に設定する。

      3. 反復を中断する。

  4. iterator の 候補参照 を null に設定する。

  5. result を返す。

この nextNode() メソッドの手順は、次の 結果を返すことである:走査(引数は this と "next")。

この previousNode() メソッドの手順は、次の 結果を返すことである:走査(引数は this と "previous")。

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

6.2. インターフェイス TreeWalker

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

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

TreeWalker オブジェクトは、createTreeWalker() メソッドを Document オブジェクトで使用して作成できる。

各 TreeWalker オブジェクトには、関連付けられた現在のノード( ノード)がある。

前述のとおり、TreeWalker オブジェクトには、 ルート、whatToShow、およびフィルターも関連付けられている。

この root 取得子の手順は、 this の 根 を返すことである。

この whatToShow 取得子の手順は、 this の whatToShow を返すことである。

この filter 取得子の手順は、 this の フィルター を返すことである。

この currentNode 取得子の手順は、 this の 現在のノード を返すことである。

この currentNode 設定子の手順は、this の 現在のノード を、 与えられた値に設定することである。


この parentNode() メソッドの手順は次のとおりである:

  1. node を this の 現在のノード とする。

  2. node が null でなく、かつ this の 根 でもない間、次を繰り返す:

    1. node を node の 親 に設定する。

    2. node が null でなく、次の フィルター処理(node を this 内で)が FILTER_ACCEPT を返す場合は、 次を設定する:this の 現在のノード を node に。その後、 node を返す。

  3. null を返す。

次の手順で 子を走査する。与えられるものは、 TreeWalker オブジェクト walker と、"first" または "last" である type である:

  1. node を walker の 現在のノード とする。

  2. node を node の 最初の子 に設定する(type が "first" である場合)。それ以外の場合は、node の 最後の子 に設定する。

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

    1. result を次の フィルター処理 の結果とする: node を、次の中で: walker。

    2. result が FILTER_ACCEPT である場合は、 次を設定する:walker の 現在のノード を node に。その後、 node を返す。

    3. result が FILTER_SKIP である場合:

      1. child を node の 最初の子 とする(type が "first" である場合)。それ以外の場合は、node の 最後の 子 とする。

      2. child が null でない場合は、node を child に設定し、 次の反復に進む。

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

      1. sibling を node の 次の同胞 とする( type が "first" である場合)。それ以外の場合は、node の 前の同胞 とする。

      2. sibling が null でない場合は、node を sibling に設定する。 その後、 反復を中断する。

      3. parent を node の 親 とする。

      4. parent が null、walker の 根、または walker の 現在のノード である場合は、null を返す。

      5. node を parent に設定する。

  4. null を返す。

この firstChild() メソッドの手順は、次を行うことである: 子を走査する(引数は this と "first")。

この lastChild() メソッドの手順は、次を行うことである: 子を走査する(引数は this と "last")。

次の手順で 走査する: 同胞。与えられるものは、TreeWalker オブジェクト walker と、"next" または "previous" である type である:

  1. node を walker の 現在のノード とする。

  2. node が 根 である場合は、null を返す。

  3. true の間、次を繰り返す:

    1. sibling を node の 次の 同胞 とする( type が "next" である場合)。それ以外の場合は、node の 前の同胞 とする。

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

      1. node を sibling に設定する。

      2. result を次の フィルター処理 の結果とする: node を、次の中で: walker。

      3. result が FILTER_ACCEPT である場合は、 次を設定する:walker の 現在のノード を node に。その後、 node を返す。

      4. sibling を node の 最初の子 に設定する( type が "next" である場合)。それ以外の場合は、node の 最後の子 に設定する。

      5. result が FILTER_REJECT であるか、 または sibling が null である場合は、 sibling を node の 次の同胞 に設定する(type の値が "next" である場合)。それ以外の場合は、node の 前の同胞 に設定する。

    3. node を node の 親 に設定する。

    4. node が null または walker の 根 である場合は、 次を返す: null。

    5. 次の フィルター処理(node を walker 内で)の返り値が FILTER_ACCEPT である場合は、null を返す。

この nextSibling() メソッドの手順は、次を行うことである: 同胞を走査する(引数は this と "next")。

この previousSibling() メソッドの手順は、次を行うことである: 同胞を走査する(引数は this と "previous")。

この previousNode() メソッドの手順は次のとおりである:

  1. node を this の 現在のノード とする。

  2. node が this の 根 でない間、次を繰り返す:

    1. sibling を node の 前の同胞 とする。

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

      1. node を sibling に設定する。

      2. result を次の フィルター処理 の結果とする: node を、次の中で: this。

      3. result が FILTER_REJECT でなく、 かつ node が 子 を持つ間、次を繰り返す:

        1. node を node の 最後の子 に設定する。

        2. result を次の結果に設定する:フィルター処理する:node を、 次の中で: this。

      4. result が FILTER_ACCEPT である場合は、 次を設定する:this の 現在のノード を node に。その後、 node を返す。

      5. sibling を node の 前の同胞 に設定する。

    3. node が this の 根 であるか、または node の 親 が null である場合は、null を返す。

    4. node を node の 親 に設定する。

    5. 次の フィルター処理(node を this 内で)の返り値が FILTER_ACCEPT である場合は、 次を設定する:this の 現在のノード を node に。その後、node を返す。

  3. null を返す。

この nextNode() メソッドの手順は次のとおりである:

  1. node を this の 現在のノード とする。

  2. result を FILTER_ACCEPT とする。

  3. true の間、次を繰り返す:

    1. result が FILTER_REJECT でなく、 かつ node が 子 を持つ間、次を繰り返す:

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

      2. result を次の フィルター処理 の結果に設定する: node を、次の中で: this。

      3. result が FILTER_ACCEPT である場合は、 次を設定する:this の 現在のノード を node に。その後、 node を返す。

    2. sibling を null とする。

    3. temporary を node とする。

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

      1. temporary が this の 根 である場合は、null を返す。

      2. sibling を temporary の 次の同胞 に設定する。

      3. sibling が null でない場合は、反復を中断する。

      4. temporary を temporary の 親 に設定する。

    5. sibling が null である場合は、null を返す。

    6. node を sibling に設定する。

    7. result を次の フィルター処理 の結果に設定する: node を、次の中で: this。

    8. result が FILTER_ACCEPT である場合は、 次を設定する:this の 現在のノード を node に。その後、 node を返す。

6.3. インターフェイス NodeFilter

[Exposed=Window]
callback interface NodeFilter {
  // Constants for acceptNode()
  const unsigned short FILTER_ACCEPT = 1;
  const unsigned short FILTER_REJECT = 2;
  const unsigned short FILTER_SKIP = 3;

  // Constants for whatToShow
  const unsigned long SHOW_ALL = 0xFFFFFFFF;
  const unsigned long SHOW_ELEMENT = 0x1;
  const unsigned long SHOW_ATTRIBUTE = 0x2;
  const unsigned long SHOW_TEXT = 0x4;
  const unsigned long SHOW_CDATA_SECTION = 0x8;
  const unsigned long SHOW_ENTITY_REFERENCE = 0x10; // legacy
  const unsigned long SHOW_ENTITY = 0x20; // legacy
  const unsigned long SHOW_PROCESSING_INSTRUCTION = 0x40;
  const unsigned long SHOW_COMMENT = 0x80;
  const unsigned long SHOW_DOCUMENT = 0x100;
  const unsigned long SHOW_DOCUMENT_TYPE = 0x200;
  const unsigned long SHOW_DOCUMENT_FRAGMENT = 0x400;
  const unsigned long SHOW_NOTATION = 0x800; // legacy

  unsigned short acceptNode(Node node);
};

NodeFilter オブジェクトは、filterとして NodeIterator や TreeWalker オブジェクトで利用でき、さらに 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 オブジェクト set の、指定された token に対する 検証手順 は次のとおりである。

  1. set の 要素 と 属性名 に対して サポートされるトークン が定義されていなければ、 TypeError を スローする。

  2. lowercaseToken を、token を ASCII 小文字化 したものとする。

  3. lowercaseToken が、set の 要素 と 属性 名 に対する サポートされるトークン に含まれる場合、 true を返す。

  4. false を返す。

DOMTokenList オブジェクト set の 更新手順 は次のとおりである。

  1. null、set の 属性名、および set の 要素 を指定して 名前空間と ローカル名で属性を取得する 処理が null を返し、かつ set の トークン集合 が空であれば、返る。

  2. set の 要素、 set の 属性名、および set の トークン 集合 に対して 順序付き集合直列化器 を実行した結果を指定して、 属性値を設定する。

DOMTokenList オブジェクト set の 直列化手順 は、 set の 要素 と set の 属性名 を指定して 属性値を取得する 処理の結果を返すことである。


DOMTokenList オブジェクト set には、その set の 要素 に対して、次の 属性変更手順 がある。

  1. localName が set の 属性 名 であり、 namespace が null、かつ value が null であれば、 set の トークン 集合 を 空にする。

  2. それ以外の場合、localName が set の 属性名 であり、namespace が null であれば、set の トークン 集合 を value を 解析した 結果に設定する。

DOMTokenList オブジェクト set が作成されたとき、次を実行する。

  1. element を set の 要素 とする。

  2. attributeName を set の 属性 名 とする。

  3. value を、element と attributeName を指定して 属性値を取得する 処理の結果とする。

  4. element、attributeName、 value、value、および null を用いて 属性変更手順 を実行する。

tokenlist . length

トークンの数を返す。

tokenlist . item(index)
tokenlist[index]

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

tokenlist . contains(token)

token が存在すれば true、それ以外の場合は false を返す。

tokenlist . add(tokens…)

渡されたすべての引数を、すでに存在するものを除いて追加する。

いずれかの引数が空 文字列であれば、"SyntaxError" DOMException をスローする。

いずれかの引数に ASCII 空白文字 が含まれていれば、"InvalidCharacterError" DOMException をスローする。

tokenlist . remove(tokens…)

渡された引数が存在する場合、それらを削除する。

いずれかの引数が空 文字列であれば、"SyntaxError" DOMException をスローする。

いずれかの引数に ASCII 空白文字 が含まれていれば、"InvalidCharacterError" DOMException をスローする。

tokenlist . toggle(token [, force])

force が指定されていなければ、token を「切り替える」。存在する場合は削除し、 存在しない場合は追加する。force が true であれば、token を追加する (add() と同じ)。 force が false であれば、token を削除する( remove() と同じ)。

token が現在存在すれば true、それ以外の場合は false を返す。

token が空であれば、"SyntaxError" DOMException をスローする。

token に空白文字が 含まれていれば、"InvalidCharacterError" DOMException をスローする。

tokenlist . replace(token, newToken)

token を newToken に置換する。

token が newToken に置換された場合は true、それ以外の場合は false を返す。

いずれかの引数が空 文字列であれば、"SyntaxError" DOMException をスローする。

いずれかの引数に ASCII 空白文字 が含まれていれば、"InvalidCharacterError" DOMException をスローする。

tokenlist . supports(token)

token が関連付けられた属性のサポートされるトークンに含まれていれば true、 それ以外の場合は false を返す。

関連付けられた属性にサポートされるトークンが定義されていなければ、TypeError をスローする。

tokenlist . value

関連付けられた集合を文字列として返す。

関連付けられた属性を変更するために設定できる。

この length 取得子の手順は、 this の トークン集合 の サイズ を返すことである。

このオブジェクトの サポートするプロパティインデックス は、次の範囲の数である: 0 から、このオブジェクトの トークン集合 の サイズ − 1 まで。ただし、トークン集合 が 空で ある 場合には、サポートするプロパティインデックス は存在しない。

この item(index) メソッドの手順は次のとおりである:

  1. index が this の トークン 集合 の サイズ 以上である場合は、null を返す。

  2. this の トークン集合[index] を返す。

この contains(token) メソッドの手順は、 true を返すことである(this の トークン集合[token] が 存在する場合)。それ以外の場合は、 false を返す。

この add(tokens…) メソッドの手順は次のとおりである:

  1. 各 token(tokens 内)に対して:

    1. token が空文字列である場合は、投げる: 次の "SyntaxError" DOMException。

    2. token がいずれかの ASCII 空白 を含む場合は、投げる: 次の "InvalidCharacterError" DOMException。

  2. 各 token(tokens 内)に対して:追加する: token を this の トークン集合 に。

  3. この 更新 手順 を実行する。

この remove(tokens…) メソッドの手順は次のとおりである:

  1. 各 token(tokens 内)に対して:

    1. token が空文字列である場合は、投げる: 次の "SyntaxError" DOMException。

    2. token がいずれかの ASCII 空白 を含む場合は、投げる: 次の "InvalidCharacterError" DOMException。

  2. 各 token(tokens 内)に対して:除去する: token を this の トークン集合 から。

  3. この 更新手順 を実行する。

この toggle(token, force) メソッドの手順は次のとおりである:

  1. token が空文字列である場合は、投げる:次の "SyntaxError" DOMException。

  2. token がいずれかの ASCII 空白 を含む場合は、投げる:次の "InvalidCharacterError" DOMException。

  3. this の トークン集合[token] が 存在する場合:

    1. force が与えられていないか、または false である場合は、除去する: token を this の トークン集合 から。その後、更新手順 を実行し、 次を返す: false。

    2. true を返す。

  4. それ以外の場合、force が与えられていないか、または true であるなら、追加する: token を this の トークン集合 に。その後、更新手順 を実行し、 true を返す。

  5. false を返す。

この 更新手順 は、toggle() では、ウェブ互換性のために常に実行されるわけではない。

この replace(token, newToken) メソッドの手順は次のとおりである:

  1. token または newToken のいずれかが空文字列である場合は、投げる:次の "SyntaxError" DOMException。

  2. token または newToken のいずれかが、いずれかの ASCII 空白 を含む場合は、 投げる:次の "InvalidCharacterError" DOMException。

  3. this の トークン集合 が次を 含まない場合: token。その場合は、 false を返す。

  4. 置換する:token(this の トークン 集合 内)を newToken に。

  5. この 更新手順 を実行する。

  6. true を返す。

この 更新手順 は、replace() では、ウェブ互換性のために常に実行されるわけではない。

この supports(token) メソッドの手順は次のとおりである:

  1. result を 検証手順 の返り値とする(引数は token)。

  2. result を返す。

この value 取得子の手順は、次の 実行結果を返すことである:this の 直列化手順。

この value 設定子の手順は、次を行うことである: 属性値を設定する:this の 要素 に。 使用するのは、this の 属性名 と与えられた値である。

8. XPath

DOM Level 3 XPathはXPath 1.0 式の評価APIを定義しました。これらのAPIは広く実装されていますが、保守されていません。インターフェイス定義はWeb IDLの変更時に更新できるようここで維持されています。 これらAPIの完全な定義は依然必要であり、その作業はwhatwg/dom#67で追跡およびコントリビュートできます。 [DOM-Level-3-XPath] [XPath] [WEBIDL]

8.1. インターフェイス XPathResult

[Exposed=Window]
interface XPathResult {
  const unsigned short ANY_TYPE = 0;
  const unsigned short NUMBER_TYPE = 1;
  const unsigned short STRING_TYPE = 2;
  const unsigned short BOOLEAN_TYPE = 3;
  const unsigned short UNORDERED_NODE_ITERATOR_TYPE = 4;
  const unsigned short ORDERED_NODE_ITERATOR_TYPE = 5;
  const unsigned short UNORDERED_NODE_SNAPSHOT_TYPE = 6;
  const unsigned short ORDERED_NODE_SNAPSHOT_TYPE = 7;
  const unsigned short ANY_UNORDERED_NODE_TYPE = 8;
  const unsigned short FIRST_ORDERED_NODE_TYPE = 9;

  readonly attribute unsigned short resultType;
  readonly attribute unrestricted double numberValue;
  readonly attribute DOMString stringValue;
  readonly attribute boolean booleanValue;
  readonly attribute Node? singleNodeValue;
  readonly attribute boolean invalidIteratorState;
  readonly attribute unsigned long snapshotLength;

  Node? iterateNext();
  Node? snapshotItem(unsigned long index);
};

8.2. インターフェイス XPathExpression

[Exposed=Window]
interface XPathExpression {
  // XPathResult.ANY_TYPE = 0
  XPathResult evaluate(Node contextNode, optional unsigned short type = 0, optional XPathResult? result = null);
};

8.3. ミックスイン XPathEvaluatorBase

callback interface XPathNSResolver {
  DOMString? lookupNamespaceURI(DOMString? prefix);
};

interface mixin XPathEvaluatorBase {
  [NewObject] XPathExpression createExpression(DOMString expression, optional XPathNSResolver? resolver = null);
  Node createNSResolver(Node nodeResolver); // legacy
  // XPathResult.ANY_TYPE = 0
  XPathResult evaluate(DOMString expression, Node contextNode, optional XPathNSResolver? resolver = null, optional unsigned short type = 0, optional XPathResult? result = null);
};
Document includes XPathEvaluatorBase;

createNSResolver(nodeResolver) メソッド手順はnodeResolverを返すこと。

このメソッドは歴史的理由で存在しています。

8.4. インターフェイス XPathEvaluator

[Exposed=Window]
interface XPathEvaluator {
  constructor();
};

XPathEvaluator includes XPathEvaluatorBase;

歴史的な理由により、XPathEvaluator を構築することも、Document で同じ メソッドにアクセスすることもできる。

9. XSLT

ブラウザーではクライアント側 XSLT を使用しないでください。ブラウザーの XSLT 実装は メモリ安全性の脆弱性が非常に生じやすく、ウェブプラットフォームは安全な代替手段として JavaScript を使用する方向へ進化してきました。これらの理由により、この機能はウェブプラットフォームから 削除される過程にあります。(これは何年もかかる長いプロセスです。)

XSL Transformations (XSLT)はXML文書を他のXML文書に変換する言語です。 この章で定義されているAPIは広く実装されており、Web IDLの変更時に更新できるようここで維持されています。APIの完全な定義は依然として必要であり、その作業は whatwg/dom#181で追跡およびコントリビュート可能です。 [XSLT]

9.1. インターフェイス XSLTProcessor

[Exposed=Window]
interface XSLTProcessor {
  constructor();
  undefined importStylesheet(Node style);
  [CEReactions] DocumentFragment transformToFragment(Node source, Document output);
  [CEReactions] Document transformToDocument(Node source);
  undefined setParameter([LegacyNullToEmptyString] DOMString namespaceURI, DOMString localName, any value);
  any getParameter([LegacyNullToEmptyString] DOMString namespaceURI, DOMString localName);
  undefined removeParameter([LegacyNullToEmptyString] DOMString namespaceURI, DOMString localName);
  undefined clearParameters();
  undefined reset();
};

10. セキュリティとプライバシーの考慮事項

この標準には、既知のセキュリティやプライバシーの考慮事項はありません。

11. 歴史的事項

この標準には、かつて含まれていたが削除された複数のインターフェイスやインターフェイスメンバーがあります。

以下のインターフェイスは削除されました:

また、以下のインターフェイスメンバーが削除されました:

Attr
  • schemaTypeInfo
  • isId
Document
  • createEntityReference()
  • xmlEncoding
  • xmlStandalone
  • xmlVersion
  • strictErrorChecking
  • domConfig
  • normalizeDocument()
  • renameNode()
DocumentType
  • entities
  • notations
  • internalSubset
DOMImplementation
  • getFeature()
Element
  • schemaTypeInfo
  • setIdAttribute()
  • setIdAttributeNS()
  • setIdAttributeNode()
Node
  • isSupported
  • getFeature()
  • getUserData()
  • setUserData()
NodeIterator
  • expandEntityReferences
Text
  • isElementContentWhitespace
  • replaceWholeText()
TreeWalker
  • expandEntityReferences

謝辞

DOM の相互運用性向上に長年にわたり貢献してくださった多くの方々に感謝します。同様に、この標準が今日の形となるまで支えてくださった方々にも感謝いたします。

以下の皆様に心より感謝いたします: Adam Klein、 Adrian Bateman、 Ahmid snuggs、 Alex Komoroske、 Alex Russell、 Alexey Shvayka、 Andreas Kling、 Andreu Botella、 Anthony Ramine、 Arkadiusz Michalski、 Armen Michaeli、 Arnaud Le Hors、 Arun Ranganathan、 Benjamin Gruenbaum、 Björn Höhrmann、 Boris Zbarsky、 Brandon Payton、 Brandon Slade、 Brandon Wallace、 Brian Kardell、 C. Scott Ananian、 Cameron McCormack、 Chris Dumez、 Chris Paris、 Chris Rebert、 Cyrille Tuzi、 Dan Burzo、 Daniel Clark、 Daniel Glazman、 Darien Maillet Valentine、 Darin Fisher、 David Baron、 David Bruant、 David Flanagan、 David Håsäther、 David Hyatt、 Deepak Sherveghar、 Dethe Elza、 Dimitri Glazkov、 Domenic Denicola、 Dominic Cooney、 Dominique Hazaël-Massieux、 Don Jordan、 Doug Schepers、 Edgar Chen、 Elisée Maurer、 Elliott Sprehn、 Emilio Cobos Álvarez、 Eric Bidelman、 Erik Arvidsson、 Evgeny Kapun、 François Daoust、 François Remy、 Gary Kacmarcik、 Gavin Nicol、 Giorgio Liscio、 Glen Huang、 Glenn Adams、 Glenn Maynard、 Hajime Morrita、 Harald Alvestrand、 Hayato Ito、 Henri Sivonen、 Hongchan Choi、 Hunan Rostomyan、 Ian Hickson、 Igor Bukanov、 Jacob Rossi、 Jake Archibald、 Jake Verbaten、 James Graham、 James Greene、 James M Snell、 James Robinson、 Jayson Chen、 Jeffrey Yasskin、 Jens Lindström、 Jeremy Davis、 Jesse McCarthy、 Jinho Bang、 João Eiras、 Joe Kesselman、 John Atkins、 John Dai、 Jonas Sicking、 Jonathan Kingston、 Jonathan Robie、 Joris van der Wel、 Joshua Bell、 J. S. Choi、 Jungkee Song、 Justin Summerlin、 Kagami Sascha Rosylight、 呂康豪 (Kang-Hao Lu)、 田村健人 (Kent TAMURA)、 Kevin J. Sung、 Kevin Sweeney、 Kirill Topolyan、 Koji Ishii、 Lachlan Hunt、 Lauren Wood、 Luca Casonato、 Luke Zielinski、 Magne Andersson、 Majid Valipour、 Malte Ubl、 Manish Goregaokar、 Manish Tripathi、 Marcos Caceres、 Mark Miller、 Martijn van der Ven、 Mason Freed、 Mats Palmgren、 Mounir Lamouri、 Michael Stramel、 Michael™ Smith、 Mike Champion、 Mike Taylor、 Mike West、 Nicolás Peña Moreno、 Nidhi Jaju、 Ojan Vafai、 Oliver Nightingale、 Olli Pettay、 Ondřej Žára、 Peter Sharpe、 Philip Jägenstedt、 Philippe Le Hégaret、 Piers Wombwell、 Pierre-Marie Dartus、 prosody—Gab Vereable Context(、 Rafael Weinstein、 Rakina Zata Amni、 Richard Bradshaw、 Rick Byers、 Rick Waldron、 Robbert Broersma、 Robin Berjon、 Roland Steiner、 Rune F. Halvorsen、 Russell Bicknell、 Ruud Steltenpool、 Ryosuke Niwa、 Sam Dutton、 Sam Sneddon、 Samuel Giles、 Sanket Joshi、 Scott Haseley、 Sebastian Mayr、 Seo Sanghyeon、 Sergey G. Grekhov、 Shiki Okasaka、 Shinya Kawanaka、 Simon Pieters、 Simon Wülker、 Stef Busking、 Steve Byrne、 Steven Obiajulu、 Stig Halvorsen、 Tab Atkins、 Takashi Sakamoto、 Takayoshi Kochi、 Theresa O’Connor、 Theodore Dubois、 timeless、 Timo Tijhof、 Tobie Langel、 Tom Pixley、 Travis Leithead、 Trevor Rowbotham、 triple-underscore、 Tristan Fraipont、 Veli Şenol、 Vidur Apparao、 Warren He、 Xidorn Quan、 Yash Handa、 Yehuda Katz、 Yoav Weiss、 Yoichi Osato、 Yoshinori Sano、 Yu Han、 Yusuke Abe、 Zack Weinberg の皆様、素晴らしいご協力ありがとうございました!

この標準は Anne van Kesteren (Apple, 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. Console標準。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. Encoding標準。Living Standard。URL: https://encoding.spec.whatwg.org/
[HR-TIME-3]
Yoav Weiss. 高精度タイム。URL: https://w3c.github.io/hr-time/
[HTML]
Anne van Kesteren; et al. HTML標準。Living Standard。URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra標準。Living Standard。URL: https://infra.spec.whatwg.org/
[LONG-ANIMATION-FRAMES]
Noam Rosenthal. Long Animation Frames API。URL: https://w3c.github.io/long-animation-frames/
[POINTEREVENTS3]
Patrick Lauke; Robert Flack. ポインターイベント。URL: https://w3c.github.io/pointerevents/
[SELECTORS4]
Elika Etemad; Tab Atkins Jr.. セレクター レベル4。URL: https://drafts.csswg.org/selectors/
[SERVICE-WORKERS]
Monica CHINTALA; Yoshisato Yanagisawa. Service 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]
Xiaoqian Wu. UIイベント。URL: https://w3c.github.io/uievents/
[URL]
Anne van Kesteren. URL標準。Living Standard。URL: https://url.spec.whatwg.org/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL標準。Living Standard。URL: https://webidl.spec.whatwg.org/
[XML]
Tim Bray; et al. 拡張可能マークアップ言語(XML)1.0(第五版)。2008年11月26日。REC。URL: https://www.w3.org/TR/xml/
[XML-NAMES]
Tim Bray; et al. XMLの名前空間 1.0(第三版)。2009年12月8日。REC。URL: https://www.w3.org/TR/xml-names/
[XML-STYLESHEET]
James Clark; Simon Pieters; Henry Thompson. XML文書へのスタイルシートの関連付け 1.0 (第2版). 2010年10月28日. REC. URL: https://www.w3.org/TR/xml-stylesheet/

参考情報

[CSSOM-VIEW]
Simon Fraser; Emilio Cobos Álvarez. CSSOM ビューモジュール. URL: https://drafts.csswg.org/cssom-view/
[DOM-Level-3-XPath]
Ray Whitmer. ドキュメントオブジェクトモデル (DOM) レベル3 XPath仕様. 2020年11月3日. NOTE. URL: https://www.w3.org/TR/DOM-Level-3-XPath/
[DOM-Parsing]
Travis Leithead. DOMパースおよびシリアライズ. URL: https://w3c.github.io/DOM-Parsing/
[FULLSCREEN]
Philip Jägenstedt. フルスクリーンAPI標準. Living Standard. URL: https://fullscreen.spec.whatwg.org/
[INDEXEDDB]
Nikunj Mehta; et al. インデックス付きデータベースAPI. URL: https://w3c.github.io/IndexedDB/
[XPath]
James Clark; Steven DeRose. XMLパス言語 (XPath) バージョン1.0. 1999年11月16日. REC. URL: https://www.w3.org/TR/xpath-10/
[XSLT]
James Clark. XSL変換 (XSLT) バージョン1.0. 1999年11月16日. REC. URL: https://www.w3.org/TR/xslt-10/

IDL 索引

[Exposed=*]
interface Event {
  constructor(DOMString type, optional EventInit eventInitDict = {});

  readonly attribute DOMString type;
  readonly attribute EventTarget? target;
  readonly attribute EventTarget? srcElement; // legacy
  readonly attribute EventTarget? currentTarget;
  sequence<EventTarget> composedPath();

  const unsigned short NONE = 0;
  const unsigned short CAPTURING_PHASE = 1;
  const unsigned short AT_TARGET = 2;
  const unsigned short BUBBLING_PHASE = 3;
  readonly attribute unsigned short eventPhase;

  undefined stopPropagation();
           attribute boolean cancelBubble; // legacy alias of .stopPropagation()
  undefined stopImmediatePropagation();

  readonly attribute boolean bubbles;
  readonly attribute boolean cancelable;
           attribute boolean returnValue;  // legacy
  undefined preventDefault();
  readonly attribute boolean defaultPrevented;
  readonly attribute boolean composed;

  [LegacyUnforgeable] readonly attribute boolean isTrusted;
  readonly attribute DOMHighResTimeStamp timeStamp;

  undefined initEvent(DOMString type, optional boolean bubbles = false, optional boolean cancelable = false); // legacy
};

dictionary EventInit {
  boolean bubbles = false;
  boolean cancelable = false;
  boolean composed = false;
};

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

[Exposed=*]
interface CustomEvent : Event {
  constructor(DOMString type, optional CustomEventInit eventInitDict = {});

  readonly attribute any detail;

  undefined initCustomEvent(DOMString type, optional boolean bubbles = false, optional boolean cancelable = false, optional any detail = null); // legacy
};

dictionary CustomEventInit : EventInit {
  any detail = null;
};

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

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

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

dictionary EventListenerOptions {
  boolean capture = false;
};

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

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

  [SameObject] readonly attribute AbortSignal signal;

  undefined abort(optional any reason);
};

[Exposed=*]
interface AbortSignal : EventTarget {
  [NewObject] static AbortSignal abort(optional any reason);
  [Exposed=(Window,Worker), NewObject] static AbortSignal timeout([EnforceRange] unsigned long long milliseconds);
  [NewObject] static AbortSignal _any(sequence<AbortSignal> signals);

  readonly attribute boolean aborted;
  readonly attribute any reason;
  undefined throwIfAborted();

  attribute EventHandler onabort;
};
interface mixin NonElementParentNode {
  Element? getElementById(DOMString elementId);
};
Document includes NonElementParentNode;
DocumentFragment includes NonElementParentNode;

interface mixin DocumentOrShadowRoot {
  readonly attribute CustomElementRegistry? customElementRegistry;
};
Document includes DocumentOrShadowRoot;
ShadowRoot includes DocumentOrShadowRoot;

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

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

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

  Element? querySelector(DOMString selectors);
  [NewObject] NodeList querySelectorAll(DOMString selectors);
};
Document includes ParentNode;
DocumentFragment includes ParentNode;
Element includes ParentNode;

interface mixin NonDocumentTypeChildNode {
  readonly attribute Element? previousElementSibling;
  readonly attribute Element? nextElementSibling;
};
Element includes NonDocumentTypeChildNode;
CharacterData includes NonDocumentTypeChildNode;

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

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

[Exposed=Window]
interface NodeList {
  getter Node? item(unsigned long index);
  readonly attribute unsigned long length;
  iterable<Node>;
};

[Exposed=Window, LegacyUnenumerableNamedProperties]
interface HTMLCollection {
  readonly attribute unsigned long length;
  getter Element? item(unsigned long index);
  getter Element? namedItem(DOMString name);
};

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

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

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

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

[Exposed=Window]
interface MutationRecord {
  readonly attribute DOMString type;
  [SameObject] readonly attribute Node target;
  [SameObject] readonly attribute NodeList addedNodes;
  [SameObject] readonly attribute NodeList removedNodes;
  readonly attribute Node? previousSibling;
  readonly attribute Node? nextSibling;
  readonly attribute DOMString? attributeName;
  readonly attribute DOMString? attributeNamespace;
  readonly attribute DOMString? oldValue;
};

[Exposed=Window]
interface Node : EventTarget {
  const unsigned short ELEMENT_NODE = 1;
  const unsigned short ATTRIBUTE_NODE = 2;
  const unsigned short TEXT_NODE = 3;
  const unsigned short CDATA_SECTION_NODE = 4;
  const unsigned short ENTITY_REFERENCE_NODE = 5; // legacy
  const unsigned short ENTITY_NODE = 6; // legacy
  const unsigned short PROCESSING_INSTRUCTION_NODE = 7;
  const unsigned short COMMENT_NODE = 8;
  const unsigned short DOCUMENT_NODE = 9;
  const unsigned short DOCUMENT_TYPE_NODE = 10;
  const unsigned short DOCUMENT_FRAGMENT_NODE = 11;
  const unsigned short NOTATION_NODE = 12; // legacy
  readonly attribute unsigned short nodeType;
  readonly attribute DOMString nodeName;

  readonly attribute USVString baseURI;

  readonly attribute boolean isConnected;
  readonly attribute Document? ownerDocument;
  Node getRootNode(optional GetRootNodeOptions options = {});
  readonly attribute Node? parentNode;
  readonly attribute Element? parentElement;
  boolean hasChildNodes();
  [SameObject] readonly attribute NodeList childNodes;
  readonly attribute Node? firstChild;
  readonly attribute Node? lastChild;
  readonly attribute Node? previousSibling;
  readonly attribute Node? nextSibling;

  [CEReactions] attribute DOMString? nodeValue;
  [CEReactions] attribute DOMString? textContent;
  [CEReactions] undefined normalize();

  [CEReactions, NewObject] Node cloneNode(optional boolean subtree = false);
  boolean isEqualNode(Node? otherNode);
  boolean isSameNode(Node? otherNode); // legacy alias of ===

  const unsigned short DOCUMENT_POSITION_DISCONNECTED = 0x01;
  const unsigned short DOCUMENT_POSITION_PRECEDING = 0x02;
  const unsigned short DOCUMENT_POSITION_FOLLOWING = 0x04;
  const unsigned short DOCUMENT_POSITION_CONTAINS = 0x08;
  const unsigned short DOCUMENT_POSITION_CONTAINED_BY = 0x10;
  const unsigned short DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 0x20;
  unsigned short compareDocumentPosition(Node other);
  boolean contains(Node? other);

  DOMString? lookupPrefix(DOMString? namespace);
  DOMString? lookupNamespaceURI(DOMString? prefix);
  boolean isDefaultNamespace(DOMString? namespace);

  [CEReactions] Node insertBefore(Node node, Node? child);
  [CEReactions] Node appendChild(Node node);
  [CEReactions] Node replaceChild(Node node, Node child);
  [CEReactions] Node removeChild(Node child);
};

dictionary GetRootNodeOptions {
  boolean composed = false;
};

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

  [SameObject] readonly attribute DOMImplementation implementation;
  readonly attribute USVString URL;
  readonly attribute USVString documentURI;
  readonly attribute DOMString compatMode;
  readonly attribute DOMString characterSet;
  readonly attribute DOMString charset; // legacy alias of .characterSet
  readonly attribute DOMString inputEncoding; // legacy alias of .characterSet
  readonly attribute DOMString contentType;

  readonly attribute DocumentType? doctype;
  readonly attribute Element? documentElement;
  HTMLCollection getElementsByTagName(DOMString qualifiedName);
  HTMLCollection getElementsByTagNameNS(DOMString? namespace, DOMString localName);
  HTMLCollection getElementsByClassName(DOMString classNames);

  [CEReactions, NewObject] Element createElement(DOMString localName, optional (DOMString or ElementCreationOptions) options = {});
  [CEReactions, NewObject] Element createElementNS(DOMString? namespace, DOMString qualifiedName, optional (DOMString or ElementCreationOptions) options = {});
  [NewObject] DocumentFragment createDocumentFragment();
  [NewObject] Text createTextNode(DOMString data);
  [NewObject] CDATASection createCDATASection(DOMString data);
  [NewObject] Comment createComment(DOMString data);
  [NewObject] ProcessingInstruction createProcessingInstruction(DOMString target, DOMString data);

  [CEReactions, NewObject] Node importNode(Node node, optional (boolean or ImportNodeOptions) options = false);
  [CEReactions] Node adoptNode(Node node);

  [NewObject] Attr createAttribute(DOMString localName);
  [NewObject] Attr createAttributeNS(DOMString? namespace, DOMString qualifiedName);

  [NewObject] Event createEvent(DOMString interface); // legacy

  [NewObject] Range createRange();

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

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

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

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

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

  boolean hasFeature(); // historical; always returns true
};

[Exposed=Window]
interface DocumentType : Node {
  readonly attribute DOMString name;
  readonly attribute DOMString publicId;
  readonly attribute DOMString systemId;
};

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

[Exposed=Window]
interface ShadowRoot : DocumentFragment {
  readonly attribute ShadowRootMode mode;
  readonly attribute boolean delegatesFocus;
  readonly attribute boolean serializable;
  readonly attribute SlotAssignmentMode slotAssignment;
  readonly attribute boolean clonable;
  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;
  boolean serializable = false;
  SlotAssignmentMode slotAssignment = "named";
  boolean clonable = false;
  CustomElementRegistry? customElementRegistry;
};

[Exposed=Window,
 LegacyUnenumerableNamedProperties]
interface NamedNodeMap {
  readonly attribute unsigned long length;
  getter Attr? item(unsigned long index);
  getter Attr? getNamedItem(DOMString qualifiedName);
  Attr? getNamedItemNS(DOMString? namespace, DOMString localName);
  [CEReactions] Attr? setNamedItem(Attr attr);
  [CEReactions] Attr? setNamedItemNS(Attr attr);
  [CEReactions] Attr removeNamedItem(DOMString qualifiedName);
  [CEReactions] Attr removeNamedItemNS(DOMString? namespace, DOMString localName);
};

[Exposed=Window]
interface Attr : Node {
  readonly attribute DOMString? namespaceURI;
  readonly attribute DOMString? prefix;
  readonly attribute DOMString localName;
  readonly attribute DOMString name;
  [CEReactions] attribute DOMString value;

  readonly attribute Element? ownerElement;

  readonly attribute boolean specified; // historical; always returns true
};
[Exposed=Window]
interface CharacterData : Node {
  attribute [LegacyNullToEmptyString] DOMString data;
  readonly attribute unsigned long length;
  DOMString substringData(unsigned long offset, unsigned long count);
  undefined appendData(DOMString data);
  undefined insertData(unsigned long offset, DOMString data);
  undefined deleteData(unsigned long offset, unsigned long count);
  undefined replaceData(unsigned long offset, unsigned long count, DOMString data);
};

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

  [NewObject] Text splitText(unsigned long offset);
  readonly attribute DOMString wholeText;
};

[Exposed=Window]
interface CDATASection : Text {
};
[Exposed=Window]
interface ProcessingInstruction : CharacterData {
  constructor(DOMString target, optional DOMString data = "");

  readonly attribute DOMString target;

  boolean hasAttributes();
  sequence<DOMString> getAttributeNames();
  DOMString? getAttribute(DOMString name);
  undefined setAttribute(DOMString name, DOMString value);
  undefined removeAttribute(DOMString name);
  boolean toggleAttribute(DOMString name, optional boolean force);
  boolean hasAttribute(DOMString name);
};
[Exposed=Window]
interface Comment : CharacterData {
  constructor(optional DOMString data = "");
};

[Exposed=Window]
interface AbstractRange {
  readonly attribute Node startContainer;
  readonly attribute unsigned long startOffset;
  readonly attribute Node endContainer;
  readonly attribute unsigned long endOffset;
  readonly attribute boolean collapsed;
};

dictionary StaticRangeInit {
  required Node startContainer;
  required unsigned long startOffset;
  required Node endContainer;
  required unsigned long endOffset;
};

[Exposed=Window]
interface StaticRange : AbstractRange {
  constructor(StaticRangeInit init);
};

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

  readonly attribute Node commonAncestorContainer;

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

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

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

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

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

  boolean intersectsNode(Node node);

  stringifier;
};

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

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

  undefined detach();
};

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

  Node? parentNode();
  Node? firstChild();
  Node? lastChild();
  Node? previousSibling();
  Node? nextSibling();
  Node? previousNode();
  Node? nextNode();
};
[Exposed=Window]
callback interface NodeFilter {
  // Constants for acceptNode()
  const unsigned short FILTER_ACCEPT = 1;
  const unsigned short FILTER_REJECT = 2;
  const unsigned short FILTER_SKIP = 3;

  // Constants for whatToShow
  const unsigned long SHOW_ALL = 0xFFFFFFFF;
  const unsigned long SHOW_ELEMENT = 0x1;
  const unsigned long SHOW_ATTRIBUTE = 0x2;
  const unsigned long SHOW_TEXT = 0x4;
  const unsigned long SHOW_CDATA_SECTION = 0x8;
  const unsigned long SHOW_ENTITY_REFERENCE = 0x10; // legacy
  const unsigned long SHOW_ENTITY = 0x20; // legacy
  const unsigned long SHOW_PROCESSING_INSTRUCTION = 0x40;
  const unsigned long SHOW_COMMENT = 0x80;
  const unsigned long SHOW_DOCUMENT = 0x100;
  const unsigned long SHOW_DOCUMENT_TYPE = 0x200;
  const unsigned long SHOW_DOCUMENT_FRAGMENT = 0x400;
  const unsigned long SHOW_NOTATION = 0x800; // legacy

  unsigned short acceptNode(Node node);
};

[Exposed=Window]
interface DOMTokenList {
  readonly attribute unsigned long length;
  getter DOMString? item(unsigned long index);
  boolean contains(DOMString token);
  [CEReactions] undefined add(DOMString... tokens);
  [CEReactions] undefined remove(DOMString... tokens);
  [CEReactions] boolean toggle(DOMString token, optional boolean force);
  [CEReactions] boolean replace(DOMString token, DOMString newToken);
  boolean supports(DOMString token);
  [CEReactions] stringifier attribute DOMString value;
  iterable<DOMString>;
};

[Exposed=Window]
interface XPathResult {
  const unsigned short ANY_TYPE = 0;
  const unsigned short NUMBER_TYPE = 1;
  const unsigned short STRING_TYPE = 2;
  const unsigned short BOOLEAN_TYPE = 3;
  const unsigned short UNORDERED_NODE_ITERATOR_TYPE = 4;
  const unsigned short ORDERED_NODE_ITERATOR_TYPE = 5;
  const unsigned short UNORDERED_NODE_SNAPSHOT_TYPE = 6;
  const unsigned short ORDERED_NODE_SNAPSHOT_TYPE = 7;
  const unsigned short ANY_UNORDERED_NODE_TYPE = 8;
  const unsigned short FIRST_ORDERED_NODE_TYPE = 9;

  readonly attribute unsigned short resultType;
  readonly attribute unrestricted double numberValue;
  readonly attribute DOMString stringValue;
  readonly attribute boolean booleanValue;
  readonly attribute Node? singleNodeValue;
  readonly attribute boolean invalidIteratorState;
  readonly attribute unsigned long snapshotLength;

  Node? iterateNext();
  Node? snapshotItem(unsigned long index);
};

[Exposed=Window]
interface XPathExpression {
  // XPathResult.ANY_TYPE = 0
  XPathResult evaluate(Node contextNode, optional unsigned short type = 0, optional XPathResult? result = null);
};

callback interface XPathNSResolver {
  DOMString? lookupNamespaceURI(DOMString? prefix);
};

interface mixin XPathEvaluatorBase {
  [NewObject] XPathExpression createExpression(DOMString expression, optional XPathNSResolver? resolver = null);
  Node createNSResolver(Node nodeResolver); // legacy
  // XPathResult.ANY_TYPE = 0
  XPathResult evaluate(DOMString expression, Node contextNode, optional XPathNSResolver? resolver = null, optional unsigned short type = 0, optional XPathResult? result = null);
};
Document includes XPathEvaluatorBase;

[Exposed=Window]
interface XPathEvaluator {
  constructor();
};

XPathEvaluator includes XPathEvaluatorBase;

[Exposed=Window]
interface XSLTProcessor {
  constructor();
  undefined importStylesheet(Node style);
  [CEReactions] DocumentFragment transformToFragment(Node source, Document output);
  [CEReactions] Document transformToDocument(Node source);
  undefined setParameter([LegacyNullToEmptyString] DOMString namespaceURI, DOMString localName, any value);
  any getParameter([LegacyNullToEmptyString] DOMString namespaceURI, DOMString localName);
  undefined removeParameter([LegacyNullToEmptyString] DOMString namespaceURI, DOMString localName);
  undefined clearParameters();
  undefined reset();
};

✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN