1. 基盤
この仕様はInfra Standardに依存しています。[INFRA]
この仕様書で使用されている用語のいくつかは、Encoding、Selectors、Trusted Types、Web IDL、XML、およびNamespaces in XMLで定義されています。 [ENCODING] [SELECTORS4] [TRUSTED-TYPES] [WEBIDL] [XML] [XML-NAMES]
拡張が必要な場合、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を受け取り、次の手順を実行します:
-
inputTokensをASCII空白で分割した結果とする。
-
tokensを新しい順序付き集合とする。
-
各inputTokensのtokenについて: tokenをtokensに追加する。
- tokensを返す。
順序付き集合シリアライザは、 setを受け取り、U+0020 SPACEで連結した結果を返します。
1.3. セレクター
セレクター文字列のスコープマッチ selectorsをnodeに対して行うには、次の手順を実行します:
-
sをselectorsをパースした結果とする。 [SELECTORS4]
-
sが失敗なら、throwし、 "
SyntaxError"DOMExceptionを投げる。 -
sと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が返されれば有効な要素ローカル名です:
-
nameの長さが0なら、falseを返す。
-
-
nameがASCII空白、U+0000 NULL、U+002F (/)、U+003E (>) を含むならfalseを返す。
-
trueを返す。
-
-
nameの0番目の符号位置がU+003A (:)、U+005F (_)でなく、 U+0080~U+10FFFFの範囲でもなければfalseを返す。
-
nameの残りの符号位置(存在する場合)が ASCII英字、ASCII数字、 U+002D (-)、U+002E (.)、U+003A (:)、U+005F (_)、 またはU+0080~U+10FFFFの範囲でないならfalseを返す。
-
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を元に行うには:
-
namespaceが空文字列なら、nullに設定する。
-
prefixをnullにする。
-
localNameをqualifiedNameにする。
-
qualifiedNameがU+003A (:) を含む場合:
-
splitResultをqualifiedNameをU+003A (:)で厳密分割した結果とする。
-
prefixにsplitResult[0]を設定する。
-
localNameにsplitResult[1]を設定する。
-
prefixが有効な名前空間プレフィックスでなければ、 throwし、 "
InvalidCharacterError"DOMExceptionを投げる。
-
-
Assert: prefixはnullまたは有効な名前空間プレフィックスであること。
-
contextが"
attribute"で、localNameが有効な属性ローカル名でないなら、 throwし、"InvalidCharacterError"DOMExceptionを投げる。 -
contextが"
element"で、localNameが有効な要素ローカル名でないなら、 throwし、"InvalidCharacterError"DOMExceptionを投げる。 -
prefixがnullでなく、namespaceがnullなら、 throwし、 "
NamespaceError"DOMExceptionを投げる。 -
prefixが"
xml"で、namespaceがXML名前空間でないなら、 throwし、 "NamespaceError"DOMExceptionを投げる。 -
いずれかqualifiedNameまたはprefixが"
xmlns"で、 namespaceがXMLNS名前空間でないなら、 throwし、 "NamespaceError"DOMExceptionを投げる。 -
namespaceがXMLNS名前空間で、 qualifiedNameまたはprefixが"
xmlns"でないなら、 throwし、 "NamespaceError"DOMExceptionを投げる。 -
(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
属性値がdocument、2回目はbody 要素となります。
eventPhase
属性値は
CAPTURING_PHASE
からBUBBLING_PHASEに切り替わります。
span 要素にイベントリスナーが登録されていた場合、eventPhase
属性値はAT_TARGETになります。
2.2. インターフェース Event
[Exposed=*]interface {Event (constructor DOMString ,type optional EventInit = {});eventInitDict readonly attribute DOMString type ;readonly attribute EventTarget ?target ;readonly attribute EventTarget ?srcElement ; // legacyreadonly 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 ; // legacyundefined preventDefault ();readonly attribute boolean defaultPrevented ;readonly attribute boolean composed ; [LegacyUnforgeable ]readonly attribute boolean isTrusted ;readonly attribute DOMHighResTimeStamp timeStamp ;undefined initEvent (DOMString ,type optional boolean =bubbles false ,optional boolean =cancelable false ); // legacy };dictionary {EventInit boolean =bubbles false ;boolean =cancelable false ;boolean =composed false ; };
Event オブジェクトは、単に イベント
と呼ばれます。これは、何かが発生したこと(例:画像のダウンロードが完了したこと)を通知できます。
潜在的なイベントターゲットは、null または EventTarget
オブジェクトです。
イベントには、target(潜在的なイベントターゲット)が関連付けられています。特に記載がない限り、これは null です。
イベントには、relatedTarget(潜在的なイベントターゲット)が関連付けられています。特に記載がない限り、これは null です。
他の仕様では relatedTarget を使って relatedTarget 属性を定義します。[UIEVENTS]
イベントには、touch target list(リスト。0個以上の潜在的なイベントターゲット)が関連付けられています。特に記載がない限り、空リストです。
touch target listは、TouchEventインターフェースおよび関連インターフェースの定義専用です。[TOUCH-EVENTS]
イベントには、pathが関連付けられています。pathは、リストで、各構造体には、
invocation target(EventTarget
オブジェクト)、
invocation-target-in-shadow-tree(真偽値)、
shadow-adjusted target(潜在的なイベントターゲット)、
relatedTarget(潜在的なイベントターゲット)、
touch target list(リスト。潜在的なイベントターゲット)、
root-of-closed-tree(真偽値)、
slot-in-closed-tree(真偽値)が含まれます。
pathは最初は空リストです。
event = new Event(type [, eventInitDict])- 新しい event を返します。
type属性値が type になります。eventInitDict 引数により、bubblesおよびcancelable属性を同名のオブジェクトメンバーで設定できます。 event .type- event のタイプ(例: "
click"、"hashchange"、"submit")を返します。 event .target- event が 発行されたオブジェクト(target)を返します。
event .currentTarget- 現在コールバックが実行されているイベントリスナーのオブジェクトを返します。
event .composedPath()- event の invocation target
オブジェクト(リスナーが呼ばれるオブジェクト)のリストを返します。ただし、event の
currentTargetから到達できないclosedモードの shadow root を持つ shadow tree 内のノードは除外されます。 event .eventPhase- event のフェーズを返します。値は
NONE、CAPTURING_PHASE、AT_TARGET、BUBBLING_PHASEのいずれかです。 event . stopPropagation()- ツリー内で 発行された場合、このメソッドを呼ぶと event が現在のオブジェクト以外に到達しなくなります。
event . stopImmediatePropagation()- このメソッドを呼ぶと、現在のリスナー以降の登録済みイベントリスナーには到達せず、ツリー内で 発行された場合、他のオブジェクトにも到達しなくなります。
event .bubbles- event の初期化方法によって true または false を返します。true の場合、event は target の祖先を逆ツリー順で辿ります。false の場合は辿りません。
event .cancelable- event の初期化方法によって true または false を返します。true の場合、event の 発行元の処理を
preventDefault()メソッドでキャンセルできます。 event . preventDefault()cancelable属性値が true で、かつ event のリスナーのpassiveが false の場合、このメソッドを呼ぶと発行元の処理をキャンセルするよう指示します。event .defaultPreventedpreventDefault()が正常に呼ばれキャンセル指示された場合は true、それ以外は false を返します。event .composed- event の初期化方法によって true または false を返します。true の場合、event は root である
ShadowRootノードを越えてリスナーを呼びます。false の場合は越えません。 event .isTrusted- event がユーザーエージェントによって 発行された場合は true、それ以外は false を返します。
event .timeStamp- event の発生時刻(ミリ秒単位)を返します。
type属性は初期化された値を返さなければなりません。イベントが作成されたとき、この属性は空文字列で初期化されなければなりません。
targetゲッターの手順は、thisのtargetを返すことです。
srcElementゲッターの手順は、thisのtargetを返すことです。
currentTarget属性は初期化された値を返さなければなりません。イベントが作成されたとき、この属性はnullで初期化されなければなりません。
composedPath()メソッドの手順は以下の通りです:
-
composedPathを空のリストとする。
-
pathが空なら、composedPathを返す。
-
currentTargetをthisの
currentTarget属性値とする。 -
Assert:currentTargetは
EventTargetオブジェクトであること。 -
Append:currentTargetをcomposedPathに追加する。
-
currentTargetIndexを0とする。
-
currentTargetHiddenSubtreeLevelを0とする。
-
indexをpathのサイズ−1とする。
-
indexが0以上の間、繰り返す:
-
path[index]のroot-of-closed-treeがtrueなら、 currentTargetHiddenSubtreeLevelを1増やす。
-
path[index]のinvocation targetがcurrentTargetなら、 currentTargetIndexをindexに設定し、 breakする。
-
path[index]のslot-in-closed-treeがtrueなら、 currentTargetHiddenSubtreeLevelを1減らす。
-
indexを1減らす。
-
-
currentHiddenLevelとmaxHiddenLevelをcurrentTargetHiddenSubtreeLevelとする。
-
indexをcurrentTargetIndex−1に設定する。
-
indexが0以上の間、繰り返す:
-
path[index]のroot-of-closed-treeがtrueなら、 currentHiddenLevelを1増やす。
-
currentHiddenLevelがmaxHiddenLevel以下なら、 prepend:path[index]のinvocation targetをcomposedPathの先頭に追加する。
-
path[index]のslot-in-closed-treeがtrueなら:
-
currentHiddenLevelを1減らす。
-
currentHiddenLevelがmaxHiddenLevel未満なら、 maxHiddenLevelをcurrentHiddenLevelに設定する。
-
-
indexを1減らす。
-
-
currentHiddenLevelとmaxHiddenLevelをcurrentTargetHiddenSubtreeLevelに設定する。
-
indexをcurrentTargetIndex+1に設定する。
-
indexがpathのサイズ未満の間、繰り返す:
-
path[index]のslot-in-closed-treeがtrueなら、 currentHiddenLevelを1増やす。
-
currentHiddenLevelがmaxHiddenLevel以下なら、 append:path[index]のinvocation targetをcomposedPathに追加する。
-
path[index]のroot-of-closed-treeがtrueなら:
-
currentHiddenLevelを1減らす。
-
currentHiddenLevelがmaxHiddenLevel未満なら、 maxHiddenLevelをcurrentHiddenLevelに設定する。
-
-
indexを1増やす。
-
-
composedPathを返す。
eventPhase属性は初期化された値を返さなければなりません。値は以下のいずれかです:
NONE(数値値 0)- 現在イベントが発行されていない場合はこのフェーズです。
CAPTURING_PHASE(数値値 1)- イベントが発行され、ツリーに属するオブジェクトの場合、targetに到達する前はこのフェーズになります。
AT_TARGET(数値値 2)- イベントが発行されたとき、target上ではこのフェーズになります。
BUBBLING_PHASE(数値値 3)- イベントが発行され、ツリーに属するオブジェクトの場合、targetに到達した後はこのフェーズになります。
初期状態では、この属性はNONEで初期化されなければなりません。
各イベントには、以下の関連フラグがあり、全て初期状態では未設定です:
- stop propagation flag
- stop immediate propagation flag
- canceled flag
- in passive listener flag
- composed flag
- initialized flag
- dispatch flag
stopPropagation()メソッドの手順は、thisのstop propagation flagを設定することです。
cancelBubbleゲッターの手順は、thisのstop propagation
flagが設定されていればtrue、そうでなければfalseを返すことです。
cancelBubbleセッターの手順は、指定された値がtrueならthisのstop propagation
flagを設定し、そうでなければ何もしないことです。
stopImmediatePropagation()メソッドの手順は、thisのstop propagation
flagとthisのstop immediate propagation flagを設定することです。
bubblesと
cancelable属性は、それぞれ初期化された値を返さなければなりません。
canceled
flagを設定するには、event
eventが、cancelable属性値がtrueであり、かつeventのin passive
listener flagが未設定なら、eventのcanceled flagを設定し、そうでなければ何もしないことです。
returnValueゲッターの手順は、thisのcanceled flagが設定されていればfalse、そうでなければtrueを返すことです。
returnValueセッターの手順は、指定された値がfalseならcanceled
flagを設定する(thisに対して)、そうでなければ何もしないことです。
preventDefault()メソッドの手順は、canceled flagを設定する(thisに対して)。
preventDefault()を呼んでも効果がない場合があります。ユーザーエージェントは、開発者コンソールで正確な理由を記録し、デバッグを支援することが推奨されます。
defaultPreventedゲッターの手順は、thisのcanceled flagが設定されていればtrue、そうでなければfalseを返すことです。
composedゲッターの手順は、thisのcomposed flagが設定されていればtrue、そうでなければfalseを返すことです。
isTrusted属性は初期化された値を返さなければなりません。イベントが作成されたとき、この属性はfalseで初期化されなければなりません。
isTrustedは、イベントがユーザーエージェントによって発行されたか(dispatchEvent()によるものではないか)を示す便宜的なものです。唯一のレガシー例外はclick()で、これによりユーザーエージェントがisTrusted属性がfalseで初期化されたイベントを発行します。
timeStamp属性は初期化された値を返さなければなりません。
initializeするには、event・type・bubbles・cancelableを使って以下の手順を実行します:
-
eventのinitialized flagを設定する。
-
eventのstop propagation flag、stop immediate propagation flag、canceled flagを未設定にする。
-
eventの
isTrusted属性をfalseに設定する。 -
eventのtargetをnullに設定する。
-
eventの
type属性をtypeに設定する。 -
eventの
bubbles属性をbubblesに設定する。 -
eventの
cancelable属性をcancelableに設定する。
initEvent(type, bubbles, cancelable)
メソッドの手順は以下の通りです:
-
thisのdispatch flagが設定されていれば、returnする。
-
initialize: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)
メソッドの手順は以下の通りです:
-
thisのdispatch flagが設定されていれば、returnする。
-
initialize:thisをtype、bubbles、cancelableで初期化する。
2.5. イベントの構築
仕様は、すべてまたは一部のイベントのためのイベント構築手順を定義できます。アルゴリズムには、イベントeventとEventIniteventInitDictが、内部イベント生成手順で示された通り渡されます。
この構造は、初期化辞書のメンバーとIDL属性が単純な1:1対応ではない、より複雑な構造を持つEventのサブクラスで利用できます。
Eventインターフェース、またはEventインターフェースを継承したインターフェースのconstructorが呼び出された時、typeとeventInitDictを引数として、次の手順を実行します:
-
eventを、thisインターフェース・null・現在時刻・eventInitDictで内部イベント生成手順を実行した結果とする。
-
eventの
type属性をtypeで初期化する。 -
eventを返す。
イベントを生成するには、eventInterface(必ずEventまたはそれを継承したインターフェース)、任意でrealmrealmを受け取り、以下の手順を実行します:
-
realmが与えられていなければnullに設定する。
-
dictionaryを、JavaScriptの値undefinedをeventInterfaceのコンストラクタが受け付ける辞書型に変換した結果とする。(この辞書型は
EventInitか、それを継承した辞書型です。)メンバーが必須の場合は機能しません。whatwg/dom#600参照。
-
eventを、eventInterface・realm・イベントが通知する発生時刻・dictionaryで内部イベント生成手順を実行した結果とする。
-
eventの
isTrusted属性をtrueで初期化する。 -
eventを返す。
イベントの生成は、他の仕様が単に発火するのではなく、イベントを個別に生成して発行する必要がある場面で利用します。これによりイベント属性が正しい初期値になることを保証します。
内部イベント生成手順は、eventInterface・realm・time・dictionaryを受け、以下の通りです:
-
eventをeventInterfaceを使って新しいオブジェクトとして生成する。realmがnullでなければそれを使い、そうでなければWeb IDLのデフォルト動作を使う。
Web IDLは現時点でデフォルト動作を定義していません。whatwg/webidl#135参照。
-
eventのinitialized flagを設定する。
-
eventの
timeStamp属性を、相対高精度粗時間(time・eventの関連グローバルオブジェクトを使う)で初期化する。 -
各dictionaryのmember→valueで: eventがmemberという識別子を持つ属性を持つなら、その属性をvalueで初期化する。
-
イベント構築手順をeventとdictionaryで実行する。
-
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
オブジェクトには、関連付けられたイベントリスナーリスト(ゼロ個以上のイベントリスナーのリスト)があります。初期状態では空のリストです。
イベントリスナー は、特定のイベントを監視するために使用され、次の要素から構成されます:
- type(文字列)
- callback(null または
EventListenerオブジェクト) - capture(ブール値、初期状態はfalse)
- passive(null またはブール値、初期状態はnull)
- once(ブール値、初期状態はfalse)
- signal(null または
AbortSignalオブジェクト) - removed(管理目的のブール値、初期状態はfalse)
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として指定されたかのように動作します。optionsの
captureがtrueに設定されている場合、イベントの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を処理するには、次の手順を実行します:
-
optionsがブール値の場合、optionsを返す。
-
options["
capture"]を返す。
flatten moreでoptionsを処理するには、次の手順を実行します:
new EventTarget()
コンストラクタ手順は何も行いません。
他の箇所で規定されたデフォルトのため、返されるEventTargetの
get the
parentアルゴリズムはnullを返し、
activation behavior、
legacy-pre-activation behavior、
またはlegacy-canceled-activation
behaviorを持ちません。
将来的にはカスタムget the parentアルゴリズムを許可する可能性があります。これがプログラムで有用である場合はお知らせください。
現時点では、作成されたすべてのEventTargetは
ツリー構造に参加しません。
デフォルトのパッシブ値は、イベントタイプtypeとEventTarget
eventTargetを受け取り、以下のように決定されます:
イベントリスナーを追加するには、EventTarget
オブジェクトeventTargetとイベントリスナーlistenerを受け取り、以下の手順を実行します:
-
eventTargetが
ServiceWorkerGlobalScopeオブジェクトであり、そのサービスワーカーのスクリプトリソースの評価済みフラグが設定されており、listenerのtypeが、いずれかのサービスワーカーイベントのtype属性値に一致する場合、この結果が予期したものと異なる可能性があるとコンソールに警告を報告します。[SERVICE-WORKERS] -
listenerのcallbackがnullである場合、終了する。
-
listenerのpassiveがnullである場合、listenerのtypeとeventTargetを用いてデフォルトのパッシブ値に設定する。
-
eventTargetのイベントリスナーリストに、含まれていない場合、そのtypeがlistenerのtypeであり、callbackがlistenerのcallbackであり、captureがlistenerのcaptureであるイベントリスナーがある場合、追加する。
-
listenerのsignalがnullでない場合、次の中止手順を追加する:
- イベントリスナーを削除する、対象はeventTargetとlistener。
イベントリスナーを追加するの概念は、イベントハンドラーが同じコードパスを使用することを保証するために存在します。[HTML]
addEventListener(type, callback, options)
メソッドの手順は以下の通りです:
-
capture、passive、once、およびsignalを、flattening more optionsの結果に設定する。
-
イベントリスナーを追加する、対象はthisとイベントリスナーであり、そのtypeがtype、callbackがcallback、captureがcapture、passiveがpassive、onceがonce、およびsignalがsignalである。
イベントリスナーを削除するには、EventTarget
オブジェクトeventTargetとイベントリスナーlistenerを受け取り、以下の手順を実行します:
-
eventTargetが
ServiceWorkerGlobalScopeオブジェクトであり、そのサービスワーカーの処理するイベントタイプのセットがlistenerのtypeを含む場合、コンソールに警告を報告する。[SERVICE-WORKERS] -
listenerのremovedをtrueに設定し、eventTargetのイベントリスナーリストから削除する。
HTMLではこれを使用してイベントハンドラーを定義します。[HTML]
すべてのイベントリスナーを削除するには、EventTarget
オブジェクトeventTargetを受け取り: 各eventTargetのイベントリスナーリストのlistenerに対して: イベントリスナーを削除するを実行する。
HTMLではこれを使用してdocument.open()を定義します。[HTML]
removeEventListener(type, callback, options)
メソッドの手順は以下の通りです:
-
captureを、flattening optionsの結果に設定する。
-
thisのイベントリスナーリストに、含まれる、typeがtypeであり、callbackがcallbackであり、captureがcaptureであるイベントリスナーがある場合、イベントリスナーを削除する、対象はthisとそのイベントリスナー。
イベントリスナーリストには、同じtype、callback、およびcaptureを持つ複数のイベントリスナーが含まれないため、イベントリスナーを追加するがこれを防ぎます。
dispatchEvent(event)
メソッドの手順は以下の通りです:
-
eventのdispatch flagが設定されている場合、またはそのinitialized flagが設定されていない場合、例外を投げる "
InvalidStateError"DOMException。 -
eventの
isTrusted属性をfalseに初期化する。 -
dispatchingをeventとthisを用いて実行した結果を返す。
2.8. イベントリスナーの観察
一般的に、開発者はイベントリスナーの存在が観察可能であることを期待していません。 イベントリスナーの影響は、そのコールバックによって決定されます。つまり、 開発者が何もしないイベントリスナーを追加しても、副作用がないことを期待します。
しかしながら、一部のイベントAPIは効率的に実装するために
イベントリスナーを観察する必要があるように設計されています。これにより、リスナーの存在が観察可能になり、
空のリスナーであってもアプリケーションの動作やパフォーマンスに大きな影響を与える可能性があります。
例えば、非同期スクロールをブロックするために使用されるタッチイベントやホイールイベントのような場合です。
この問題は、少なくとも1つの非passiveリスナーが存在する場合にのみ
イベントをcancelableとして指定することで、軽減されることがあります。
例えば、非passive
TouchEvent
リスナーはスクロールをブロックする必要がありますが、すべてのリスナーがpassive
である場合、並行してスクロールを開始できるよう、TouchEvent
をキャンセル不可(preventDefault()
の呼び出しを無視する)にすることができます。そのため、イベントを発行するコードは非passiveリスナーの有無を観察し、
発行されるイベントのcancelableプロパティをクリアすることができます。
理想的には、新しいイベントAPIはこの特性を必要としないように定義されるべきです。(議論についてはwhatwg/domを使用してください。)
レガシーなサービスワーカーのfetchイベントリスナーコールバックを取得するには、
ServiceWorkerGlobalScope
globalを受け取り、以下の手順を実行します。これにより、リストとして
EventListener
オブジェクトが返されます。
2.9. イベントのディスパッチ
dispatch を使って event を target に、オプションの legacy target override flag およびオプションの legacyOutputDidListenersThrowFlag とともにディスパッチするには、以下の手順を実行する:
-
event の dispatch flag を設定する。
-
targetOverride を target に設定する。ただし legacy target override flag が指定されていない場合は target の 関連付けられた
Documentに設定する。 [HTML]legacy target override flag は HTML でのみ使用され、target が
Windowオブジェクトの場合のみ使用される。 -
activationTarget を null に設定する。
-
relatedTarget を retargeting により event の relatedTarget を target に対して再ターゲットした結果に設定する。
-
clearTargets を false に設定する。
-
target が relatedTarget でない、または target が event の relatedTarget である場合:
-
touchTargets を新しい リスト に設定する。
-
各 touchTarget を event の touch target list から取り出し: retargeting により touchTarget を target に対して再ターゲットした結果を touchTargets に 追加する。
-
イベントパスに追加 を event, target, targetOverride, relatedTarget, touchTargets, false で実行する。
-
isActivationEvent を true に設定する。ただし event が
MouseEventオブジェクトであり、event のtype属性が "click" の場合のみ。そうでなければ false。 -
isActivationEvent が true かつ target が activation behavior を持つ場合、activationTarget を target に設定する。
-
slottable を target に設定する。ただし target が slottable かつ assigned の場合のみ。そうでなければ null。
-
slot-in-closed-tree を false に設定する。
-
parent を target の get the parent を event で呼び出した結果に設定する。
-
parent が null でない間:
-
slottable が null でない場合:
-
アサート:parent は slot である。
-
slottable を null に設定する。
-
parent の root が shadow root かつ mode が "
closed" の場合、slot-in-closed-tree を true に設定する。
-
-
parent が slottable かつ assigned の場合、slottable を parent に設定する。
-
relatedTarget を retargeting により event の relatedTarget を parent に対して再ターゲットした結果に設定する。
-
touchTargets を新しい リスト に設定する。
-
各 touchTarget を event の touch target list から取り出し: 追加する。retargeting により touchTarget を parent に対して再ターゲットした結果を touchTargets に追加する。
-
parent が
Windowオブジェクト、または parent が node かつ target の root が shadow-including inclusive ancestor である場合:-
isActivationEvent が true、event の
bubbles属性が true、activationTarget が null、かつ parent が activation behavior を持つ場合、activationTarget を parent に設定する。 -
イベントパスに追加 を event, parent, null, relatedTarget, touchTargets, slot-in-closed-tree で実行する。
-
-
それ以外の場合、parent が relatedTarget であれば、parent を null に設定する。
-
それ以外の場合:
-
target を parent に設定する。
-
isActivationEvent が true、activationTarget が null、かつ target が activation behavior を持つ場合、activationTarget を target に設定する。
-
イベントパスに追加 を event, parent, target, relatedTarget, touchTargets, slot-in-closed-tree で実行する。
-
-
parent が null でない場合、parent を parent の get the parent を event で呼び出した結果に設定する。
-
slot-in-closed-tree を false に設定する。
-
-
clearTargetsStruct を event の path のうち、shadow-adjusted target が null でない最後の構造体に設定する。
-
clearTargetsStruct の shadow-adjusted target、clearTargetsStruct の relatedTarget、または clearTargetsStruct の touch target list 内の
EventTargetオブジェクトが node であり、その root が shadow root である場合、clearTargets を true に設定する。 -
activationTarget が null でなく、activationTarget が legacy-pre-activation behavior を持つ場合、activationTarget の legacy-pre-activation behavior を実行する。
-
各 struct を event の path の逆順で取り出す:
-
struct の shadow-adjusted target が null でない場合、event の
eventPhase属性をAT_TARGETに設定する。 -
それ以外の場合、event の
eventPhase属性をCAPTURING_PHASEに設定する。 -
Invoke を struct, event, "
capturing", legacyOutputDidListenersThrowFlag(指定されていれば)で実行する。
-
-
各 struct を event の path から取り出す:
-
struct の shadow-adjusted target が null でない場合、event の
eventPhase属性をAT_TARGETに設定する。 -
それ以外の場合:
-
event の
eventPhase属性をBUBBLING_PHASEに設定する。
-
Invoke を struct, event, "
bubbling", legacyOutputDidListenersThrowFlag(指定されていれば)で実行する。
-
-
-
event の
eventPhase属性をNONEに設定する。 -
event の
currentTarget属性を null に設定する。 -
event の path を空のリストに設定する。
-
event の dispatch flag、stop propagation flag、stop immediate propagation flag を解除する。
-
clearTargets が true の場合:
-
event の target を null に設定する。
-
event の relatedTarget を null に設定する。
-
event の touch target list を空のリストに設定する。
-
-
activationTarget が null でない場合:
-
event の canceled flag が解除されていれば、activationTarget の activation behavior を event で実行する。
-
それ以外の場合、activationTarget が legacy-canceled-activation behavior を持つ場合、activationTarget の legacy-canceled-activation behavior を実行する。
-
-
event の canceled flag が設定されていれば false を返す。そうでなければ true を返す。
イベントパスに追加するには、event、invocationTarget、shadowAdjustedTarget、relatedTarget、touchTargets、および slot-in-closed-tree が与えられたとき、以下の手順を実行する:
-
invocationTargetInShadowTree を false に設定する。
-
もし invocationTarget が ノードであり、その ルートが シャドウルート であるなら、invocationTargetInShadowTree を true に設定する。
-
root-of-closed-tree を false に設定する。
-
もし invocationTarget が シャドウルートであり、その mode が "
closed" であるなら、root-of-closed-tree を true に設定する。 -
Append を使って新しい struct を event の path に追加する。invocation target は invocationTarget、 invocation-target-in-shadow-tree は invocationTargetInShadowTree、 shadow-adjusted target は shadowAdjustedTarget、 relatedTarget は relatedTarget、 touch target list は touchTargets、 root-of-closed-tree は root-of-closed-tree、 slot-in-closed-tree は slot-in-closed-tree。
invokeするには、struct、event、phase、およびオプションの legacyOutputDidListenersThrowFlag が与えられたとき、以下の手順を実行する:
-
event の target を event の shadow-adjusted target(structまたはそれ以前のstructのうち、shadow-adjusted target が null でない最後のもの)に設定する。
-
event の relatedTarget を struct の relatedTarget に設定する。
-
event の touch target list を struct の touch target list に設定する。
-
event の stop propagation flag が設定されていれば、return する。
-
event の
currentTarget属性を struct の invocation target に初期化する。 -
listeners を clone した event の
currentTarget属性値の event listener list に設定する。これは、この時点以降に追加された event listener が実行されないようにするためである。削除は removed フィールドにより影響を受けることに注意。
-
invocationTargetInShadowTree を struct の invocation-target-in-shadow-tree に設定する。
-
found を inner invoke を event、listeners、phase、invocationTargetInShadowTree、および legacyOutputDidListenersThrowFlag(指定されていれば)で実行した結果に設定する。
-
found が false かつ event の
isTrusted属性が true の場合:-
originalEventType を event の
type属性値に設定する。 -
event の
type属性値が下記の表の第1列のいずれかの文字列と一致する場合、event のtype属性値を同じ行の第2列の文字列に設定し、そうでなければ return する。イベントタイプ レガシーイベントタイプ " animationend"" webkitAnimationEnd"" animationiteration"" webkitAnimationIteration"" animationstart"" webkitAnimationStart"" transitionend"" webkitTransitionEnd" -
inner invoke を event、listeners、phase、invocationTargetInShadowTree、および legacyOutputDidListenersThrowFlag(指定されていれば)で実行する。
-
event の
type属性値を originalEventType に設定する。
-
inner invokeするには、event、listeners、phase、invocationTargetInShadowTree、およびオプションの legacyOutputDidListenersThrowFlag が与えられたとき、以下の手順を実行する:
-
found を false に設定する。
-
各 listener を listeners から取り出し、removed が false の場合:
-
found を true に設定する。
-
phase が "
capturing" かつ listener の capture が false の場合、continue する。 -
phase が "
bubbling" かつ listener の capture が true の場合、continue する。 -
listener の once が true の場合、remove an event listener を event の
currentTarget属性値と listener で実行する。 -
global を listener の callback の associated realm の global object に設定する。
-
currentEvent を undefined に設定する。
-
global が
Windowオブジェクトの場合:-
currentEvent を global の current event に設定する。
-
invocationTargetInShadowTree が false の場合、global の current event を event に設定する。
-
-
listener の passive が true の場合、event の in passive listener flag を設定する。
-
global が
Windowオブジェクトの場合、record timing info for event listener を event と listener で実行する。 -
Call a user object’s operation を listener の callback、"
handleEvent"、« event »、event のcurrentTarget属性値で実行する。これが例外 exception を投げた場合:-
Report exception を listener の callback の対応する JavaScript オブジェクトの associated realm の global object で報告する。
-
legacyOutputDidListenersThrowFlag が指定されていれば設定する。
legacyOutputDidListenersThrowFlag は Indexed Database API でのみ使用される。[INDEXEDDB]
-
-
event の in passive listener flag を解除する。
-
global が
Windowオブジェクトの場合、global の current event を currentEvent に設定する。 -
event の stop immediate propagation flag が設定されていれば、break する。
-
found を返す。
2.10. イベントの発火
fire an event を使って、e という名前のイベントを target で発火し、オプションで eventConstructor を使用し、IDL属性の初期化方法の説明と legacy target override flag を指定して、以下の手順を実行する:
-
eventConstructor が指定されていなければ、eventConstructor を
Eventに設定する。 -
event を creating an event を eventConstructor と target の relevant realm で実行した結果に設定する。
-
event の
type属性を e に初期化する。 -
その他の event の IDL 属性を、このアルゴリズムの呼び出し時の説明に従って初期化する。
これにより
isTrusted属性を false に設定することもできる。 -
dispatching を使って event を target で発火し、legacy target override flag が設定されていればそれを使い、その結果を返す。
DOM における fire は、creating、初期化、および dispatching をまとめて event に対して行うことを意味する。 fire an event はこの処理を簡潔に記述できるようにしている。
event の bubbles
や cancelable
属性を初期化する必要がある場合は、"fire an event named submit at target
with its cancelable
attribute initialized to true" のように記述できる。
また、カスタムコンストラクタが必要な場合は、"fire an event named click at target
using MouseEvent
with its detail
attribute initialized to 1" のように記述できる。
時には戻り値が重要になることもある:
-
doAction を firing an event named
likeat target の結果に設定する。 -
doAction が true なら …
2.11. アクションと発生の違い
event
は「発生」を意味し、「アクション」ではない。言い換えると、アルゴリズムからの通知を表し、そのアルゴリズムの今後の進行に影響を与えるために使うことができる(例:preventDefault()
の呼び出しなど)。
Events
はアクションや何かのアルゴリズムを開始するためのものではない。それが目的ではない。
ここで特に説明する理由は、以前の DOM 仕様では events に「デフォルトアクション」という概念があり、誤解を招いていたためである。 Events はアクションを表したり引き起こしたりするものではなく、進行中のアクションにのみ影響を与えることができる。
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() コンストラクタの手順:
-
signal を新しい
AbortSignalオブジェクトに設定する。
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) メソッドのステップは次のとおりである:
-
signal を新しい
AbortSignalオブジェクトにする。 -
signal の 中断理由を、reason が指定されている場合は reason に、そうでない場合は新しい "
AbortError"DOMExceptionに設定する。 - signal を返す。
静的な timeout(milliseconds) メソッドのステップは次のとおりである:
-
signal を新しい
AbortSignalオブジェクトにする。 -
global を signal の 関連するグローバルオブジェクトにする。
-
タイムアウト後にステップを実行するを、global、"
AbortSignal-timeout"、milliseconds、および次のステップで実行する:-
グローバルタスクをキューに入れるを、タイマータスクソース上で global を指定して、signal と新しい "
TimeoutError"DOMExceptionを指定して 中断を通知する。
このタイムアウトの間、signal の
abortイベントにイベントリスナーが登録されている場合、global から signal への強い参照がなければならない。 -
-
signal を返す。
静的な any(signals) メソッドのステップは、signals から
AbortSignal
と 現在のレルムを使用して 依存する中断シグナルを作成する結果を返すことである。
aborted ゲッターのステップは、this が 中断されている場合は true を、そうでない場合は false
を返すことである。
reason ゲッターのステップは、this の 中断理由を返すことである。
throwIfAborted() メソッドのステップは、this が 中断されている場合、this の 中断理由をスローすることである。
このメソッドは主に、AbortSignal
を受け入れる関数が、AbortSignal
を他のメソッドに渡す代わりに、特定のチェックポイントでスロー(または拒否された Promise
を返す)したい場合に便利である。たとえば、次の関数は、条件をポーリングする各試行の間に中断を許可する。これにより、実際の非同期操作(つまり、)が 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 に 追加するには:
アルゴリズム algorithm を AbortSignal
signal から 削除するには、algorithm を signal の 中断アルゴリズムから 削除する。
AbortSignal
オブジェクト signal とオプションの reason を指定して 中断を通知するには:
-
signal が 中断されている場合、return する。
-
signal の 中断理由を、reason が指定されている場合は reason に、そうでない場合は新しい "
AbortError"DOMExceptionに設定する。 -
dependentSignalsToAbort を新しい リストにする。
-
signal の 中断ステップを実行する。
-
dependentSignalsToAbort の各 dependentSignal について、繰り返し、dependentSignal の 中断ステップを実行する。
AbortSignal
signal の 中断ステップを実行するには:
AbortSignal
オブジェクトのリスト signals から、signalInterface(AbortSignal
またはそれを継承するインターフェースでなければならない)と realm を使用して、依存する中断シグナルを作成するには:
-
resultSignal を、realm を使用して signalInterface を実装する 新しいオブジェクトにする。
-
signals の各 signal について 繰り返す:signal が 中断されている場合、resultSignal の 中断理由を signal の 中断理由に設定し、resultSignal を返す。
-
resultSignal の dependent を true に設定する。
-
signals の各 signal について 繰り返す:
-
signal の dependent が false の場合:
-
signal を resultSignal の source signals に 追加する。
-
resultSignal を signal の dependent signals に 追加する。
-
-
そうでない場合、signal の source signals の各 sourceSignal について 繰り返す:
-
sourceSignal を resultSignal の source signals に 追加する。
-
resultSignal を sourceSignal の dependent signals に 追加する。
-
-
resultSignal を返す。
3.2.1. ガベージコレクション
中断されていない dependent な
AbortSignal
オブジェクトは、その source signals が空でなく、abort
イベントに登録されたイベントリスナーがあるか、その 中断アルゴリズムが空でない間は、ガベージコレクションされてはならない。
3.3.
API での AbortController
と AbortSignal
オブジェクトの使用
中断可能な操作を表すために Promise を使用するウェブプラットフォーム API は、次に従わなければならない:
signal辞書メンバーを通じてAbortSignalオブジェクトを受け入れる。AbortSignalオブジェクトの 中断理由で Promise を拒否することにより、操作が中断されたことを伝える。AbortSignalがすでに 中断されている場合は即座に拒否し、そうでない場合:- 中断アルゴリズムメカニズムを使用して
AbortSignalオブジェクトの変更を監視し、他の監視者と衝突しない方法で行う。
Promise を返すメソッド doAmazingness(options) のメソッドステップは次のようになる:
-
global を this の 関連するグローバルオブジェクトにする。
-
p を 新しい Promise にする。
-
options["
signal"] が 存在する場合: -
次のステップを 並行して実行する:
-
amazingResult を素晴らしいことをした結果にする。
-
global を指定してアメージングタスクソース上で グローバルタスクをキューに入れ、amazingResult で p を 解決する。
-
-
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、
または Attr。
DocumentFragment
を実装するオブジェクトは、時には ShadowRoot
も実装する。
Element
を実装するオブジェクトは、通常、HTMLAnchorElement
などの継承されたインターフェースも実装する。
CharacterData
を実装するオブジェクトは、継承されたインターフェースも実装する:Text、
ProcessingInstruction、
または Comment。
Text
を実装するオブジェクトは、時には CDATASection
も実装する。
したがって、すべてのノードのプライマリインターフェースは次のいずれかである:Document、
DocumentType、
DocumentFragment、
ShadowRoot、
Element または
Element
の継承されたインターフェース、
Attr、Text、CDATASection、
ProcessingInstruction、
または Comment。
簡潔にするため、この仕様では Node
と継承されたインターフェース NodeInterface を実装するオブジェクトを、
NodeInterface ノードと呼ぶ。
ノードツリーは次のように制約される。これは ノードとその潜在的な子の関係として表現される:
Document-
ツリー順で:
-
0個以上の
ProcessingInstructionまたはCommentノード。 -
オプションで1つの
DocumentTypeノード。 -
0個以上の
ProcessingInstructionまたはCommentノード。 -
0個以上の
ProcessingInstructionまたはCommentノード。
-
DocumentFragmentElement-
0個以上の
ElementまたはCharacterDataノード。 DocumentTypeCharacterDataAttr-
子なし。
Attr ノードは歴史的な理由によりツリーに参加するが、決して(非null の)親や子を持たず、したがってツリー内で単独である。
ノード node の長さを決定するには、次のステップを実行する:
-
node が
DocumentTypeまたはAttrノードの場合、0 を返す。 -
node が
CharacterDataノードの場合、node の データの長さを返す。 -
node の子の数を返す。
4.2.1. 文書ツリー
文書の文書要素は、 その親がその文書である要素(存在する場合)、そうでない場合は null である。
ノードツリーの制約により、そのような要素は1つしか存在できない。
ノードは、文書ツリー内にある場合、文書内にある。 文書内にあるという用語は、もはや使用されるべきではない。それを使用する標準がシャドウツリーを考慮するために更新されていないことを示している。
4.2.2. シャドウツリー
シャドウツリーは ルートがシャドウルートであるノードツリーである。
シャドウルートは、その ホストを通じて、常に別のノードツリーに接続されている。したがってシャドウツリーは決して単独ではない。 シャドウルートのホストのノードツリーは、時にライトツリーと呼ばれる。
シャドウツリーに対応するライトツリーは、それ自体がシャドウツリーである場合もある。
ノードは、その シャドウを含むルートが文書の場合、接続されている。
4.2.2.1. スロット
スロットは、HTML の
slot
要素を通じてのみ作成できる。
スロットには関連付けられた名前(文字列)がある。特に明記されていない限り、それは空文字列である。
スロットの名前を更新するには、次の属性変更ステップを使用する:
-
element がスロットで、localName が
nameで、 namespace が null の場合:-
value が oldValue の場合、return する。
-
value が null で oldValue が空文字列の場合、return する。
-
value が空文字列で oldValue が null の場合、return する。
-
value が null または空文字列の場合、element の 名前を空文字列に設定する。
-
そうでない場合、element の名前を value に設定する。
-
element のルートを指定してツリーのスロット可能要素を割り当てるを実行する。
-
シャドウツリー内の、ツリー順で最初のスロットで、その 名前が空文字列であるものは、時に「デフォルトスロット」として知られる。
スロットには関連付けられた割り当てられたノード(スロット可能要素のリスト)がある。特に明記されていない限り、それは空である。
4.2.2.2. スロット可能要素
Element と Text ノードは
スロット可能要素である。
スロット可能要素には関連付けられた名前(文字列)がある。特に明記されていない限り、それは空文字列である。
スロット可能要素の名前を更新するには、次の属性変更ステップを使用する:
-
localName が
slotで namespace が null の場合:-
value が oldValue の場合、return する。
-
value が null で oldValue が空文字列の場合、return する。
-
value が空文字列で oldValue が null の場合、return する。
-
value が null または空文字列の場合、element の 名前を空文字列に設定する。
-
そうでない場合、element の名前を value に設定する。
-
element が割り当てられている場合、element の割り当てられたスロットに対してスロット可能要素を割り当てるを実行する。
-
element に対してスロットを割り当てるを実行する。
-
スロット可能要素には関連付けられた 割り当てられたスロット(null またはスロット)がある。 特に明記されていない限り、それは null である。スロット可能要素は、その割り当てられたスロットが非 null の場合、 割り当てられている。
スロット可能要素には関連付けられた手動スロット割り当て(null またはスロット)がある。特に明記されていない限り、それは null である。
スロット可能要素の手動スロット割り当ては、この変数がスクリプトから直接アクセスできないため、スロットへの弱参照を使用して実装できる。
4.2.2.3. スロットとスロット可能要素の検索
指定されたスロット可能要素 slottable とオプションのブール値 open(デフォルトは false)に対してスロットを見つけるには:
-
slottable の親が null の場合、null を返す。
-
shadow が null の場合、null を返す。
-
open が true で shadow のモードが "
open" でない場合、null を返す。 -
shadow のスロット割り当てが "
manual" の場合、shadow の子孫の中で、その 手動で割り当てられたノードが slottable を含むスロットがあればそれを返し、そうでない場合は null を返す。 -
shadow の子孫内でツリー順で最初のスロットで、その名前が slottable の 名前と一致するものがあればそれを返し、そうでない場合は null を返す。
指定されたスロット slot に対してスロット可能要素を見つけるには:
指定されたスロット slot に対して平坦化されたスロット可能要素を見つけるには:
-
result を « » にする。
-
slottables を slot を指定してスロット可能要素を見つけた結果にする。
-
slottables が空のリストの場合、slot の各スロット可能要素子をツリー順で slottables に追加する。
-
slottables の各 node について:
-
-
temporaryResult を node を指定して平坦化されたスロット可能要素を見つけた結果にする。
-
temporaryResult の各スロット可能要素を順番に result に追加する。
-
-
そうでない場合、node を result に追加する。
-
-
result を返す。
4.2.2.4. スロット可能要素とスロットの割り当て
スロット slot に対してスロット可能要素を割り当てるには:
-
slottables を slot に対してスロット可能要素を見つけた結果にする。
-
slottables と slot の割り当てられたノードが同一でない場合、slot に対してスロット変更をシグナルするを実行する。
-
slot の割り当てられたノードを slottables に設定する。
-
slottables の各 slottable について: slottable の 割り当てられたスロットを slot に設定する。
指定されたノード root に対してツリーのスロット可能要素を割り当てるには、 root の包括的子孫の各スロットに対して、ツリー順でスロット可能要素を割り当てるを実行する。
指定されたスロット可能要素 slottable に対してスロットを割り当てるには:
-
slot を slottable を指定してスロットを見つけた結果にする。
-
slot が非 null の場合、slot に対してスロット可能要素を割り当てるを実行する。
4.2.2.5. スロット変更のシグナル
各同一オリジンウィンドウエージェントにはシグナルスロット(スロットのセット)があり、これは最初は空である。[HTML]
スロット slot に対してスロット変更をシグナルするには:
4.2.3. 変更アルゴリズム
事前挿入妥当性を確保するために、 ノード node を ノード parent の null または ノード child の前に挿入しようとする場合:
-
parent が
Document、DocumentFragment、 またはElementノードでない場合、"HierarchyRequestError"DOMExceptionを投げる。 -
node が parent のホストを含む包括的祖先の場合、 "
HierarchyRequestError"DOMExceptionを投げる。 -
child が非 null でその親が parent でない場合、 "
NotFoundError"DOMExceptionを投げる。 -
node が
DocumentFragment、DocumentType、Element、 またはCharacterDataノードでない場合、 "HierarchyRequestError"DOMExceptionを投げる。 -
node が
Textノードで parent が文書の場合、または node が文書型で parent が文書でない場合、 "HierarchyRequestError"DOMExceptionを投げる。 -
parent が文書で、node が実装するインターフェースで切り替えて、以下のいずれかの文が真の場合、 "
HierarchyRequestError"DOMExceptionを投げる。DocumentFragment-
node が複数の要素子を持つか、
Textノード子を持つ場合。そうでない場合、node が1つの要素子を持ち、かつ parent が要素子を持つ、child が文書型である、 または child が非 null で文書型が child に続く場合。
Element-
parent が要素子を持つ、child が文書型である、 または child が非 null で文書型が child に続く場合。
DocumentType-
parent が文書型子を持つ、child が非 null で要素が child に先行する、 または child が null で parent が要素子を持つ場合。
事前挿入 するには、ノード node を ノード parent の null または ノード child の前に挿入する:
-
node を parent の child の前に事前挿入妥当性を確保する。
-
referenceChild を child にする。
-
referenceChild が node の場合、referenceChild を node の次の兄弟に設定する。
-
node を parent の referenceChild の前に挿入する。
-
node を返す。
仕様は、すべてまたは一部のノード用に 挿入手順を定義することができます。 このアルゴリズムには、下の挿入アルゴリズムで示す通り、insertedNodeが渡されます。 これらの手順は、insertedNodeがノードツリーに 参加している場合、そのノードツリーを変更したり、 閲覧コンテキストを作成したり、 イベントを発火させたり、そのほかJavaScriptを実行してはなりません。 ただし、これらを非同期で実行するためにタスクをキューすることはできます。
挿入手順はJavaScript(その他の動作も含む)を実行できませんが、スクリプトから観測可能な結果を持ちます。次の例を考えてみましょう。
const h1 = document. querySelector( 'h1' );
const fragment = new DocumentFragment();
const script = fragment. appendChild( document. createElement( 'script' ));
const style = fragment. appendChild( document. createElement( 'style' ));
script. innerText= 'console.log(getComputedStyle(h1).color)' ; // Logs 'rgb(255, 0, 0)'
style. innerText = 'h1 {color: rgb(255, 0, 0);}' ;
document. body. append( fragment);
上記の例のスクリプトは
と出力します。なぜなら、以下の順序で処理されるためです。
Specificationsは、すべてまたは一部の nodesに対して post-connection stepsを定義する場合があります。アルゴリズムには下の insert アルゴリズムで示されている通り、connectedNodeが渡されます。
post-connection stepsの目的は、 nodesが、 connectedNodeがnode treeで参加している構造を変更する接続関連の処理を行ったり、 browsing contextsを作成したり、その他JavaScriptを実行する機会を提供することです。 これらの手順により、一連のnodesをスクリプトに対して 原子的に挿入できるようにし、主要な副作用は一括でのノードツリー挿入が完了した後に発生します。これにより、保留中のすべての node treeへの挿入が完全に終了するまで、 さらなる挿入が行われないことが保証されます。
Specificationsは、すべてまたは一部の nodesに対して children changed stepsを定義する場合があります。このアルゴリズムは引数なしで呼び出され、 insert、 remove、 およびreplace dataから呼ばれます。
挿入として、 ノード node を ノード parent の null または ノード child の前に挿入する。 なお、オプションでブール値 suppressObservers(デフォルトは false)を指定できる:
-
nodeが
DocumentFragmentnodeである場合は nodesをnodeのchildrenとし、そうでなければ « node » とする。 -
countをnodesのsizeとする。
-
もしcountが0なら、返す。
-
もしnodeが
DocumentFragmentnodeであるなら:-
Removeそのchildrenを suppressObserversを true にして実行する。
-
Queue a tree mutation recordを nodeに対して« »、nodes、null、nullでキューする。
この手順は意図的にsuppressObserversを考慮しません。
-
-
もしchildが非 null なら:
-
live rangeそれぞれについて、そのstart nodeがparentであり、 start offsetが childのindexより大きい場合:その start offsetをcountだけ増やす。
-
live rangeそれぞれについて、そのend nodeがparentであり、 end offsetが childのindexより大きい場合:その end offsetをcountだけ増やす。
-
-
previousSiblingを、childのprevious sibling、あるいはchildが null の場合はparentのlast childとする。
-
tree orderに従い、 nodesの各nodeについて:
-
Adoptを実行してnodeを parentのnode documentに入れる。
-
それ以外の場合、insertを使ってnodeをparentの childrenに childのindexの前に挿入する。
-
もしparentがshadow hostで、そのshadow rootの slot assignmentが "
named" であり、 かつnodeがslottableであるなら、assign a slot をnodeに対して実行する。 -
もしparentのrootがshadow rootで、 parentがslotであり、そのassigned nodesが空リストなら、 signal a slot change をparentに対して実行する。
-
assign slottables for a treeを nodeのrootで実行する。
-
shadow-including inclusive descendantの各inclusiveDescendantについて、shadow-including tree orderで:
-
挿入手順をinclusiveDescendantに対して実行する。
-
inclusiveDescendantが要素であり、かつ inclusiveDescendantのカスタム要素レジストリがnullでない場合:
-
inclusiveDescendantのカスタム要素レジストリの スコープ設定がtrueであれば、追加する。 inclusiveDescendantのノード文書を inclusiveDescendantのカスタム要素レジストリの スコープ文書セットへ。
-
inclusiveDescendantがカスタムである場合、 カスタム要素コールバックリアクションをキューに追加する。 inclusiveDescendant、コールバック名 "
connectedCallback"、および « » を使用。 -
それ以外の場合は、アップグレードを試みる inclusiveDescendantに対して。
これによりinclusiveDescendantのアップグレードが成功した場合、
connectedCallbackは 要素のアップグレード アルゴリズム中に自動的にキューに追加される。
-
-
それ以外の場合、inclusiveDescendantがシャドウルートであり、 inclusiveDescendantのカスタム要素レジストリがnullでなく、 inclusiveDescendantのカスタム要素レジストリの スコープ設定がtrueの場合、 追加する。 inclusiveDescendantのノード文書を inclusiveDescendantのカスタム要素レジストリの スコープ文書セットへ。
-
-
-
もしsuppressObserversが false なら、queue a tree mutation recordをparentのために、nodes、« »、previousSibling、およびchildでキューする。
-
children changed stepsをparentに対して実行する。
-
staticNodeListを最初は « » のlistとして用意する。
ここでは、どれかのノードに対して post-connection stepsを呼ぶ前に、 すべてのnodesを収集します。 これは、post-connection stepsがツリー構造を変更し得てライブな走査が安全でなくなり、 同じnodeに対して post-connection stepsが複数回呼ばれる可能性があるためです。
-
tree orderに従い、 nodesの各nodeについて:
-
shadow-including inclusive descendantの各inclusiveDescendantについて、shadow-including tree orderで: appendを使ってinclusiveDescendantを staticNodeListに追加する。
-
-
For each node of staticNodeList: もしnodeがconnectedであれば、 post-connection stepsを nodeに対して実行する。
あるnode nodeを node parentに appendするには: pre-insertを使ってnodeをparentの前の null に挿入する。
Specificationsは、すべてまたは一部の nodesに対して moving stepsを定義する場合があります。 このアルゴリズムにはnode movedNodeと、下のmoveアルゴリズムで示される通り node-or-null の oldParentが渡されます。insertion stepsと同様に、これらの手順は movedNodeが参加しているnode treeを変更したり、browsing contextsを作成したり、イベントを発火させたり、 JavaScriptを実行してはなりません。ただし、これらを非同期で実行するためのタスクをキューすることはできます。
移動するとは、ノード node を ノード newParent の null または ノード child の前に移動することである:
-
もしnewParentのshadow-including rootが nodeのshadow-including rootと同じでないなら、 throwして "
HierarchyRequestError" のDOMExceptionを発生させる。これは副作用として、移動が実行されるのはnewParentの connectedが nodeのconnectedと同じ場合のみであることを保証します。
-
もしnodeがnewParentのhost-including inclusive ancestorであるなら、throwして "
HierarchyRequestError" のDOMExceptionを発生させる。 -
もしchildが非 null で、そのparentがnewParentでないなら、 throwして "
NotFoundError" のDOMExceptionを発生させる。 -
もしnodeが
ElementまたはCharacterDataのいずれでもないノードであるなら、throwして "HierarchyRequestError" のDOMExceptionを発生させる。 -
もしnodeが
Textで newParentがdocumentであるなら、 throwして "HierarchyRequestError" のDOMExceptionを発生させる。 -
もしnewParentがdocumentで、かつnodeが
Elementであり、 かつ(newParentがすでにelementのchildを持っている、または childがdoctypeである、 またはchildが非 null でありdoctypeが followingしている)なら、 throwして "HierarchyRequestError" のDOMExceptionを発生させる。 -
oldParentをnodeのparentとする。
-
Assert: oldParentは非 null であることを主張する。
-
live range pre-remove stepsをnodeに対して実行する。
-
そのnodeのノードドキュメントと同じノードドキュメントを持つ各
NodeIteratorオブジェクトiteratorについて、NodeIterator pre-remove stepsを nodeとiteratorで実行する。 -
oldPreviousSiblingをnodeのprevious siblingとする。
-
oldNextSiblingをnodeのnext siblingとする。
-
もしnodeがassignedであるなら、 assign slottablesを nodeのassigned slotに対して実行する。
-
もしoldParentのrootがshadow rootで、かつoldParentが slotであり、 そのassigned nodesが 空であるなら、signal a slot changeを oldParentに対して実行する。
-
もしnodeがinclusive descendantを持ち、そのうちのどれかが slotであるなら:
-
assign slottables for a treeを oldParentのrootで実行する。
-
assign slottables for a treeを nodeで実行する。
-
-
もしchildが非 null なら:
-
各live rangeについて、そのstart nodeが newParentであり、かつそのstart offsetが childのindexより大きい場合:その start offsetを1だけ増やす。
-
各live rangeについて、そのend nodeが newParentであり、かつそのend offsetが childのindexより大きい場合:その end offsetを1だけ増やす。
-
-
newPreviousSiblingを、もしchildが非 null ならそのprevious siblingとし、 そうでなければnewParentのlast childとする。
-
それ以外の場合、insertを用いてnodeをnewParentの childrenに childのindexの前に挿入する。
-
もしnewParentがshadow hostで、そのshadow rootの slot assignmentが "
named" であり、 nodeがslottableであるなら、 assign a slot をnodeに対して実行する。 -
もしnewParentのrootがshadow rootで、かつnewParentが slotであり、 そのassigned nodesが空であるなら、 signal a slot change をnewParentに対して実行する。
-
assign slottables for a treeを nodeのrootで実行する。
-
shadow-including inclusive descendantの各inclusiveDescendantについて、shadow-including tree orderで:
-
もしinclusiveDescendantがnode自身であれば moving stepsを inclusiveDescendantとoldParentで実行し、そうでなければ moving stepsを inclusiveDescendantと null で実行する。
moveアルゴリズムは insertやremoveとは別のプリミティブであるため、 通常のinsertion stepsやremoving stepsを inclusiveDescendantについて呼び出さないことに注意してください。
-
もしinclusiveDescendantがcustomで、 かつnewParentがconnectedであるなら、 enqueue a custom element callback reactionを inclusiveDescendant、コールバック名 "
connectedMoveCallback"、および « » でキューする。
-
-
Queue a tree mutation recordを oldParentのために « »、 « node »、 oldPreviousSibling、およびoldNextSibling でキューする。
-
Queue a tree mutation recordを newParentのために « node »、 « »、 newPreviousSibling、およびchild でキューする。
あるnode childを、 node nodeで node parent内で replaceするには:
-
もしparentが
Document、DocumentFragment、 またはElementのいずれでもないノードであれば、 throwして "HierarchyRequestError" のDOMExceptionを発生させる。 -
もしnodeがparentのhost-including inclusive ancestorであるなら、 throwして "
HierarchyRequestError" のDOMExceptionを発生させる。 -
もしchildのparentがparentでないなら、 throwして "
NotFoundError" のDOMExceptionを発生させる。 -
もしnodeが
DocumentFragment、DocumentType、Element、 またはCharacterDataのいずれでもないノードであれば、 throwして "HierarchyRequestError" のDOMExceptionを発生させる。 -
もしnodeが
Textで、 parentがdocumentである、 またはnodeがdoctypeで parentがdocumentでない場合、 throwして "HierarchyRequestError" のDOMExceptionを発生させる。 -
もしparentがdocumentであり、 次のいずれかの文が true であれば(nodeが実装するインターフェイスに基づいて切り替える)、 throwして "
HierarchyRequestError" のDOMExceptionを発生させる。DocumentFragment-
もしnodeが複数のelementのchildを持つか、 あるいは
Textのnodeのchildを持つならばエラーとなる。さもなければ、もしnodeが一つのelementのchildを持ち、かつ parentがchildとは異なるelementのchildを持つか、 あるいはchildに続いてdoctypeがあるならばエラーとなる。
Element-
もしparentがchildとは異なるelementのchildを持つか、 あるいはchildの後にdoctypeがあるならばエラーとなる。
DocumentType-
もしparentがchildとは異なるdoctypeのchildを持つか、 あるいはchildの前にelementがあるならばエラーとなる。
上記の文はpre-insertアルゴリズムと異なります。
-
referenceChildをchildのnext siblingとする。
-
もしreferenceChildがnodeであれば、referenceChildを nodeのnext siblingに設定する。
-
previousSiblingをchildのprevious siblingとする。
-
removedNodesを空集合とする。
-
もしchildのparentが非 null なら:
-
removedNodesを « child » に設定する。
-
Removeをchildに対して、 suppressObserversを true にして実行する。
上記は、childがnodeである場合のみ偽になり得ます。
-
-
nodesを、もしnodeが
DocumentFragmentnodeであるならそのchildren、そうでなければ « node » とする。 -
Insert を使ってnodeをparentのreferenceChildの前に挿入し、 suppressObserversを true に設定する。
-
Queue a tree mutation recordを parentのためにnodes、removedNodes、previousSibling、およびreferenceChildでキューする。
-
childを返す。
あるnodeまたは null nodeで node parent内のすべてを replace allするには:
-
removedNodesをparentのchildrenとする。
-
addedNodesを空集合とする。
-
もしnodeが
DocumentFragmentnodeであれば、 addedNodesをnodeのchildrenに設定する。 -
さもなければ、もしnodeが非 null ならaddedNodesを « node » に設定する。
-
Removeを使って、 parentのすべてのchildrenを、tree orderで削除し、suppressObserversを true に設定する。
-
もしnodeが非 null なら、insertを使ってnodeをparentの null の前に挿入し、suppressObserversを true に設定する。
-
もしaddedNodesまたはremovedNodesが空でないなら、 queue a tree mutation recordを parentのためにaddedNodes、removedNodes、null、nullでキューする。
このアルゴリズムはnode treeの制約に関するチェックを行いません。仕様の作成者は注意して使用してください。
あるnode childを node parentから pre-removeするには:
-
もしchildのparentがparentでないなら、 throwして "
NotFoundError" のDOMExceptionを発生させる。 -
Removeを使って childを削除する。
-
childを返す。
Specificationsは、すべてまたは一部の nodesに対して removing stepsを定義する場合があります。アルゴリズムには下の remove アルゴリズムで示される通り、node removedNodeとnode-or-null の oldParentが渡されます。
除去するとは、ノード node を オプションのブール値 suppressObservers(デフォルトは false)とともに除去することである:
-
parentをnodeのparentとする。
-
Assert: parentは非 null である。
-
live range pre-remove stepsをnodeに対して実行する。
-
そのノードドキュメントと同じノードドキュメントを持つ各
NodeIteratorオブジェクトiteratorについて、NodeIterator pre-remove stepsを nodeとiteratorで実行する。 -
oldPreviousSiblingをnodeのprevious siblingとする。
-
oldNextSiblingをnodeのnext siblingとする。
-
もしnodeがassignedであるなら、 assign slottablesを nodeのassigned slotに対して実行する。
-
もしparentのrootがshadow rootで、かつparentが slotであり、 そのassigned nodesが空であるなら、 signal a slot change をparentに対して実行する。
-
もしnodeがinclusive descendantを持ち、 そのうちのどれかがslotであるなら:
-
assign slottables for a treeを parentのrootで実行する。
-
assign slottables for a treeを nodeで実行する。
-
-
removing stepsをnodeとparentで実行する。
-
isParentConnectedをparentのconnectedとする。
-
もしnodeがcustomでかつisParentConnectedが true なら、 enqueue a custom element callback reactionを node、コールバック名 "
disconnectedCallback"、および « » でキューする。現在は意図的に、customなelementsに対してparentが渡されないようになっています。将来的に必要があれば変更される可能性があります。
-
shadow-including descendantの各 descendantについて、shadow-including tree orderで:
-
removing stepsをdescendantと null で実行する。
-
もしdescendantがcustomでかつisParentConnectedが true なら、 enqueue a custom element callback reactionを descendant、コールバック名 "
disconnectedCallback"、および « » でキューする。
-
-
inclusive ancestorの各 inclusiveAncestorについて、そしてその後でfor eachを用いて inclusiveAncestorのregisteredの各要素について、もしその registeredのoptions["
subtree"] が true であれば、appendを使って新しい transient registered observerを追加する。 その新しいオブザーバーの各フィールドは、registeredの対応するフィールドを継承し、 sourceはregisteredを nodeのregistered observer listに設定する。 -
もしsuppressObserversが false なら、queue a tree mutation recordをparentのために « »、 « node »、 oldPreviousSibling、およびoldNextSibling でキューする。
-
children changed stepsをparentに対して実行する。
4.2.4.
ミックスイン NonElementParentNode
Web互換性のため、getElementById()
メソッドは要素(およびParentNode)では公開されません。
interface mixin {NonElementParentNode Element ?getElementById (DOMString ); };elementId Document includes NonElementParentNode ;DocumentFragment includes NonElementParentNode ;
getElementById(elementId)
メソッドの手順は、
ツリー順で
thisの
子孫の中から
IDがelementIdである
最初の要素を返します。
該当する要素がなければ、nullを返します。
4.2.5.
ミックスイン DocumentOrShadowRoot
interface mixin {DocumentOrShadowRoot readonly attribute CustomElementRegistry ?customElementRegistry ; };Document includes DocumentOrShadowRoot ;ShadowRoot includes DocumentOrShadowRoot ;
registry = documentOrShadowRoot .customElementRegistry-
documentOrShadowRootの
CustomElementRegistryオブジェクトを返します(存在すれば)。なければnullを返します。
customElementRegistry
ゲッターの手順は以下の通りです。
-
thisが ドキュメントなら、 thisのカスタム要素レジストリを返す。
-
Assert: thisは
ShadowRootノードである。 -
thisのカスタム要素レジストリを返す。
DocumentOrShadowRoot
ミックスインは、ドキュメントと
シャドウルートの両方で
共有されるAPIを定義したい他の標準でも利用されることが期待されています。
4.2.6. ミックスイン ParentNode
ノード群をノードに変換するには、 nodesとdocumentを受け取り、以下の手順を実行します。
-
nodeを null とする。
-
nodes 内の各文字列を、その文字列を data とし、document を node document とする新しい
Textノード で置き換える。 -
もし nodes が1つの node を含むなら、node を nodes[0] に設定する。
-
さもなければ、node を新しい
DocumentFragmentの node(その node document が document)に設定し、 必要であれば nodes の各 node をそれに append する。 -
node を返す。
interface mixin { [ParentNode SameObject ]readonly attribute HTMLCollection children ;readonly attribute Element ?firstElementChild ;readonly attribute Element ?lastElementChild ;readonly attribute unsigned long childElementCount ; [CEReactions ,Unscopable ]undefined prepend ((Node or DOMString )...); [nodes CEReactions ,Unscopable ]undefined append ((Node or DOMString )...); [nodes CEReactions ,Unscopable ]undefined replaceChildren ((Node or DOMString )...); [nodes CEReactions ]undefined moveBefore (Node ,node Node ?);child Element ?querySelector (DOMString ); [selectors NewObject ]NodeList querySelectorAll (DOMString ); };selectors Document includes ParentNode ;DocumentFragment includes ParentNode ;Element includes ParentNode ;
collection = node .children- childのelementsを返します。
element = node .firstElementChild- 最初のchildのうちelementであるものを返します。該当しない場合は null を返します。
element = node .lastElementChild- 最後のchildのうちelementであるものを返します。該当しない場合は null を返します。
node . prepend(nodes)-
nodes を node の first child の前に挿入します。挿入時に nodes 内の文字列は同等の
Textnodes に置き換えられます。Throws a "
HierarchyRequestError"DOMExceptionは、node tree の制約が違反された場合に発生します。 node . append(nodes)-
nodes を node の last child の後に挿入します。挿入時に nodes 内の文字列は同等の
Textnodes に置き換えられます。Throws a "
HierarchyRequestError"DOMExceptionは、node tree の制約が違反された場合に発生します。 node . replaceChildren(nodes)-
node の全ての children を nodes に置き換えます。置換時に nodes 内の文字列は同等の
Textnodes に置き換えられます。Throws a "
HierarchyRequestError"DOMExceptionは、node tree の制約が違反された場合に発生します。 node . moveBefore(movedNode, child)-
movedNode を先に削除せずに移動します。もし child が非 null であれば child の後に、そうでなければ node の last child の後に挿入します。 このメソッドは movedNode に関連付けられた状態を保持します。
Throws a "
HierarchyRequestError"DOMExceptionは、node tree の制約が違反された場合、または移動するノードに関連付けられた状態を保持できない場合に発生します。 node . querySelector(selectors)-
node の子孫であり、かつ selectors に一致する最初の element を返します。
node . querySelectorAll(selectors)-
node の子孫であり、かつ selectors に一致するすべての element を返します。
childrenゲッターの手順は、
thisをルートとし、
要素のみの子に一致する
HTMLCollection
コレクションを返すことです。
firstElementChildゲッターの手順は、
最初の子で
要素であるものを返します。なければnull。
lastElementChildゲッターの手順は、
最後の子で
要素であるものを返します。なければnull。
childElementCountゲッターの手順は、
要素である子の数を返します。
prepend(nodes)メソッドの手順は以下の通りです。
append(nodes)メソッドの手順は以下の通りです。
-
nodeを、nodesとthisの ノード文書を受けて ノード群をノードに変換した結果とする。
replaceChildren(nodes)メソッドの手順は以下の通りです。
-
nodeを、nodesとthisの ノード文書を受けて ノード群をノードに変換した結果とする。
-
事前挿入の妥当性の確保を nodeをthisのnullの前で実行する。
moveBefore(node, child)
メソッドの手順は以下の通りです。
-
referenceChildをchildとする。
-
もしreferenceChildがnodeなら、 referenceChildをnodeの次の兄弟にセットする。
querySelector(selectors)メソッドの手順は、
セレクタ文字列のスコープマッチを
selectorsに対してthisで実行し、結果が空リストでなければその最初の結果を返し、そうでなければnullを返します。
querySelectorAll(selectors)メソッドの手順は、
セレクタ文字列のスコープマッチを
selectorsに対してthisで実行した
静的な結果を返します。
4.2.7. ミックスイン NonDocumentTypeChildNode
Web互換性のため、previousElementSibling
および
nextElementSibling
属性はdoctype(およびChildNode)で公開されません。
interface mixin {NonDocumentTypeChildNode readonly attribute Element ?previousElementSibling ;readonly attribute Element ?nextElementSibling ; };Element includes NonDocumentTypeChildNode ;CharacterData includes NonDocumentTypeChildNode ;
element = node .previousElementSibling- 最初の前の兄弟で要素であるものを返します。なければnull。
element = node .nextElementSibling- 最初の後の兄弟で要素であるものを返します。なければnull。
previousElementSibling
ゲッターの手順は、最初の前の兄弟で要素であるものを返します。なければnull。
nextElementSibling
ゲッターの手順は、最初の後の兄弟で要素であるものを返します。なければnull。
4.2.8. ミックスイン ChildNode
interface mixin { [ChildNode CEReactions ,Unscopable ]undefined before ((Node or DOMString )...); [nodes CEReactions ,Unscopable ]undefined after ((Node or DOMString )...); [nodes CEReactions ,Unscopable ]undefined replaceWith ((Node or DOMString )...); [nodes CEReactions ,Unscopable ]undefined remove (); };DocumentType includes ChildNode ;Element includes ChildNode ;CharacterData includes ChildNode ;
node .before(...nodes)-
nodes を node の直前に挿入します。挿入時に nodes 内の文字列は同等の
Textnodes に置き換えられます。スローされるのは、
HierarchyRequestErrorDOMExceptionであり、これは node tree の制約が違反された場合に発生します。 node .after(...nodes)-
nodes を node の直後に挿入します。挿入時に nodes 内の文字列は同等の
Textnodes に置き換えられます。スローされるのは、
HierarchyRequestErrorDOMExceptionであり、これは node tree の制約が違反された場合に発生します。 node .replaceWith(...nodes)-
node を nodes で置き換えます。置き換え時に nodes 内の文字列は同等の
Textnodes に置き換えられます。スローされるのは、
HierarchyRequestErrorDOMExceptionであり、これは node tree の制約が違反された場合に発生します。 node .remove()-
node を削除します。
before(nodes)メソッドの手順は以下の通りです。
-
もしparentがnullなら、終了する。
-
viablePreviousSiblingをthisの 最初の前の 兄弟でnodesに含まれていないものとする。なければnull。
-
nodeをnodesとthisのノード文書でノード群をノードに変換した結果とする。
-
もしviablePreviousSiblingがnullなら、parentの最初の子をセットする。そうでなければviablePreviousSiblingの次の兄弟をセットする。
-
事前挿入でnodeをparentのviablePreviousSiblingの前に挿入する。
after(nodes)
メソッドの手順は以下の通りです。
-
もしparentがnullなら、終了する。
-
viableNextSiblingをthisの 最初の後の 兄弟でnodesに含まれていないものとする。なければnull。
-
nodeをnodesとthisのノード文書でノード群をノードに変換した結果とする。
-
事前挿入でnodeをparentのviableNextSiblingの前に挿入する。
replaceWith(nodes)メソッドの手順は以下の通りです。
-
もしparentがnullなら、終了する。
-
viableNextSiblingをthisの 最初の後の 兄弟でnodesに含まれていないものとする。なければnull。
-
nodeをnodesとthisのノード文書でノード群をノードに変換した結果とする。
-
もしthisの 親がparentなら、 置換でthisをnodeでparent内で置換する。
thisがnodeに挿入された可能性があります。
-
そうでなければ、事前挿入でnodeをparentのviableNextSiblingの前に挿入する。
remove()メソッドの手順は以下の通りです。
4.2.9. ミックスイン Slottable
interface mixin {Slottable readonly attribute HTMLSlotElement ?assignedSlot ; };Element includes Slottable ;Text includes Slottable ;
assignedSlot
ゲッターの手順は、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 - コレクション内のノードの数を返します。 collection内の要素数を返します。
- element = collection .
item(index)- element = collection[index]
- collectionからインデックスindexのノードを返します。ノードはツリー順でソートされています。
オブジェクトのサポートされているプロパティインデックスは、 コレクションによって表されるノードの数より一つ少ない値までを含む、0 からその数までの範囲の数値です。もしそのような要素が存在しない場合、サポートされているプロパティインデックスは存在しません。
length 属性は、コレクションによって表されるノードの数を返さなければなりません。
item(index) メソッドは、コレクション内の index 番目のノードを返さなければなりません。もしコレクション内にそのindex番目のノードが存在しない場合、メソッドは null
を返す必要があります。
4.2.10.2.
インターフェース HTMLCollection
[Exposed =Window ,LegacyUnenumerableNamedProperties ]interface {HTMLCollection readonly attribute unsigned long length ;getter Element ?item (unsigned long );index getter Element ?(namedItem DOMString ); };name
HTMLCollection
オブジェクトはコレクションであり、要素を保持します。
HTMLCollection
は歴史的な遺物でありWebから取り除くことができません。
開発者は引き続き使用できますが、新しいAPI標準の設計者は使用すべきではありません(IDLではsequence<T>を使ってください)。
- collection .
length - コレクション内の要素の数を返す。
- element = collection .
item(index)- element = collection[index]
- コレクションから、インデックスindexで指定された要素を返す。 要素はツリー順でソートされている。
- element = collection .
namedItem(name)- element = collection[name]
- コレクションの中から、nameというIDまたは名前を持つ最初の要素を返す。
オブジェクトのサポートされるプロパティインデックスは、要素の数が0〜(要素数-1)の範囲の数値です。 要素がなければサポートされるプロパティインデックスはありません。
lengthゲッターの手順は、
コレクションで表現されるノード数を返します。
item(index)メソッドの手順は、
コレクション内のindex番目の要素を返します。要素がなければnullを返します。
サポートされるプロパティ名は以下の手順で得られるリストの値です:
-
resultを空リストとする。
-
コレクションで表現される各elementについて、ツリー順で:
-
resultを返す。
namedItem(key)メソッドの手順は:
-
keyが空文字列ならnullを返す。
-
該当する要素がなければnullを返します。
4.3. ミューテーションオブザーバー
各同一オリジンウィンドウエージェントは、 mutation observer microtask queued (真偽値)を持ち、初期値はfalseです。[HTML]
各同一オリジンウィンドウエージェントはさらに
pending mutation
observers(0個以上の集合で、MutationObserverオブジェクト)を持ち、初期値は空です。
mutation observer microtask をキューする には、次の手順を実行します:
-
surrounding agentのmutation observer microtask queuedがtrueなら、終了する。
-
surrounding agentのmutation observer microtask queuedをtrueに設定する。
notify mutation observersを実行するには、次の手順を実行します:
-
surrounding agentのmutation observer microtask queuedをfalseに設定する。
-
notifySetをクローンした surrounding agentのpending mutation observersとする。
-
signalSetをクローンした surrounding agentのsignal slotsとする。
-
空にするで、surrounding agentの signal slotsを空にする。
-
各moについてnotifySetを繰り返す:
-
recordsをmoのrecord queueの クローンとする。
-
空にするでmoのrecord queueを空にする。
-
各nodeについてmoのnode listを繰り返し: removeで moがnodeのregistered observer listにある 全てのtransient registered observerを削除する。
-
もしrecordsが空でなければ、 コールバック関数を呼び出すで moのcallbackを« records, mo »と "report"で呼び出し、this値としてmoを渡す。
-
-
各slotについてsignalSetを繰り返し: イベントを発火する。 イベント名は
slotchange、属性bubblesを true にする。 対象はslot。
各ノードは registered observer list(0個以上のリストで、 registered observer)を持ち、初期値は空です。
registered
observerは、
observer(MutationObserverオブジェクト)と
options(MutationObserverInit辞書)で構成されます。
transient registered observerは、 registered observerであり、 さらにsource(registered observer)を持ちます。
Transient registered observers は、ある
node が削除された後にその
descendants 内で発生する変更を追跡するために使用されます。これにより、
subtree
が該当の node の
parent 上で true
に設定された場合でも、それらが失われないようにします。
4.3.1.
インターフェース MutationObserver
[Exposed =Window ]interface {MutationObserver constructor (MutationCallback );callback undefined observe (Node ,target optional MutationObserverInit = {});options undefined disconnect ();sequence <MutationRecord >takeRecords (); };callback =MutationCallback undefined (sequence <MutationRecord >,mutations MutationObserver );observer dictionary {MutationObserverInit boolean =childList false ;boolean ;attributes boolean ;characterData boolean =subtree false ;boolean ;attributeOldValue boolean ;characterDataOldValue sequence <DOMString >; };attributeFilter
MutationObserverオブジェクトは、treeのnodesに対する変化を監視するために使用できます。
各MutationObserverオブジェクトには、次の関連概念があります:
- A callback が作成時に設定されます。
- A node list(list、nodesへの弱参照のリスト)を持ち、初期は空です。
- A record queue(0個以上の
MutationRecordオブジェクトのqueue)を持ち、初期は空です。
observer = newMutationObserver(callback)- 新しい
MutationObserverオブジェクトを構築し、そのcallbackをcallbackに設定します。callbackは第一引数としてMutationRecordオブジェクトのリスト、第二引数として構築されたMutationObserverオブジェクトを受け取り、observe()メソッドで登録されたnodesが変化した後に呼び出されます。 observer .observe(target, options)- 指定したtarget(node)を監視し、options(オブジェクト)で指定された基準に基づいて変化を報告するようユーザーエージェントに指示します。
options引数はオブジェクトのメンバーによって監視オプションを設定できます。使用可能なオブジェクトメンバーは次の通りです:
childList- targetのchildrenへの変化を監視する場合は true に設定します。
attributes- targetのattributesへの変化を監視する場合は true に設定します。
attributeOldValueまたはattributeFilterが指定されている場合は省略できます。 characterData- targetのdataへの変化を監視する場合は true に設定します。
characterDataOldValueが指定されている場合は省略できます。 subtree- targetだけでなく、targetのdescendantsへの変化も監視する場合は true に設定します。
attributeOldValueattributesが true または省略されており、かつtargetのattributeのvalueを変化前に記録する必要がある場合は true に設定します。characterDataOldValuecharacterDataが true または省略されており、かつtargetのdataを変化前に記録する必要がある場合は true に設定します。attributeFilter- すべてのattributeの変化を監視する必要がない場合、(名前空間なしの)attribute
のローカル名のリストに設定します。その場合は
attributesが true または省略されている必要があります。
observer .disconnect()- observerが変化の監視を行わないようにします。
observe()が再度使用されるまで、observerのcallbackは呼び出されません。 observer .takeRecords()- record queueを空にし、そこにあったものを返します。
new MutationObserver(callback)
コンストラクタの手順は、this
の callback を
callback に設定することです。
observe(target, options)
メソッドの手順は次のとおりです:
-
もし options["
attributeOldValue"] または options["attributeFilter"] が exists し、かつ options["attributes"] が exist しない場合、options["attributes"] を true に設定します。 -
もし options["
characterDataOldValue"] が exists し、かつ options["characterData"] が exist しない場合、options["characterData"] を true に設定します。 -
もし options["
childList"]、options["attributes"]、および options["characterData"] のいずれも true でない場合は、throw してTypeErrorを発生させます。 -
もし options["
attributeOldValue"] が true でかつ options["attributes"] が false の場合、throw してTypeErrorを発生させます。 -
もし options["
attributeFilter"] が存在し、かつ options["attributes"] が false の場合、throw してTypeErrorを発生させます。 -
もし options["
characterDataOldValue"] が true でかつ options["characterData"] が false の場合、throw してTypeErrorを発生させます。 -
For each registered of target’s registered observer list:もし registered の observer が this であるなら:
-
For each node of this’s node list:remove して、nodeの registered observer list から transient registered observers をすべて削除します。これらの source が registered であるものです。
-
registered の options を options に設定します。
-
-
それ以外の場合:
-
Append して、新しい registered observer を target の registered observer list に追加します。その新しい registered observer の observer は this であり、options は options です。
-
disconnect() メソッドの手順は:
-
For each node of this’s node list:remove して、その node の registered observer list から、この this が observer である registered observer を削除します。
-
Empty を実行して、this の record queue を空にします。
takeRecords() メソッドの手順は:
-
records を clone して、this の record queue の複製を作ります。
-
Empty を実行して、this の record queue を空にします。
-
records を返します。
4.3.2. ミューテーションレコードのキューイング
ミューテーションレコードをキューするには、type、target、name、namespace、oldValue、addedNodes、removedNodes、previousSibling、nextSiblingを対象に、以下の手順を実行します。
-
interestedObserversを空のマップとする。
-
nodesをtargetの包括的祖先とする。
-
各nodesのnodeについて、続いてそれぞれnodeの登録済みオブザーバーのリストの各registeredについて:
-
optionsをregisteredのoptionsとする。
-
次のいずれも真でなければ
- nodeがtargetでなく、かつoptions["
subtree"]がfalse - typeが"
attributes"で、options["attributes"]が存在せず、またはfalse - typeが"
attributes"で、options["attributeFilter"]が存在し、options["attributeFilter"]がnameを含まず、またはnamespaceがnullでない - typeが"
characterData"で、options["characterData"]が存在せず、またはfalse - typeが"
childList"で、options["childList"]がfalse
ならば:
-
moをregisteredのobserverとする。
-
もしinterestedObservers[mo]が存在しなければ、セットでinterestedObservers[mo]をnullに設定する。
-
typeが"
attributes"でoptions["attributeOldValue"]がtrue、またはtypeが"characterData"でoptions["characterDataOldValue"]がtrueなら、 セットでinterestedObservers[mo]をoldValueに設定する。
- nodeがtargetでなく、かつoptions["
-
-
各observer→mappedOldValueについてinterestedObserversを繰り返す:
-
recordを新しい
MutationRecordオブジェクトとし、typeにtype、targetにtarget、attributeNameにname、attributeNamespaceにnamespace、oldValueにmappedOldValue、addedNodesにaddedNodes、removedNodesにremovedNodes、previousSiblingにpreviousSibling、nextSiblingにnextSiblingを設定する。 -
エンキューでrecordをobserverのrecord queueに追加する。
-
追加でobserverをsurrounding agentのpending mutation observersに追加する。
-
ツリーのミューテーションレコードをキューするには、target、addedNodes、removedNodes、previousSibling、nextSiblingを対象に、以下の手順を実行します。
-
Assert: addedNodesまたはremovedNodesが空でないこと。
-
ミューテーションレコードをキューするを"
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- その変化がattributeの変化であった場合は"
attributes"を返します。CharacterDataノードへの変化であった場合は"characterData"を返します。ノードのtreeへの変化であった場合は"childList"を返します。 record .target-
typeに応じて、変更の影響を受けた ノード を返す。 "attributes" の場合は、属性が変更された 要素 である。 "characterData" の場合は、該当するCharacterDataノード である。 "childList" の場合は、子が変更された ノード である。 record .addedNodesrecord .removedNodes- それぞれ追加および削除されたnodesを返します。
record .previousSiblingrecord .nextSibling- 追加または削除されたnodesのそれぞれのpreviousおよびnext siblingを返します。該当しない場合は null を返します。
record .attributeName- 変化したattributeのlocal nameを返します。該当しない場合は null です。
record .attributeNamespace- 変化したattributeのnamespaceを返します。該当しない場合は null です。
record .oldValue- 返り値は
typeによります。 "attributes"の場合は、変化前の該当するattributeのvalueです。 "characterData"の場合は、変化前の該当するノードのdataです。 "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 = 5; // legacyENTITY_REFERENCE_NODE const unsigned short = 6; // legacyENTITY_NODE 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 = 12; // legacyNOTATION_NODE 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 ?); // legacy alias of ===otherNode const unsigned short DOCUMENT_POSITION_DISCONNECTED = 0x01;const unsigned short DOCUMENT_POSITION_PRECEDING = 0x02;const unsigned short DOCUMENT_POSITION_FOLLOWING = 0x04;const unsigned short DOCUMENT_POSITION_CONTAINS = 0x08;const unsigned short DOCUMENT_POSITION_CONTAINED_BY = 0x10;const unsigned short DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 0x20;unsigned short compareDocumentPosition (Node );other boolean contains (Node ?);other DOMString ?lookupPrefix (DOMString ?);namespace DOMString ?lookupNamespaceURI (DOMString ?);prefix boolean isDefaultNamespace (DOMString ?); [namespace CEReactions ]Node insertBefore (Node ,node Node ?); [child CEReactions ]Node appendChild (Node ); [node CEReactions ]Node replaceChild (Node ,node Node ); [child CEReactions ]Node removeChild (Node ); };child dictionary {GetRootNodeOptions boolean =composed false ; };
Node は抽象インターフェイスであり、すべての
ノード
によって使用されます。直接インスタンスを取得することはできません。
各 ノード には、作成時に設定される関連する node document があり、それは ドキュメント です。
ノード の node document は、adopt アルゴリズムによって変更されることがあります。
ノードの親を取得アルゴリズムは、 event が与えられたとき、 もしノードが割り当てられた slotを持つ割り当て済みであれば、それを返す。それ以外の場合はノードの親を返す。
各 ノード はまた、registered observer list を持ちます。
node .nodeType-
nodeの型に応じた数値を次のように返します:
Element(1)。Node.ELEMENT_NODEAttr(2)。Node.ATTRIBUTE_NODE- 単独の
Textノード (3)。Node.TEXT_NODECDATASection(4)。Node.CDATA_SECTION_NODEProcessingInstruction(7)。Node.PROCESSING_INSTRUCTION_NODEComment(8)。Node.COMMENT_NODEDocument(9)。Node.DOCUMENT_NODEDocumentType(10)。Node.DOCUMENT_TYPE_NODEDocumentFragment(11)。Node.DOCUMENT_FRAGMENT_NODE
node .nodeName-
nodeの型に応じた文字列を次のように返します:
Element- HTML大文字化された修飾名。
Attr- 修飾名。
- 単独の
Textノード - "
#text"。 CDATASection- "
#cdata-section"。 ProcessingInstruction- target。
Comment- "
#comment"。 Document- "
#document"。 DocumentType- name。
DocumentFragment- "
#document-fragment"。
nodeTypeゲッターの手順は、インターフェースthisがimplementsする型によって最初に一致するものを返します:
ElementELEMENT_NODE(1)AttrATTRIBUTE_NODE(2);- 単独の
Textノード TEXT_NODE(3);CDATASectionCDATA_SECTION_NODE(4);ProcessingInstructionPROCESSING_INSTRUCTION_NODE(7);CommentCOMMENT_NODE(8);DocumentDOCUMENT_NODE(9);DocumentTypeDOCUMENT_TYPE_NODE(10);DocumentFragmentDOCUMENT_FRAGMENT_NODE(11).
nodeNameゲッターの手順は、インターフェースthisがimplementsする型によって最初に一致するものを返します:
Element- そのHTML大文字化修飾名。
Attr- その修飾名。
- 単独の
Textノード - "
#text"。 CDATASection- "
#cdata-section"。 ProcessingInstruction- そのtarget。
Comment- "
#comment"。 Document- "
#document"。 DocumentType- そのname。
DocumentFragment- "
#document-fragment"。
node .baseURI- nodeのノード文書のドキュメントの基底URLを返す。
baseURIゲッターの手順は、
thisの
ノード文書の
ドキュメントの基底URLを直列化して返します。
node .isConnected-
nodeが接続済みならtrue、そうでなければfalseを返します。
node .ownerDocument- ノード文書を返します。 ドキュメントの場合はnullを返します。
node .getRootNode()- nodeのルートを返します。
node . getRootNode({ composed:true })- nodeのシャドウ含むルートを返します。
node .parentNode- 親を返します。
node .parentElement- 親要素を返します。
node .hasChildNodes()- nodeが子を持つかどうか返します。
node .childNodes- 子を返します。
node .firstChild- 最初の子を返します。
node .lastChild- 最後の子を返します。
node .previousSibling- 前の兄弟を返します。
node .nextSibling- 次の兄弟を返します。
isConnectedゲッターの手順は、
thisが接続済みならtrue、そうでなければfalseを返すことです。
ownerDocumentゲッターの手順は、
thisがドキュメントならnullを返し、そうでなければthisのノード文書を返します。
ドキュメントのノード文書はそのドキュメント自身です。すべてのノードは常にノード文書を持ちます。
getRootNode(options)メソッドの手順は、
options["composed"]がtrueなら
thisの
シャドウ含むルートを返し、そうでなければ
thisのルートを返します。
parentNodeゲッターの手順は、
thisの親を返します。
parentElementゲッターの手順は、
thisの親要素を返します。
hasChildNodes()メソッドの手順は、
thisが子を持つならtrue、そうでなければfalseを返します。
childNodesゲッターの手順は、
thisをルートとし、子のみに一致する
NodeListを返します。
firstChildゲッターの手順は、
thisの最初の子を返します。
lastChildゲッターの手順は、
thisの最後の子を返します。
previousSiblingゲッターの手順は、
thisの前の兄弟を返します。
nextSiblingゲッターの手順は、
thisの次の兄弟を返します。
nodeValueゲッターの手順は、
インターフェースthisがimplementsする型によって次のように返します:
Attr- thisの値。
CharacterData- thisのデータ。
- その他
- Null。
nodeValueセッターの手順は、
渡された値がnullの場合は空文字列として扱い、その後以下の通りに実行します。インターフェースthis
implementsによって切り替えます:
AttrCharacterData- その他
-
何もしない。
テキストコンテンツ取得は、 ノードnodeについて、インターフェースnodeがimplementsする型によって次のように返します:
DocumentFragmentElement- nodeの子孫テキストコンテンツ。
Attr- nodeの値。
CharacterData- nodeのデータ。
- その他
- Null。
この textContent の getter 手順は、get text content を this に対して実行した結果を返すことです。
文字列 string を使って node parent 内で string replace all を行うには、次の手順を実行します:
-
node を null にします。
-
もし string が空文字列でないなら、node を新しい
Textnode に設定します。このノードの data は string であり、node document は parent の node document です。 -
Replace all を parent 内で node を用いて行います。
set text content を node node と文字列 value で実行するには、以下の定義に従い、インターフェイス node がどの implements しているかによって処理を切り替えます:
DocumentFragmentElement-
String replace all を node 内で value を用いて行います。
Attr-
既存の属性値を設定する を node と value で実行します。
CharacterData-
Replace data をノード node、オフセット 0、カウント node の length、およびデータ value で実行します。
- それ以外
-
何もしません。
この textContent
セッターの手順は、与えられた値が null の場合は空文字列として扱い、その後 set text content を this と与えられた値で実行することです。
node .normalize()- 空の empty な 排他的な
Textノード を削除し、残った連続する 排他的Textノード の data を、それらの最初の ノード に連結します。
この normalize() メソッドの手順は、子孫 の各 排他的な Text ノード
node に対して以下の手順を実行することです(対象は this の子孫):
- まず length を node の length とします。
- もし length がゼロなら、remove で node を削除し、次の 排他的な
Textノード に進みます(存在する場合)。 - data を、node の 連続する排他的
Textノード(自身を除く)の data の 連結 とします(ツリー順序で)。 - Replace data をノード node、オフセット length、カウント 0、データ data で実行します。
- currentNode を node の 次の兄弟 にします。
-
もし currentNode が 排他的な
Textノード である間は、次を繰り返します:-
ライブレンジのうち、開始ノードがcurrentNodeであるものすべてについて:その開始オフセットにlengthを加算し、開始ノードをnodeに設定する。
-
ライブレンジのうち、終了ノードがcurrentNodeであるものすべてについて:その終了オフセットにlengthを加算し、終了ノードをnodeに設定する。
-
ライブレンジのうち、開始ノードがcurrentNodeの親であり、開始オフセットがcurrentNodeのインデックスであるものすべてについて:その開始ノードをnodeに、開始オフセットをlengthに設定する。
-
ライブレンジのうち、終了ノードがcurrentNodeの親であり、終了オフセットがcurrentNodeのインデックスであるものすべてについて:その終了ノードをnodeに、終了オフセットをlengthに設定する。
-
currentNodeの長さをlengthに加算する。
-
currentNodeをその次の兄弟に設定する。
-
- Remove
で node の 連続する排他的な
Textノード(自身を除く)をツリー順序で削除します。
node . cloneNode([subtree = false])- node のコピーを返します。もし subtree が true なら、そのコピーには node の 子孫 も含まれます。
node .isEqualNode(otherNode)- node と otherNode が同じプロパティを持つかどうかを返します。
HTML は cloning steps をいくつかの要素、例えば
input、
script、
および
template
のような要素について定義しています。SVG はその
script
要素について同様にすべきですが、そうはなっていません。
ノードを複製するには、node node
と、オプションの document document
(省略時は node の node document)、boolean
subtree(省略時は false)、node または null の
parent(省略時は null)、および null または
CustomElementRegistry
オブジェクト fallbackRegistry
(省略時は null)を受け取る:
-
Assert: node が document ではないか、または node が document であることを確認します。
-
copy を、cloning a single node を node、document、および fallbackRegistry を用いて実行した結果にします。
-
cloning steps が 他の適用可能な仕様 によって node のために定義されている場合、それらを実行し、node、copy、および subtree をパラメータとして渡します。
-
もし parent が非 null なら、append で copy を parent に追加します。
-
もし subtree が true なら、node の children の各 child について、ツリー順序で:clone a node を child を与えて実行し、document を document に、subtree を subtree に、parent を copy に、そして fallbackRegistry を fallbackRegistry に設定します。
-
もし node が element であり、かつ node が shadow host であり、node の shadow root の clonable が true の場合:
-
Assert: copy が shadow host でないことを確認します。
-
shadowRootRegistry を node の shadow root の custom element registry にします。
-
もし shadowRootRegistry が global custom element registry である 場合、shadowRootRegistry を document の effective global custom element registry に設定します。
-
Attach a shadow root を copy、node の shadow root の mode、true、node の shadow root の serializable、node の shadow root の delegates focus、node の shadow root の slot assignment、および shadowRootRegistry を用いて実行します。
-
copy の shadow root の declarative を node の対応する shadow root の declarative に設定します。
-
node の shadow root の children の各 child について、ツリー順序で:clone a node を child を与えて実行し、document を document に、subtree を subtree に、そして parent を copy の shadow root に設定します。
これは意図的に fallbackRegistry 引数を渡していません。
-
-
最後に copy を返します。
単一ノードを複製する clone
a single
node(与えられた node node、document
document、および null または CustomElementRegistry
オブジェクト fallbackRegistry) を行うには、以下を実行します:
-
copy を null にします。
-
もし node が element であるなら:
-
registry を node の custom element registry にします。
-
もし registry が null なら、registry を fallbackRegistry に設定します。
-
もし registry が global custom element registry である なら、registry を document の effective global custom element registry に設定します。
-
copy を 要素を作成する の結果に設定します。引数は document、node の local name、node の namespace、node の namespace prefix、node の
isvalue、false、および registry です。 -
For each attribute を node の attribute list に対して行います:
-
copyAttribute を、cloning a single node を用いて attribute、document、および null で複製した結果にします。
-
Append copyAttribute を copy に追加します。
-
-
-
それ以外の場合、copy を node と同じインターフェイスを実装する ノード に設定し、追加の要件を満たすように以下を行います。ここでもインターフェイス node がどれを implements しているかで切り替えます:
Document-
-
copy の encoding、content type、 URL、origin、type、mode、および allow declarative shadow roots を node のものに設定します。
-
もし node の custom element registry の is scoped が true なら、copy の custom element registry を node のそれに設定します。
-
DocumentTypeAttr-
copy の namespace、namespace prefix、 local name、および value を node のものに設定します。
TextComment-
copy の data を node のものに設定します。
ProcessingInstruction- それ以外
-
何もしません。
-
もし node が document であれば、document を copy に設定します。
-
copy の node document を document に設定します。
-
最後に copy を返します。
この cloneNode(subtree) メソッドの手順は次の通りです:
-
もし this が shadow root であれば、throw により "
NotSupportedError"DOMExceptionを発生させます。 -
cloning a node を this を与えて実行し、subtree を subtree に設定した結果を返します。
ノード node A は、次のすべての条件が満たされる場合にノード node B と 等しい(equals) とされます:
-
A と B が同じインターフェイスを implements していること。
-
次に示すものが等しいこと(A がどのインターフェイスを implements しているかで切り替えます):
DocumentType- その name、public ID、および system ID。
Element- その namespace、namespace prefix、 local name、およびその attribute list の サイズ。
Attr- その namespace、local name、および value。
ProcessingInstruction- その target と data。
TextComment- その data。
- それ以外
- —
-
もし A が element であれば、その attribute リストにある各属性が、equals する 属性を B の attribute list の中に持っていること。
-
A と B が同じ数の children を持っていること。
この isEqualNode(otherNode)
メソッドの手順は、otherNode が非 null であり、かつ this が equals する otherNode
であれば true を返し、それ以外は false を返します。
この isSameNode(otherNode)
メソッドの手順は、otherNode が this であれば true を返し、それ以外は false を返します。
node .compareDocumentPosition(other)-
otherがnodeに対してどの位置にあるかを示すビットマスクを返します。設定されうるビットは以下の通りです:
(1)Node.DOCUMENT_POSITION_DISCONNECTED- nodeとotherが同じツリーに属していない場合に設定されます。
(2)Node.DOCUMENT_POSITION_PRECEDING- otherがnodeより先行している場合に設定されます。
(4)Node.DOCUMENT_POSITION_FOLLOWING- otherがnodeより後続している場合に設定されます。
(8)Node.DOCUMENT_POSITION_CONTAINS- otherがnodeの祖先である場合に設定されます。
(16, 10進数で16、16進数で10)Node.DOCUMENT_POSITION_CONTAINED_BY- otherがnodeの子孫である場合に設定されます。
node .contains(other)- otherがnodeの包括的子孫であればtrue、それ以外(nullを含む)はfalseを返します。
これらはcompareDocumentPosition()
がマスクとして返す定数です:
DOCUMENT_POSITION_DISCONNECTED(1);DOCUMENT_POSITION_PRECEDING(2);DOCUMENT_POSITION_FOLLOWING(4);DOCUMENT_POSITION_CONTAINS(8);DOCUMENT_POSITION_CONTAINED_BY(16, 10進数で16、16進数で10);DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC(32, 10進数で32、16進数で20)。
compareDocumentPosition(other)
メソッドの手順は以下の通りです:
-
もし this が other であれば、ゼロを返します。
-
node1 を other に、node2 を this にします。
-
attr1 と attr2 を null にします。
-
もし node1 が attribute であれば、attr1 を node1 に設定し、node1 を attr1 の element にします。
-
もし node2 が attribute の場合:
-
attr2 を node2 に設定し、node2 を attr2 の element にします。
-
もし attr1 と node1 が非 null で、かつ node2 が node1 であれば:
-
For each attr を node2 の attribute list の各要素について行います:
-
もし attr が equals attr1 であれば、次を返します:
DOCUMENT_POSITION_IMPLEMENTATION_SPECIFICとDOCUMENT_POSITION_PRECEDINGを加えた結果。 -
もし attr が equals attr2 であれば、次を返します:
DOCUMENT_POSITION_IMPLEMENTATION_SPECIFICとDOCUMENT_POSITION_FOLLOWINGを加えた結果。
-
-
-
-
もし node1 または node2 が null であるか、あるいは node1 の root が node2 の root と異なる場合、次を返します:
DOCUMENT_POSITION_DISCONNECTED、DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC、 および いずれかのDOCUMENT_POSITION_PRECEDINGまたはDOCUMENT_POSITION_FOLLOWINGを加えた結果を、一貫性を保つように返します。どちらを返すか(
DOCUMENT_POSITION_PRECEDINGかDOCUMENT_POSITION_FOLLOWING)は、通常ポインタ比較によって実装されます。JavaScript 実装ではキャッシュされたMath値を使用することができます。. random() -
もし node1 が ancestor であり node2 の先祖で、かつ attr1 が null である、または node1 が node2 で attr2 が非 null である場合、次を返します:
DOCUMENT_POSITION_CONTAINSとDOCUMENT_POSITION_PRECEDINGを加えた結果。 -
もし node1 が descendant であり node2 の子孫で、かつ attr2 が null である、または node1 が node2 で attr1 が非 null である場合、次を返します:
DOCUMENT_POSITION_CONTAINED_BYとDOCUMENT_POSITION_FOLLOWINGを加えた結果。 -
もし node1 が preceding node2 であれば、次を返します:
DOCUMENT_POSITION_PRECEDING。このアルゴリズムにおける attributes の扱い方のため、これは node の attributes が preceding としてその node の children を数える結果になります。これは attributes が同じ tree に participating しているわけではないにもかかわらずです。
-
次に
DOCUMENT_POSITION_FOLLOWINGを返します。
contains(other)メソッドの手順は、
otherが包括的子孫であればtrue、それ以外(null含む)はfalseを返すことです。
名前空間プレフィックスを特定する をelementに対してnamespaceで行うには、以下の手順を実行します:
-
elementの名前空間がnamespaceであり、 名前空間プレフィックスがnullでなければ、 その名前空間プレフィックスを返す。
-
elementが持つ属性のうち、 名前空間プレフィックスが"
xmlns"で、 値がnamespaceである属性があれば、 その最初の属性のローカル名を返す。 -
elementの親要素がnullでなければ、 その要素に対して 名前空間プレフィックスを特定するをnamespaceで実行した結果を返す。
-
nullを返す。
名前空間を特定するは、 nodeに対しprefixを使い、interface nodeがimplementsする型によって分岐します:
Element-
-
prefixが"
xml"なら、XML名前空間を返す。 -
prefixが"
xmlns"なら、XMLNS名前空間を返す。 -
自身の名前空間がnullでなく、 名前空間プレフィックスがprefixなら 名前空間を返す。
-
属性のうち名前空間がXMLNS名前空間で、名前空間プレフィックスが"
xmlns"で、 ローカル名がprefixであるものがある場合、 またはprefixがnullで、名前空間がXMLNS名前空間で、名前空間プレフィックスがnull、かつローカル名が"xmlns"の属性がある場合、 その値が空文字列でなければ返し、そうでなければnullを返す。 -
親要素がnullならnullを返す。
-
親要素に対してprefixで名前空間を特定するを実行した結果を返す。
-
DocumentDocumentTypeDocumentFragment-
nullを返す。
Attr- その他
lookupPrefix(namespace)メソッドの手順は:
-
namespaceがnullまたは空文字ならnullを返す。
-
interface thisがimplementsする型によって分岐する:
Element-
名前空間プレフィックスを特定するをthisにnamespaceで実行した結果を返す。
Document-
-
名前空間プレフィックスを特定するをthisの文書要素にnamespaceで実行した結果を返す。
DocumentTypeDocumentFragment-
nullを返す。
Attr-
-
名前空間プレフィックスを特定するをthisの要素にnamespaceで実行した結果を返す。
- その他
-
-
名前空間プレフィックスを特定するをthisの親要素にnamespaceで実行した結果を返す。
lookupNamespaceURI(prefix)メソッドの手順は:
isDefaultNamespace(namespace)メソッドの手順は:
-
namespaceが空文字ならnullに設定する。
-
defaultNamespaceがnamespaceと同じならtrue、そうでなければfalseを返す。
insertBefore(node, child)
メソッドの手順は、nodeを事前挿入としてthisにchildの前に挿入した結果を返すことです。
appendChild(node)メソッドの手順は、
nodeを追加としてthisに追加した結果を返すことです。
replaceChild(node, child)
メソッドの手順は、置換としてchildをnodeにthis内で置換した結果を返すことです。
removeChild(child)メソッドの手順は、
childを事前削除としてthisから削除した結果を返すことです。
qualifiedNameがqualifiedNameの要素リスト をroot(ノード)に対して取得するアルゴリズムは以下です:
-
qualifiedNameがU+002A(*)なら、rootをルートとし、フィルタが子孫要素のみに一致する
HTMLCollectionを返す。 -
そうでなく、rootのノード文書がHTMLドキュメントなら、 rootをルートとし、フィルタが以下の子孫要素に一致する
HTMLCollectionを返す: -
そうでなければ、rootをルートとし、フィルタが子孫要素で、 修飾名がqualifiedNameのものに一致する
HTMLCollectionを返す。
同じ引数で呼び出した場合、かつrootのノード文書の型が変更されていなければ、同じHTMLCollectionオブジェクトが返されることがあります。
namespaceがnamespace、localNameがlocalNameの要素リスト をroot(ノード)に対して取得するアルゴリズムは以下です:
-
namespaceが空文字ならnullに設定する。
-
namespaceとlocalNameが両方U+002A(*)なら、 rootをルートとし、フィルタが子孫要素に一致する
HTMLCollectionを返す。 -
namespaceがU+002A(*)なら、 rootをルートとし、フィルタが子孫要素でローカル名がlocalNameのものに一致する
HTMLCollectionを返す。 -
localNameがU+002A(*)なら、 rootをルートとし、フィルタが子孫要素で名前空間がnamespaceのものに一致する
HTMLCollectionを返す。 -
rootをルートとし、フィルタが子孫要素で名前空間がnamespace・ローカル名がlocalNameのものに一致する
HTMLCollectionを返す。
同じ引数で呼び出した場合、同じHTMLCollectionオブジェクトが返されることがあります。
classNamesがclassNamesの要素リスト をroot(ノード)に対して取得するアルゴリズムは以下です:
- classesをclassNamesに対して順序付き集合パーサーを実行した結果とする。
-
classesが空集合なら、空の
HTMLCollectionを返す。 -
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 .characterSetreadonly attribute DOMString inputEncoding ; // legacy alias of .characterSetreadonly 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 ); // legacy [interface NewObject ]Range createRange (); // NodeFilter.SHOW_ALL = 0xFFFFFFFF [NewObject ]NodeIterator createNodeIterator (Node ,root optional unsigned long = 0xFFFFFFFF,whatToShow optional NodeFilter ?=filter null ); [NewObject ]TreeWalker createTreeWalker (Node ,root optional unsigned long = 0xFFFFFFFF,whatToShow optional NodeFilter ?=filter null ); }; [Exposed =Window ]interface :XMLDocument Document {};dictionary {ElementCreationOptions CustomElementRegistry ?;customElementRegistry DOMString ; };is dictionary {ImportNodeOptions CustomElementRegistry ;customElementRegistry boolean =selfOnly false ; };
各ドキュメントには、
エンコーディング(エンコーディング)、
コンテントタイプ(文字列)、
URL(URL)、
オリジン(オリジン)、
型("xml"または"html")、
モード("no-quirks"、"quirks"、"limited-quirks"のいずれか)、
宣言的シャドウルート許可(boolean)、
カスタム要素レジストリ(nullまたはCustomElementRegistry
オブジェクト)が関連付けられます。
[ENCODING]
[URL]
[HTML]
特に明記されていない限り、ドキュメントのエンコーディングは
utf-8 エンコーディング、
コンテントタイプは
"application/xml"、
URLは
"about:blank"、
オリジンは
不透明なオリジン、
型は
"xml"、
モードは
"no-quirks"、
宣言的シャドウルート許可はfalse、
カスタム要素レジストリはnullです。
ドキュメントは、
型が"xml"なら
XMLドキュメントと呼ばれ、
それ以外はHTMLドキュメントと呼ばれます。
ドキュメントが
HTMLドキュメントか
XMLドキュメントかによって、
一部APIの挙動が変わります。
ドキュメントは
no-quirksモード(モードが"no-quirks")、
quirksモード(モードが"quirks")、
limited-quirksモード(モードが"limited-quirks")と呼ばれます。
モードは、
ドキュメントが
HTMLパーサでDOCTYPE文字列の有無や値によって作成された場合、
また新しい閲覧コンテキスト(初期"about:blank")によってのみデフォルトから変更されます。[HTML]
no-quirksモードは元々「standards mode」と呼ばれており、 limited-quirksモードは「almost standards mode」と呼ばれていましたが、 詳細が標準で定義されるようになったため改名されました。(Ian Hicksonが「意味がない」として元の名前を却下したことも理由です。)
ドキュメントの親取得アルゴリズムは、
eventがtype属性値"load"の場合、
またはドキュメントが
閲覧コンテキストを持たない場合はnullを返し、
それ以外はドキュメントの
関連グローバルオブジェクトを返します。
document = newDocument()- 新しいドキュメントを返します。
document .implementation- documentの
DOMImplementationオブジェクトを返します。 document .URLdocument .documentURI- documentのURLを返します。
document .compatMode-
documentのモードが"
quirks"なら文字列"BackCompat"、それ以外は"CSS1Compat"を返します。 document .characterSet- documentの エンコーディングを返します。
document .contentType- documentの コンテントタイプを返します。
new Document()
コンストラクタの手順は、thisのオリジンをオリジンである
現在のグローバルオブジェクトの関連付けられたDocumentのものに設定することです。[HTML]
createDocument()とは異なり、
このコンストラクタは
XMLDocument
オブジェクトではなく、ドキュメント
(Document
オブジェクト)を返します。
implementationゲッターの手順は、
thisに関連付けられたDOMImplementation
オブジェクトを返すことです。
URLおよび
documentURIゲッターの手順は、
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を返します。それ以外の場合、すべての子孫 要素のうち 名前空間がnamespace、 ローカル名がlocalNameであるものの
HTMLCollectionを返します。 collection = document . getElementsByClassName(classNames)collection = element . getElementsByClassName(classNames)-
このメソッドが呼び出された対象(ドキュメントまたは要素)内で、classNamesで指定されたすべてのクラスを持つ要素の
HTMLCollectionを返します。classNames引数は空白区切りのクラス名リストとして解釈されます。
doctypeゲッターの手順は、thisの子のうちdoctypeであるものを返し、なければnullを返すことです。
documentElementゲッターの手順は、thisの文書要素を返すことです。
getElementsByTagName(qualifiedName)
メソッドの手順は、修飾名がqualifiedNameの要素リストをthisで取得して返すことです。
したがって、HTMLドキュメントでは、
document
は
HTML名前空間ではない<FOO>要素と、
HTML名前空間の<foo>要素には一致しますが、
HTML名前空間の<FOO>要素には一致しません。
getElementsByTagNameNS(namespace, localName)
メソッドの手順は、namespaceがnamespaceかつlocalNameがlocalNameの要素リストをthisで取得して返すことです。
getElementsByClassName(classNames)
メソッドの手順は、classNamesがclassNamesの要素リストをthisで取得して返すことです。
< div id = "example" >
< p id = "p1" class = "aaa bbb" />
< p id = "p2" class = "aaa ccc" />
< p id = "p3" class = "bbb ccc" />
</ div >
document
の呼び出しは、HTMLCollection
を返し、その中には2つの段落
p1 と p2 が含まれる。
getElementsByClassName
の呼び出しは、ただ1つのノード、つまり p3 のみを返す。一方、
document
の呼び出しでも同じ結果が返る。
getElementsByClassName
の呼び出しは、ノードを何も返さない。上記の要素のいずれも aaa,bbb クラスには属していないためである。
element = document . createElement(localName [, options])-
localNameをローカル名とする要素を返します (documentがHTMLドキュメントの場合、localNameは小文字化されます)。 要素の名前空間は、 documentがHTMLドキュメントまたは documentのコンテントタイプが"
application/xhtml+xml"の場合はHTML名前空間、それ以外はnullです。optionsに
customElementRegistryが指定された場合は、CustomElementRegistryを設定できます。optionsに
isが指定された場合はカスタマイズされた組み込み要素を作成できます。localNameが有効な要素ローカル名でない場合は "
InvalidCharacterError"DOMExceptionが投げられます。optionsに
customElementRegistryとisの両方が指定された場合は "NotSupportedError"DOMExceptionが投げられます。 element = document . createElementNS(namespace, qualifiedName [, options])-
要素を返します。 名前空間はnamespaceです。 名前空間プレフィックスは qualifiedNameのU+003A (:)より前の部分か、なければnullとなります。 ローカル名はU+003A (:)より後の部分かqualifiedNameそのものです。
optionsに
customElementRegistryが指定された場合は、CustomElementRegistryを設定できます。optionsに
isが指定された場合はカスタマイズされた組み込み要素を作成できます。qualifiedNameが(プレフィックス付きも含めて)有効な要素ローカル名でない場合は "
InvalidCharacterError"DOMExceptionが投げられます。以下のいずれかの場合は "
NamespaceError"DOMExceptionが投げられます:- 名前空間プレフィックスがnullでなく、namespaceが空文字の場合。
- 名前空間プレフィックスが"
xml"で、namespaceがXML名前空間でない場合。 - qualifiedNameまたは名前空間プレフィックスが"
xmlns"で、namespaceがXMLNS名前空間でない場合。 - namespaceがXMLNS名前空間で、
qualifiedNameも名前空間プレフィックスも"
xmlns"でない場合。
optionsに
customElementRegistryとisの両方が指定された場合は "NotSupportedError"DOMExceptionが投げられます。 documentFragment = document .createDocumentFragment()- 以下を返します:
DocumentFragmentの ノード。 text = document .createTextNode(data)- 以下を返します:
Textの ノード。その data は data です。 text = document .createCDATASection(data)- 以下を返します:
CDATASectionの ノード。その data は data です。 comment = document .createComment(data)- 以下を返します:
Commentの ノード。その data は data です。 processingInstruction = document .createProcessingInstruction(target, data)-
以下を返します:
ProcessingInstructionの ノード。その target は target、およびその data は data です。 もし target がName生成規則に一致しない場合、"InvalidCharacterError"DOMExceptionがスローされます。 もし data に "?>" が含まれている場合、"InvalidCharacterError"DOMExceptionがスローされます。
要素インターフェースは、nameとnamespaceに対して特に指定がない限り Element です。
HTML標準では、例えばhtmlとHTML名前空間の場合は HTMLHtmlElement
インターフェースが使用されることが定義されています。[HTML]
createElement(localName, options)
メソッドの手順は以下の通りです:
-
localNameが有効な要素ローカル名でない場合は InvalidCharacterError(
InvalidCharacterError・DOMException)を投げる。 -
thisがHTMLドキュメントの場合、localNameをASCII小文字化する。
-
registryとisをoptionsとthisで要素生成オプションを平坦化するで取得する。
-
namespaceを、HTML名前空間とし、 thisがHTMLドキュメントまたは thisのコンテントタイプが"
application/xhtml+xml"の場合はHTML名前空間、それ以外はnull。 -
要素生成を this、localName、namespace、null、is、true、registryで実行した結果を返す。
内部
createElementNS
手順は、document、namespace、qualifiedName、optionsを受け取って以下の手順を実行します:
-
(namespace, prefix, localName)を、"
element"を与えてnamespaceとqualifiedNameを検証・抽出した結果とする。 -
registryとisを、optionsとthisで要素生成オプションの平坦化を行った結果とする。
-
要素生成をdocument、localName、namespace、prefix、is、true、registryで実行した結果を返す。
createElementNS(namespace, qualifiedName, options)
メソッドの手順は、内部 createElementNS 手順を
this、namespace、qualifiedName、optionsで実行した結果を返すことです。
要素生成オプションの平坦化は、文字列または
ElementCreationOptions
辞書optionsとdocument documentを受け取って以下の手順を実行します:
-
registry を、document を与えて カスタム要素レジストリを検索する の結果とする。
-
is を null にする。
-
もし options が辞書である場合:
-
もし options["
customElementRegistry"] 存在する 場合:-
もし is が null でなければ、throw a "
NotSupportedError"DOMExceptionを投げる。 -
registry を options["
customElementRegistry"] に設定する。
-
-
もし registry が null でなく、registry の is scoped が false であり、かつ registry が document の custom element registry でない場合、throw a "
NotSupportedError"DOMExceptionを投げる。
-
registry と is を返す。
createElement()
および createElementNS()
の options
パラメータは、Web互換性のため文字列も許容されます。
createDocumentFragment()メソッドの手順は、新しいDocumentFragment
ノード(ノード文書がthis)を返すことです。
createTextNode(data)メソッドの手順は、新しいText
ノード(データがdata、ノード文書がthis)を返すことです。
createCDATASection(data)メソッドの手順は以下の通りです:
-
thisがHTMLドキュメントなら NotSupportedError "
NotSupportedError"DOMExceptionを投げる。 -
dataに文字列"
]]>"が含まれていれば InvalidCharacterError "InvalidCharacterError"DOMExceptionを投げる。 -
新しい
CDATASectionノード(データがdata、ノード文書がthis)を返す。
createComment(data)メソッドの手順は、新しいComment ノード(データがdata、ノード文書がthis)を返すことです。
createProcessingInstruction(target, data)
メソッドの手順は以下の通りです:
- targetが
Name生成規則に一致しない場合、 InvalidCharacterError "InvalidCharacterError"DOMExceptionを投げる。 - dataに"
?>"が含まれていれば InvalidCharacterError "InvalidCharacterError"DOMExceptionを投げる。 - 新しい
ProcessingInstructionノード(targetがtarget、dataがdata、ノード文書がthis)を返す。
- 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)
メソッドの手順は以下の通りです:
-
nodeがドキュメントまたはシャドウルートなら NotSupportedError "
NotSupportedError"DOMExceptionを投げる。 -
subtreeをfalseにする。
-
registryをnullにする。
-
optionsがbooleanならsubtreeにoptionsを設定する。
-
それ以外の場合:
-
subtreeに options["
selfOnly"]の否定値を設定する。 -
options["
customElementRegistry"] が存在する場合、registryにその値を設定する。 -
registryのis scopedがfalseで、registryがthisのカスタム要素レジストリでない場合、 NotSupportedError "
NotSupportedError"DOMExceptionを投げる。
-
-
registryがnullなら、カスタム要素レジストリの検索をthisで実行した結果をregistryに設定する。
-
ノードのクローンをnodeに対して、documentにthisを、 subtreeにsubtreeを、 fallbackRegistryにregistryを設定して実行した結果を返す。
採用するために、ノード node を 文書 document に:
-
oldDocument を node の ノード文書 とする。
-
もし document が oldDocument でないなら:
-
node の シャドウを含む包含する子孫 のそれぞれ inclusiveDescendant について、シャドウを含む木順 で反復する:
-
inclusiveDescendant の ノード文書 を document に設定する。
-
もし inclusiveDescendant が シャドウルート であり、次のいずれかが真なら:
-
inclusiveDescendant の カスタム要素レジストリ が null であり、 inclusiveDescendant の keep custom element registry null が false の場合;または、
-
inclusiveDescendant の カスタム要素レジストリ が グローバルカスタム要素レジストリである場合
この場合、inclusiveDescendant の カスタム要素レジストリ を document の 有効なグローバルカスタム要素レジストリ に設定する。
-
-
それ以外で、inclusiveDescendant が 要素 である場合:
-
inclusiveDescendant の 属性リスト 内の各 属性 の ノード文書 を document に設定する。
-
もし inclusiveDescendant の カスタム要素レジストリ が null であるか、 または カスタム要素レジストリ の スコープ設定 が false なら、 inclusiveDescendant の カスタム要素レジストリ を document の 有効なグローバルカスタム要素レジストリ に設定する。
-
-
-
node の シャドウを含む包含する子孫 のうち カスタム であるすべての inclusiveDescendant について、 カスタム要素コールバックリアクションをキューに追加する。 inclusiveDescendant、コールバック名 "
adoptedCallback"、および « oldDocument, document » を用いる。 -
node の シャドウを含む包含する子孫 のそれぞれ inclusiveDescendant について、 adopting steps を inclusiveDescendant と oldDocument で実行する。
-
adoptNode(node) メソッド手順は以下の通り:
-
もし node が 文書 なら、例外を投げる "
NotSupportedError"DOMException。 -
もし node が シャドウルート なら、例外を投げる "
HierarchyRequestError"DOMException。 -
もし node が
DocumentFragment型の ノード で、その ホスト が null でない場合は、リターンする。 -
node を返す。
Null または CustomElementRegistry オブジェクト registry
は、
グローバルカスタム要素レジストリである
もし registry が null でなく、かつ
registry の スコープ設定 が false の場合。
文書 document の 有効なグローバルカスタム要素レジストリ は次の通り:
-
もし document の カスタム要素レジストリ グローバルカスタム要素レジストリである なら、document の カスタム要素レジストリ を返す。
-
null を返す。
createAttribute(localName) メソッド手順は以下の通り:
-
もし localName が 有効な属性ローカル名 でない場合、 例外を投げる "
InvalidCharacterError"DOMException。 - もし this が HTML 文書 なら localName を ASCII小文字 での localName に設定する。
- 新しい 属性 を返す。その ローカル名 は localName で、 ノード文書 は this。
createAttributeNS(namespace, qualifiedName)
メソッド手順は以下の通り:
-
(namespace, prefix, localName) を 妥当性検証と抽出した結果とする。 namespace および qualifiedName を "
attribute" を指定して。 -
新しい 属性 を返す。その 名前空間 は namespace、 名前空間接頭辞 は prefix、 ローカル名 は localName、ノード文書 は this。
createEvent(interface)メソッドの手順は以下の通りです:
-
constructorをnullにする。
-
interfaceが次の表の1列目のいずれかの文字列とASCII大文字小文字無視で一致する場合、同じ行の2列目のインターフェースをconstructorに設定する:
文字列 インターフェース 備考 " beforeunloadevent"BeforeUnloadEvent[HTML] " compositionevent"CompositionEvent[UIEVENTS] " customevent"CustomEvent" devicemotionevent"DeviceMotionEvent[DEVICE-ORIENTATION] " deviceorientationevent"DeviceOrientationEvent" dragevent"DragEvent[HTML] " event"Event" events"" focusevent"FocusEvent[UIEVENTS] " hashchangeevent"HashChangeEvent[HTML] " htmlevents"Event" keyboardevent"KeyboardEvent[UIEVENTS] " messageevent"MessageEvent[HTML] " mouseevent"MouseEvent[UIEVENTS] " mouseevents"" storageevent"StorageEvent[HTML] " svgevents"Event" textevent"TextEvent[UIEVENTS] " touchevent"TouchEvent[TOUCH-EVENTS] " uievent"UIEvent[UIEVENTS] " uievents" -
constructorがnullなら NotSupportedError "
NotSupportedError"DOMExceptionを投げる。 -
constructorで示されるインターフェースがthisの関連グローバルオブジェクトに公開されていない場合、 NotSupportedError "
NotSupportedError"DOMExceptionを投げる。通常、ユーザーエージェントは特定の設定でタッチイベントのサポートを無効化している場合があり、その場合この条件によって
TouchEventインターフェースが対象になります。 -
eventをconstructorに与えてイベント生成を実行した結果とする。
-
eventの
type属性を空文字列に初期化する。 -
eventの
timeStamp属性を現在の高精度タイムをthisの関連グローバルオブジェクトで呼び出した結果に初期化する。 -
eventの
isTrusted属性をfalseに初期化する。 -
eventのinitialized flagを解除する。
-
eventを返す。
Event のコンストラクタを使うべきです。
createRange()メソッドの手順は、新しい
ライブレンジを(this, 0)を
開始および
終了として返すことです。
Range()
コンストラクタも代わりに利用できます。
createNodeIterator(root, whatToShow, filter)
メソッドの手順は以下の通りです:
-
iteratorを新しい
NodeIteratorオブジェクトとする。 -
iteratorのpointer before referenceをtrueに設定する。
-
iteratorのwhatToShowをwhatToShowに設定する。
-
iteratorのfilterをfilterに設定する。
-
iteratorを返す。
createTreeWalker(root, whatToShow, filter)
メソッドの手順は以下の通りです:
-
walkerを新しい
TreeWalkerオブジェクトとする。 -
walkerのwhatToShowをwhatToShowに設定する。
-
walkerのfilterをfilterに設定する。
-
walkerを返す。
4.5.1.
インターフェース DOMImplementation
ユーザーエージェントはドキュメントが
作成されるたびにDOMImplementation
オブジェクトを生成し、そのドキュメントに関連付けなければならない。
[Exposed =Window ]interface { [DOMImplementation NewObject ]DocumentType createDocumentType (DOMString ,name DOMString ,publicId DOMString ); [systemId NewObject ]XMLDocument createDocument (DOMString ?, [namespace LegacyNullToEmptyString ]DOMString ,qualifiedName optional DocumentType ?=doctype null ); [NewObject ]Document createHTMLDocument (optional DOMString );title boolean hasFeature (); // useless; always returns true };
doctype = document .implementation.createDocumentType(name, publicId, systemId)-
指定されたname、publicId、systemIdでdoctypeを返します。
nameが有効なドキュメント型名でない場合、"
InvalidCharacterError"DOMExceptionが投げられます。 doc = document .implementation. createDocument(namespace, qualifiedName [, doctype = null])-
XMLDocumentを返します。 文書要素の ローカル名がqualifiedNameで、 名前空間がnamespace(qualifiedNameが空文字列でない場合)となります。また、doctypeが指定されていればそのdoctypeも持ちます。このメソッドは
createElementNS()メソッドと同じ例外を、namespaceとqualifiedNameを指定した場合に投げます。 doc = document .implementation. createHTMLDocument([title])-
documentを返します。
基本的なツリーが既に構築されており、
title要素も含まれます(title引数が省略された場合を除く)。
createDocumentType(name, publicId, systemId)
メソッドの手順は以下の通りです:
-
nameが有効なドキュメント型名でない場合、"
InvalidCharacterError"DOMExceptionを投げる。 -
新しいdoctypeを返す。その nameはname、 public IDはpublicId、 system IDはsystemId、 ノード文書は document(thisに関連付けられたもの)に設定する。
createDocument(namespace, qualifiedName, doctype)
メソッドの手順は以下の通りです:
-
documentを新しい
XMLDocumentとする。 -
elementをnullとする。
-
qualifiedNameが空文字列でなければ、elementに 内部
createElementNS手順をdocument、namespace、qualifiedName、空の辞書で実行した結果を設定する。 -
doctypeが非nullなら、追加でdoctypeをdocumentに追加する。
-
elementが非nullなら、追加でelementをdocumentに追加する。
-
documentのコンテントタイプはnamespaceによって決定される:
-
documentを返す。
createHTMLDocument(title)
メソッドの手順は以下の通りです:
-
docを新しいdocument(HTMLドキュメント)とする。
-
docのコンテントタイプを"
text/html"に設定する。 -
titleが指定されていれば:
-
docを返す。
hasFeature()
メソッドの手順はtrueを返すことです。
hasFeature()
は元々ユーザーエージェントが指定したDOM機能をサポートしているかどうか返す用途でしたが、実際にはオブジェクトや属性、メソッドの有無をチェックする方が信頼性が高く、細かい判定ができます。
そのため現在は使用されませんが、古いページが動作しなくならないように(常にtrueを返す)残されています。
4.6. インターフェース DocumentType
[Exposed =Window ]interface :DocumentType Node {readonly attribute DOMString name ;readonly attribute DOMString publicId ;readonly attribute DOMString systemId ; };
DocumentType
ノードは単に
doctypeとして知られています。
Doctypeには、 関連付けられた name、 public ID、 system ID があります。
Doctypeが作成されるとき、 nameは 必ず与えられます。Doctypeが作成される際に明示的に与えられない限り、 public IDと system IDは 空文字列になります。
nameゲッター手順は、
thisの
nameを返すことです。
publicIdゲッター手順は、
thisの
public
IDを返すことです。
systemIdゲッター手順は、
thisの
system
IDを返すことです。
4.7.
インターフェイス DocumentFragment
[Exposed =Window ]interface :DocumentFragment Node {constructor (); };
DocumentFragment
ノードには、
関連付けられたhost(null もしくは別のノードツリー内の要素)があります。特別な記述がない限り、null です。
オブジェクト A がオブジェクト B の host を含む包括的祖先 であるとは、A が 包括的祖先である場合、 または B の rootが非 null のhostを持ち、 A が B の root の hostの host を含む包括的祖先である場合です。
DocumentFragment
ノード の
ホスト
の概念は、HTMLの
template
要素や
シャドウルート
に有用であり、
挿入前
および
置換
アルゴリズムに影響を与える。
tree = newDocumentFragment()- 新しい
DocumentFragmentノード を返す。
new DocumentFragment()
コンストラクタ手順は、thisのノード文書を
現在のグローバルオブジェクトの関連付けられたDocument
に設定することです。
4.8. インターフェイス ShadowRoot
[Exposed =Window ]interface :ShadowRoot DocumentFragment {readonly attribute ShadowRootMode mode ;readonly attribute boolean delegatesFocus ;readonly attribute SlotAssignmentMode slotAssignment ;readonly attribute boolean clonable ;readonly attribute boolean serializable ;readonly attribute Element host ;attribute EventHandler onslotchange ; };enum {ShadowRootMode ,"open" };"closed" enum {SlotAssignmentMode ,"manual" };"named"
ShadowRoot
ノードは単に
シャドウルートとして知られている。
シャドウルートには
モード
("open" または "closed")が関連付けられている。
シャドウルートには delegates focus (真偽値)が関連付けられている。初期値はfalseである。
シャドウルートには available to element internals (真偽値)が関連付けられている。初期値はfalseである。
シャドウルートには declarative (真偽値)が関連付けられている。初期値はfalseである。
シャドウルートには
slot assignment
("manual" または "named")が関連付けられている。
シャドウルートには clonable (真偽値)が関連付けられている。初期値はfalseである。
シャドウルートには serializable (真偽値)が関連付けられている。初期値はfalseである。
シャドウルートには
カスタム要素レジストリ
(null または CustomElementRegistry
オブジェクト)が関連付けられている。初期値はnullである。
シャドウルートには keep custom element registry null (真偽値)が関連付けられている。初期値はfalseである。
これは宣言的シャドウルートと組み合わせてのみ真になり得る。また、シャドウルートの カスタム要素レジストリ がnullである間だけ意味がある。
シャドウルートの 親を取得 アルゴリズムは、eventを受け取り、eventのcomposed flagがunsetで シャドウルートが eventのパスの最初のstructの 起動ターゲットの rootの場合、nullを返す; それ以外はシャドウルートの ホストを返す。
mode
のゲッターの手順は
thisの
モードを返すことである。
delegatesFocus
のゲッターの手順は
thisの
delegates focus
を返すことである。
slotAssignment
のゲッターの手順は
thisの
slot
assignment
を返すことである。
clonable
のゲッターの手順は
thisの
clonable
を返すことである。
serializable
のゲッターの手順は
thisの
serializable
を返すことである。
host
のゲッターの手順は
thisの
host
を返すことである。
onslotchange
属性は
イベントハンドラーIDL属性
であり、
onslotchange
イベントハンドラーである。その
イベントハンドラーイベント型
は slotchange
である。
シャドウを含む木順は、 シャドウを含む先行・深さ優先走査 によりノードツリーを辿る。 シャドウを含む先行・深さ優先走査 とは、ノードツリー tree に対して、tree内で遭遇した各シャドウホストについて、その シャドウルートの ノードツリーも、 その直後に同様の走査を行う、という形での先行・深さ優先探索である。
シャドウを含むroot とは、オブジェクトのrootが シャドウルートである場合、 そのホストの シャドウを含むrootがそれに該当し、 そうでなければ単にそのrootとなる。
オブジェクトAが、オブジェクトBの シャドウを含む子孫 であるとは、AがBの子孫である場合、 またはAのrootが シャドウルートで、かつ Aのrootの ホストが Bのシャドウを含む包含する子孫で ある場合である。
シャドウを含む包含する子孫 とは、自分自身またはそのシャドウを含む子孫の一つである。
オブジェクトAが、オブジェクトBの シャドウを含む祖先 であるとは、かつその時に限り、BがAのシャドウを含む子孫である場合である。
シャドウを含む包含する祖先 とは、自分自身またはそのシャドウを含む祖先の一つである。
ノードAが ノードBから closed-shadow-hidden になるとは、次のすべての条件が成り立つときである:
オブジェクトAをオブジェクトBに対して retarget するには、オブジェクトが返るまで次の手順を繰り返す:
-
次のいずれかが真であれば
このときAを返す。
retargeting アルゴリズムは イベントディスパッチ や他の仕様(例えば Fullscreen [FULLSCREEN]) でも利用されている。
4.9. インターフェイス Element
[Exposed =Window ]interface :Element Node {readonly attribute DOMString ?namespaceURI ;readonly attribute DOMString ?prefix ;readonly attribute DOMString localName ;readonly attribute DOMString tagName ; [CEReactions ]attribute DOMString id ; [CEReactions ]attribute DOMString className ; [SameObject ,PutForwards =value ]readonly attribute DOMTokenList classList ; [CEReactions ,Unscopable ]attribute DOMString slot ;boolean hasAttributes (); [SameObject ]readonly attribute NamedNodeMap attributes ;sequence <DOMString >getAttributeNames ();DOMString ?getAttribute (DOMString );qualifiedName DOMString ?getAttributeNS (DOMString ?,namespace DOMString ); [localName CEReactions ]undefined setAttribute (DOMString , (qualifiedName TrustedType or DOMString )); [value CEReactions ]undefined setAttributeNS (DOMString ?,namespace DOMString , (qualifiedName TrustedType or DOMString )); [value CEReactions ]undefined removeAttribute (DOMString ); [qualifiedName CEReactions ]undefined removeAttributeNS (DOMString ?,namespace DOMString ); [localName CEReactions ]boolean toggleAttribute (DOMString ,qualifiedName optional boolean );force boolean hasAttribute (DOMString );qualifiedName boolean hasAttributeNS (DOMString ?,namespace DOMString );localName Attr ?getAttributeNode (DOMString );qualifiedName Attr ?getAttributeNodeNS (DOMString ?,namespace DOMString ); [localName CEReactions ]Attr ?setAttributeNode (Attr ); [attr CEReactions ]Attr ?setAttributeNodeNS (Attr ); [attr CEReactions ]Attr removeAttributeNode (Attr );attr ShadowRoot attachShadow (ShadowRootInit );init readonly attribute ShadowRoot ?shadowRoot ;readonly attribute CustomElementRegistry ?customElementRegistry ;Element ?closest (DOMString );selectors boolean matches (DOMString );selectors boolean webkitMatchesSelector (DOMString ); // legacy alias of .matchesselectors HTMLCollection getElementsByTagName (DOMString );qualifiedName HTMLCollection getElementsByTagNameNS (DOMString ?,namespace DOMString );localName HTMLCollection getElementsByClassName (DOMString ); [classNames CEReactions ]Element ?insertAdjacentElement (DOMString ,where Element ); // legacyelement undefined insertAdjacentText (DOMString ,where DOMString ); // legacy };data dictionary {ShadowRootInit required ShadowRootMode ;mode boolean =delegatesFocus false ;SlotAssignmentMode = "named";slotAssignment boolean =clonable false ;boolean =serializable false ;CustomElementRegistry ?; };customElementRegistry
ShadowRootInit
はやや珍しく、undefinedおよびnullの両方を
customElementRegistry
メンバーに渡すことができ、Web
開発者が辞書ではなくShadowRoot
ノードをattachShadow()
に渡せるようにしています。
要素には、次の関連付けられた値があります:
- 名前空間
- null または空でない文字列。
- 名前空間接頭辞
- null または空でない文字列。
- ローカル名
- 空でない文字列。
- カスタム要素レジストリ
- null または
CustomElementRegistryオブジェクト。 - カスタム要素状態
- "
undefined", "failed", "uncustomized", "precustomized", または "custom"。 - カスタム要素定義
- null または カスタム要素定義。
is値- null または 有効なカスタム要素名。
要素が作成されるとき、 これらすべての値が 初期化されます。
要素のカスタム要素状態が
"uncustomized" または "custom" である場合、
定義済みとされます。要素の
カスタム要素状態が "custom" である場合、
カスタムとされます。
要素が定義済みかどうかは、
:defined
疑似クラスの挙動を決定するために使われます。要素がカスタムかどうかは
mutation アルゴリズムの挙動を決定するために使われます。
"failed"および"precustomized"状態は、
カスタム要素コンストラクタが初回に正しく実行されない場合、
upgradeによって再度実行されないよう保証するために使われます。
以下のコードは、これら4つの状態それぞれの要素を示します:
<!DOCTYPE html>
< script >
window. customElements. define( "sw-rey" , class extends HTMLElement {})
window. customElements. define( "sw-finn" , class extends HTMLElement {}, { extends : "p" })
window. customElements. define( "sw-kylo" , class extends HTMLElement {
constructor () {
// super() intentionally omitted for this example
}
})
</ script >
<!-- "undefined" (未定義、カスタムでない) -->
< sw-han ></ sw-han >
< p is = "sw-luke" ></ p >
< p is = "asdf" ></ p >
<!-- "failed" (未定義、カスタムでない) -->
< sw-kylo ></ sw-kylo >
<!-- "uncustomized" (定義済み、カスタムでない) -->
< p ></ p >
< asdf ></ asdf >
<!-- "custom" (定義済み、カスタム) -->
< sw-rey ></ sw-rey >
< p is = "sw-finn" ></ p >
要素にも、 関連付けられた シャドウルート(null または シャドウルート)があります。特別な記述がない限り null です。 要素は、 そのシャドウルートが null でない場合、 シャドウホストとされます。
要素の
qualified name(修飾名)は、
名前空間接頭辞が null の場合は
ローカル名、
そうでなければ、
名前空間接頭辞、":"、そして
ローカル名を順に連結したものです。
要素の HTML大文字修飾名は、次の手順の戻り値です:
ユーザーエージェントは 修飾名や HTML大文字修飾名を内部スロットに格納することで最適化可能です。
要素を作成するには、
document
document、文字列 localName、文字列または null namespace、
オプションで文字列または null prefix(省略時は null)、文字列または null is(省略時は null)、
真偽値 synchronousCustomElements(省略時は false)、
"default"、null、または CustomElementRegistry
オブジェクト registry(省略時は "default")を与えて次の手順を実行します:
-
result を null にする。
-
registry が "
default" なら、 registry を カスタム要素レジストリの検索の結果にする(引数は document)。 -
definition を カスタム要素定義の検索 の結果にする(引数は registry, namespace, localName, is)。
-
definition が null でなく、かつ definition の name が local name と等しくない場合(つまり カスタマイズされた組み込み要素の場合):
-
interface を element interfaceの localName と HTML名前空間に対するものにする。
-
result を 要素内部の作成の結果にする (引数は document, interface, localName, HTML名前空間, prefix, "
undefined", is, registry)。 -
synchronousCustomElements が true の場合、例外をキャッチしつつ下記を実行:
このステップで例外 exception が発生した場合:
-
例外を報告する exception を definition の constructor に対応する JavaScript オブジェクトの 関連付けられた realm の グローバルオブジェクト に対して報告する。
-
result の カスタム要素状態を "
failed" に設定する。
-
-
それ以外の場合は カスタム要素アップグレードリアクションをキューする (引数は result と definition)。
-
-
それ以外で definition が null でない場合:
-
synchronousCustomElements が true の場合:
-
C を definition の constructor とする。
-
surrounding agent の active custom element constructor map[C] に registry を設定する。
-
例外をキャッチしつつ次を実行:
-
result を C を構築する結果にする(引数なし)。
-
Assert: result の 名前空間は HTML 名前空間。
IDL により result は
HTMLElementオブジェクトとなり、すべて HTML 名前空間を使用します。 -
result の 属性リストが 空でない場合は、 NotSupportedError
DOMExceptionをスローする。 -
result に 子がある場合は、 NotSupportedError
DOMExceptionをスローする。 -
result の 親が null でない場合は NotSupportedError
DOMExceptionをスローする。 -
result の ノード文書が documentでない場合は NotSupportedError
DOMExceptionをスローする。 -
result の ローカル名が localNameと等しくない場合は NotSupportedError
DOMExceptionをスローする。 -
result の 名前空間接頭辞を prefixに設定する。
-
result の
is値を null に設定する。 -
result の カスタム要素レジストリを registryに設定する。
これらのステップで例外 exception が発生した場合:
-
例外を報告する exception を definition の constructor に対応する JavaScript オブジェクトの 関連付けられた realm の グローバルオブジェクト に対して報告する。
-
result を 要素内部の作成の結果にする (引数は document,
HTMLUnknownElement, localName, HTML名前空間, prefix, "failed", null, registry)。
-
-
surrounding agent の active custom element constructor map[C] を削除する。
通常はこの時点でもう削除されているはずです。
-
-
それ以外の場合:
-
result を 要素内部の作成の結果にする (引数は document,
HTMLElement, localName, HTML名前空間, prefix, "undefined", null, registry)。 -
カスタム要素アップグレードリアクションをキューする (引数は result と definition)。
-
-
-
それ以外の場合:
-
interface を element interface の localName と namespaceに対するものにする。
-
result を 要素内部の作成の結果にする (引数は document, interface, localName, namespace, prefix, "
uncustomized", is, registry)。 -
namespace が HTML名前空間であり、 localName が 有効なカスタム要素名であるか、is が null でない場合は result の カスタム要素状態を "
undefined" に設定する。
-
-
result を返す。
要素内部を作成するには、document document、インターフェイス interface、文字列
localName、文字列または null namespace、文字列または null prefix、文字列
state、文字列または null is、null または CustomElementRegistry
オブジェクト registry を与えて次の手順を実行します:
-
element を新しい要素(interfaceを実装し、 名前空間を namespace、 名前空間接頭辞を prefix、 ローカル名を localName、 カスタム要素レジストリを registry、 カスタム要素状態を state、 カスタム要素定義を null、
is値を is、 ノード文書を documentに設定したもの)とする。 -
elementを返す。
要素には
属性リストもあり、これは
リストで
NamedNodeMap
を通して公開されます。
要素が作成される際に明示的に与えられない限り、
その属性リストは
空です。
要素は 属性を持つとは、その属性リストが 属性Aを 含む場合です。
これおよび他の仕様は 属性変更手順を 要素に対して定義することができます。アルゴリズムには element、localName、 oldValue、value、namespaceが渡されます。
属性変更を処理するには、 属性 attribute、element、oldValue、newValueを使い、下記手順を実行します:
-
mutation record の "
attributes" を elementに対して、attributeのローカル名、attributeの 名前空間、oldValue、« »、« »、null、null で キューする。 -
element が カスタムなら、 カスタム要素コールバックリアクションをキューする (引数は element、コールバック名 "
attributeChangedCallback"、« attributeのローカル名、 oldValue、newValue、attributeの名前空間 »)。 -
属性変更手順を element、attributeの ローカル名、oldValue、 newValue、attributeの 名前空間で実行する。
属性を変更するには、 属性 attribute を valueに変更する場合、次の手順を実行します:
属性を追加するには、 属性 attribute を 要素 element に追加する場合、次の手順を実行します:
-
attributeの要素を elementに設定する。
属性を除去するには、 属性 attribute を除去する場合、次の手順を実行します:
属性を置換するには、 属性 oldAttribute を 属性 newAttributeで置換する場合:
-
element を oldAttributeの要素とする。
-
newAttributeの要素を elementに設定する。
-
oldAttributeの要素を null に設定する。
-
属性変更を処理する(引数は oldAttribute、element、oldAttributeの値、newAttributeの 値)。
文字列 qualifiedName と要素 elementを与えて 名前で属性を取得するには:
null または文字列 namespace、文字列 localName、要素 elementを与えて 名前空間とローカル名で属性を取得するには:
要素 element、文字列 localName、オプションの null または文字列 namespace(省略時は null)を与えて 属性値を取得するには:
属性を設定するには、 属性 attr と 要素 element を与える:
-
verifiedValue を、 get trusted type compliant attribute value に attr の local name、 attr の namespace、 element、 attr の value を渡して呼び出した結果とする。[TRUSTED-TYPES]
-
もし attr の element が null でもなく、かつ element でもない場合は、 throw し、 "
InUseAttributeError"DOMExceptionを発生させる。 -
oldAttr を、 属性を取得する(attr の namespace、attr の local name、element を与える)した結果とする。
-
もし oldAttr が attr であれば、attr を返す。
-
attr の value を verifiedValue に設定する。
-
oldAttr が null でなければ、置換する(oldAttr を attr で)。
-
そうでなければ、追加する(attr を element に)。
-
oldAttr を返す。
属性値を設定するには、 要素 element、文字列 localName、文字列 value、 省略可能な null または文字列 prefix(既定値は null)、省略可能な null または文字列 namespace(既定値は null)を与える:
- attribute を、 属性を取得する(namespace、localName、element を与える)した結果とする。
- もし attribute が null であれば、属性を作成し、namespace を namespace、namespace prefix を prefix、local name を localName、value を value、node document を element の node document とし、 これを追加して element に追加し、リターンする。
-
変更する(attribute の値を value に)。
文字列 qualifiedName と要素 elementを与えて 名前で属性を除去するには:
-
attr を 名前で属性を取得するの結果とする(引数は qualifiedName, element)。
-
attr が null でなければ、除去 attr。
-
attr を返す。
null または文字列 namespace、文字列 localName、要素 elementを与えて 名前空間とローカル名で属性を除去するには:
要素は 一意な識別子(ID)を持つことができます。
歴史的には要素は複数の識別子を持つことができました(例:HTMLのid属性やDTD)。この仕様はID
をDOMの概念とし、要素ごとに1つだけ許可し、その値は
id属性によって与えられます。
-
もし localName が
idであり、namespace が null かつ value が null または空文字列であれば、element の ID を未設定にする。 -
それ以外で localName が
idかつ namespace が null の場合、element の ID を value に設定する。
本仕様は、あらゆる 要素 における class、id、
slot 属性について要件を定義しているが、それらを使用することが適合であるかどうかは定めていない。
ノード の Element 型の 親は、その
親要素(parent
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内容属性の値を返します。設定することで値を変更できます。
文字列nameを反映するよう定義されたIDL属性は、以下のgetter・setter手順を持ちます:
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) -
qualifiedName に一致する element の最初の 属性 の値を返します。該当する 属性 がなければ null を返します。
-
element . getAttributeNS(namespace, localName) -
namespace かつ localName に一致する element の 属性 の値を返します。該当する 属性 がなければ null を返します。
-
element . setAttribute(qualifiedName, value) -
element . setAttributeNS(namespace, localName, value) -
namespace かつ localName に一致する element の 属性 の 値 を value に設定します。
-
element . removeAttribute(qualifiedName) -
qualifiedName に一致する element の最初の 属性 を削除します。
-
element . removeAttributeNS(namespace, localName) -
namespace かつ localName に一致する element の 属性 を削除します。
-
element . toggleAttribute(qualifiedName [, force]) -
force が指定されていなければ qualifiedName をトグルします。存在すれば削除、なければ追加します。force が true なら qualifiedName を追加し、false なら削除します。
今 qualifiedName が存在していれば true、そうでなければ false を返します。
-
element . hasAttribute(qualifiedName) -
element が qualifiedName に一致する 属性 を持つ場合は true、そうでなければ false を返します。
-
element . hasAttributeNS(namespace, localName) -
element が namespace かつ localName に一致する 属性 を持つ場合は true を返します。
hasAttributes()メソッド手順は、thisの属性リストが空であればfalse、そうでなければtrueを返すことです。
attributesゲッター手順は、
関連付けられたNamedNodeMapを返すことです。
getAttributeNames()メソッド手順は
修飾名を属性ごとに、thisの
属性リストの順序で返すことです。なければ新しいリストを返します。
これらは一意である保証はありません。
getAttribute(qualifiedName)メソッド手順は以下の通りです:
-
attr を 名前で属性を取得する(引数は qualifiedName と this)の結果とする。
-
attr が null なら、null を返す。
-
attr の値を返す。
getAttributeNS(namespace, localName)メソッド手順は以下の通りです:
-
attr を 名前空間とローカル名で属性を取得する(引数は namespace, localName, this)の結果とする。
-
attr が null なら、null を返す。
-
attr の値を返す。
setAttribute(qualifiedName, value)メソッド手順は以下の通りです:
-
もし qualifiedName が有効な属性ローカル名でない場合、throwし、 "
InvalidCharacterError"DOMExceptionを発生させる。パラメータ名とは異なり、 qualifiedName は、既にその修飾名の属性が存在する場合のみ 修飾名として扱われる。それ以外の場合は新しい属性のローカル名として扱われる。バリデーションが必要なのは後者の場合のみである。
-
this がHTML 名前空間にあり、そのノードドキュメントがHTML ドキュメントである場合、 qualifiedName をASCII 小文字に変換する。
-
verifiedValue を、 get trusted type compliant attribute value に qualifiedName, null, this, value を渡して呼び出した結果とする。[TRUSTED-TYPES]
-
attribute を、属性リスト内で 修飾名 が qualifiedName である最初の属性(なければ null)とする。
-
attribute が null でなければ、変更し、attribute の値を verifiedValue にして return する。
-
attribute を新しい 属性とし、そのローカル名を qualifiedName、値を verifiedValue、ノードドキュメントを this の ノードドキュメントとする。
setAttributeNS(namespace, qualifiedName, value)
メソッドの手順は以下のとおり:
-
(namespace, prefix, localName) を バリデートし抽出する(namespace および qualifiedName、"element" を指定)した結果とする。
-
verifiedValue を、 get trusted type compliant attribute value に localName, namespace, this, value を渡して呼び出した結果とする。[TRUSTED-TYPES]
-
属性値を設定する(this、localName、verifiedValue、prefix、namespace を使用)。
removeAttribute(qualifiedName)
メソッドの手順は、属性を削除する(qualifiedName、this
を与える)を実行し、undefined を返す。
removeAttributeNS(namespace, localName)
メソッドの手順は、属性を削除する
(namespace、localName、this を与える)を実行し、undefined を返す。
hasAttribute(qualifiedName) メソッドの手順は以下のとおり:
-
this がHTML 名前空間にあり、そのノードドキュメントがHTML ドキュメントである場合、 qualifiedName をASCII 小文字に変換する。
-
this が 属性を持つ場合、かつその修飾名が qualifiedName の場合は true、そうでなければ false を返す。
toggleAttribute(qualifiedName, force)
メソッドの手順は以下のとおり:
-
もし qualifiedName が有効な属性ローカル名でない場合、throwし、 "
InvalidCharacterError"DOMExceptionを発生させる。なぜローカル名としてバリデートするのかは、上記の議論を参照。
-
this がHTML 名前空間にあり、そのノードドキュメントがHTML ドキュメントである場合、 qualifiedName をASCII 小文字に変換する。
-
attribute を、属性リスト内で 修飾名が qualifiedName である最初の属性(なければ null)とする。
-
attribute が null の場合:
-
それ以外の場合、force が指定されていないか false の場合は、 属性を削除する(qualifiedName、this を与える)を実行し、false を返す。
-
true を返す。
hasAttributeNS(namespace, localName)
メソッドの手順は以下のとおり:
-
namespace が空文字列であれば、null に設定する。
-
this が 属性を持つ場合、かつその名前空間が namespace で、ローカル名が localName の場合は true、そうでなければ false を返す。
getAttributeNode(qualifiedName)
メソッドの手順は、属性を取得する(qualifiedName、this
を与える)した結果を返す。
getAttributeNodeNS(namespace, localName)
メソッドの手順は、属性を取得する(namespace、localName、this
を与える)した結果を返す。
setAttributeNode(attr) および
setAttributeNodeNS(attr) メソッドの手順は、
属性を設定する(attr、this)の結果を返す。
removeAttributeNode(attr)
メソッドの手順は以下のとおり:
-
this の属性リストが attr を含まない場合、throwし、"
NotFoundError"DOMExceptionを発生させる。 -
削除する attr。
-
attr を返す。
shadow = element .attachShadow(init)-
elementにシャドウルートを生成し、それを返します。
shadow = element .shadowRoot-
elementのシャドウルート(存在する場合、かつシャドウルートのmodeが"
open"の場合)を返します。そうでなければnull。
有効なシャドウホスト名は:
- 有効なカスタム要素名
- "
article", "aside", "blockquote", "body", "div", "footer", "h1", "h2", "h3", "h4", "h5", "h6", "header", "main", "nav", "p", "section", または "span"
attachShadow(init) メソッドの手順は以下の通り:
-
registry を this の node document の カスタム要素レジストリ とする。
-
もし init["
customElementRegistry"] が 存在する 場合、 registry にその値を設定する。 -
もし registry が non-null で、registry の is scoped が false であり、かつ registry が this の node document の custom element registry でない場合、throw a "
NotSupportedError"DOMExceptionを投げる。 -
シャドウルートをアタッチする を this, init["
mode"], init["clonable"], init["serializable"], init["delegatesFocus"], init["slotAssignment"], および registry で実行する。
シャドウルートを付与するには、
要素
element、文字列 mode、真偽値 clonable、
真偽値 serializable、真偽値 delegatesFocus、文字列
slotAssignment、null または CustomElementRegistry
オブジェクト registryを与える:
-
elementの名前空間がHTML名前空間でない場合、 NotSupportedError
NotSupportedErrorDOMExceptionをスローする。 -
elementのローカル名が 有効なシャドウホスト名でない場合、 NotSupportedError
NotSupportedErrorDOMExceptionをスローする。 -
elementのローカル名が有効なカスタム要素名である、または elementの
is値がnullでない場合:-
definition を カスタム要素定義の検索 (引数は elementのカスタム要素レジストリ、名前空間、ローカル名、
is値)とする。 -
definitionが null でなく、かつ definitionの disable shadowがtrueなら、 NotSupportedError
NotSupportedErrorDOMExceptionをスローする。
-
-
elementがシャドウホストの場合:
-
currentShadowRoot を elementのシャドウルートとする。
-
以下いずれかが真の場合:
-
currentShadowRootのdeclarativeがfalse
-
currentShadowRootのmodeが modeと異なる
この場合は NotSupportedError
NotSupportedErrorDOMExceptionをスローする。 -
-
それ以外の場合:
-
currentShadowRootのdeclarativeをfalseにする。
-
return。
-
-
shadow を新しい シャドウルート とし、その ノード文書 は element の ノード文書、ホスト は element、モード は mode である。
-
shadowのdelegates focusを delegatesFocusに設定する。
-
elementのカスタム要素状態が"
precustomized"または"custom"の場合、 shadowのelement internalsで利用可能をtrueにする。 -
shadowのslot assignmentを slotAssignmentに設定する。
-
shadowのdeclarativeをfalseに設定する。
-
shadowのclonableを clonableに設定する。
-
shadowのserializableを serializableに設定する。
-
shadowのcustom element registryを registryに設定する。
-
elementのシャドウルートを shadowに設定する。
shadowRoot ゲッターの手順は次の通り:
-
registry = element .customElementRegistry -
element の
CustomElementRegistryオブジェクト(存在する場合)、なければ null を返す。
customElementRegistry ゲッターの手順は、
this の
カスタム要素レジストリを返すこと。
-
element .closest(selectors) - element から始めて、selectors にマッチする最初の 包含祖先を返し、見つからなければ null を返す。
-
element .matches(selectors) - element の ルート で selectors をマッチングしたときに element が得られれば true、そうでなければ false を返す。
closest(selectors) メソッドの手順は:
-
s を セレクターを構文解析する(selectors から)。 [SELECTORS4]
-
もし s が失敗なら、throw し、 "
SyntaxError"DOMExceptionを発生させる。 -
elements の各 element について: もし セレクターを要素に対して照合する が s、element、および scoping root this を用いて成功を返すなら、element を返します。 [SELECTORS4]
-
null を返す。
matches(selectors) および
webkitMatchesSelector(selectors)
メソッドの手順は:
-
s を セレクターを構文解析する(selectors から)。 [SELECTORS4]
-
もし s が失敗なら、throw し、 "
SyntaxError"DOMExceptionを発生させる。 -
セレクターを要素にマッチさせる(s、this、スコープルート this)で成功なら true、そうでなければ false を返す。[SELECTORS4]
getElementsByTagName(qualifiedName)
メソッドの手順は、qualifiedName を持つ要素のリスト を
this について返すこと。
getElementsByTagNameNS(namespace, localName)
メソッドの手順は、namespace と localName を持つ要素のリスト を
this について返すこと。
getElementsByClassName(classNames)
メソッドの手順は、classNames を持つ要素のリスト を
this について返すこと。
隣接挿入するには、 要素 element、文字列 where、 そして ノード node を受け取り、 where に対する最初の ASCII大文字小文字無視一致に関連付けられた手順を実行する:
- "
beforebegin" -
もし element の 親 が null なら、null を返す。
- "
afterbegin" - "
beforeend" -
element において null の前で node を 事前挿入した結果を返す。
- "
afterend" -
もし element の 親 が null なら、null を返す。
- それ以外
insertAdjacentElement(where, element)
メソッドの手順は、隣接挿入を実行し、
this、where、element を与えて返すことである。
insertAdjacentText(where, data)
メソッドの手順は以下の通り:
このメソッドは我々が設計する前から存在していたため何も返さない。
4.9.1.
インターフェイス NamedNodeMap
[Exposed =Window ,LegacyUnenumerableNamedProperties ]interface {NamedNodeMap readonly attribute unsigned long length ;getter Attr ?item (unsigned long );index getter Attr ?getNamedItem (DOMString );qualifiedName Attr ?getNamedItemNS (DOMString ?,namespace DOMString ); [localName CEReactions ]Attr ?setNamedItem (Attr ); [attr CEReactions ]Attr ?setNamedItemNS (Attr ); [attr CEReactions ]Attr removeNamedItem (DOMString ); [qualifiedName CEReactions ]Attr removeNamedItemNS (DOMString ?,namespace DOMString ); };localName
NamedNodeMap
には関連付けられた
要素(要素)があります。
NamedNodeMap
オブジェクトの
属性リストは、その
要素の
属性リストです。
NamedNodeMap
オブジェクトの対応プロパティインデックスは、属性リストのサイズから 1 を引いた範囲の 0
からの数字です。ただし、
属性リストが空の場合は対応プロパティインデックスはありません。
lengthゲッター手順は
属性リストのサイズを返すことです。
item(index)メソッド手順は:
NamedNodeMap
オブジェクトの サポートされているプロパティ名は、次の手順を実行した結果である:
-
names を、この
NamedNodeMapオブジェクトの 属性リスト内の 属性 の 修飾名(重複を除去し順序はそのまま)とする。 -
この
NamedNodeMapオブジェクトの 要素 が HTML 名前空間にあり、かつその ノードドキュメント が HTML ドキュメント である場合は、 各 names の name について:-
lowercaseName を name の ASCII 小文字とする。
-
もし lowercaseName と name が等しくないなら、names から name を削除する。
-
-
names を返す。
getNamedItem(qualifiedName)
メソッド手順は名前で属性を取得する(引数は qualifiedName, element)の結果を返すことです。
getNamedItemNS(namespace, localName)
メソッド手順は名前空間とローカル名で属性を取得する(引数は
namespace, localName, element)の結果を返すことです。
setNamedItem(attr)および
setNamedItemNS(attr)メソッド手順は
属性を設定する(引数は attr, element)の結果を返すことです。
removeNamedItem(qualifiedName)
メソッド手順は:
-
attr を 名前で属性を除去する(引数は qualifiedName, element)の結果とする。
-
attr が null なら、NotFoundError
NotFoundErrorDOMExceptionをスローする。 -
attr を返す。
removeNamedItemNS(namespace, localName)
メソッド手順は:
-
attr を 名前空間とローカル名で属性を除去する(引数は namespace, localName, element)の結果とする。
-
attr が null なら、NotFoundError
NotFoundErrorDOMExceptionをスローする。 -
attr を返す。
4.9.2. インターフェイス Attr
[Exposed =Window ]interface :Attr Node {readonly attribute DOMString ?namespaceURI ;readonly attribute DOMString ?prefix ;readonly attribute DOMString localName ;readonly attribute DOMString name ; [CEReactions ]attribute DOMString value ;readonly attribute Element ?ownerElement ;readonly attribute boolean specified ; // useless; always returns true };
Attr ノードは単に
属性として知られています。混乱を避けるために 内容属性 と呼ばれることもあります(IDL属性と区別するため)。
属性は、 名前空間(null または空でない文字列)、 名前空間プリフィックス(null または空でない文字列)、 ローカル名(空でない文字列)、 値(文字列)、および 要素(null または 要素)を持ちます。
もし今設計されるなら、名前と値だけを持たせただろう、とのことです。☹
属性の
修飾名は、
名前空間プリフィックスが null であれば
ローカル名であり、
そうでなければ
名前空間プリフィックス+":"+
ローカル名となります。
ユーザーエージェントは最適化のためにこれを内部スロットとして持つことができます。
属性が作成されるとき、 そのローカル名が与えられます。 属性が作成されるときに明示的に与えられない限り、 その 名前空間、 名前空間プリフィックス、 要素 は null になり、 値 は空文字列に設定されます。
A 属性
とは、属性で、
ローカル名が
A であり、
名前空間 と
名前空間プリフィックス が null であるものを指します。
namespaceURI ゲッターの手順は、
this の
名前空間 を返すことです。
prefix ゲッターの手順は、
this の
名前空間プリフィックス を返すことです。
localName ゲッターの手順は、
this の
ローカル名 を返すことです。
name ゲッターの手順は、
this の
修飾名 を返すことです。
value ゲッターの手順は、
this の
値
を返すことです。
既存の属性値を設定するには、属性 attribute と文字列 value を与えて次の手順を実行します:
-
もし attribute の 要素 が null であれば、 attribute の 値 を value に設定して return する。
-
element を attribute の 要素 とする。
-
verifiedValue を、 get trusted type compliant attribute value に attribute の ローカル名、attribute の 名前空間、element、value を渡して呼び出した結果とする。[TRUSTED-TYPES]
-
もし attribute の 要素 が null であれば、 attribute の 値 を verifiedValue に設定して return する。
-
変更 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 の nodes によって使用されます。
各 node は、CharacterData
インターフェイスを継承している場合、関連付けられた可変の文字列である data を持ちます。
データを置換するには、 ノード node、オフセットoffset、カウントcount、データdataを与えて、次の手順を実行します:
- length を nodeのlengthとする。
- offset が length より大きい場合、IndexSizeError
IndexSizeErrorDOMExceptionをスローする。 - offset + count が length より大きい場合、 count を length - offset に設定する。
-
mutation record の "
characterData" を nodeに対し、null, null, nodeのdata, « », « », null, null でキューする。 - nodeのdataの offsetコード単位の後ろにdataを挿入する。
- delete offset を offset + dataのlengthとする。
- delete offsetコード単位から countコード単位を nodeのdataから削除する。
-
各live rangeで start nodeがnode、 start offsetがoffsetより大きく、 offset + count以下の場合、そのstart offsetを offsetに設定する。
-
各live rangeで end nodeがnode、 end offsetがoffsetより大きく、 offset + count以下の場合、そのend offsetを offsetに設定する。
-
各live rangeで start nodeがnode、 start offsetがoffset + countより大きい場合、 start offsetをdataのlengthだけ増やし、countだけ減らす。
-
各live rangeで end nodeがnode、 end offsetがoffset + countより大きい場合、 end offsetをdataのlengthだけ増やし、countだけ減らす。
データの部分文字列には、 ノードnode、オフセットoffset、カウントcountを与えて次の手順を実行します:
- length を nodeのlengthとする。
- offset が length より大きい場合、IndexSizeError
IndexSizeErrorDOMExceptionをスローする。 - offset + count が length より大きい場合は、 nodeのdataの offset番目のコード単位から最後までの文字列を返して終了。
- それ以外は nodeのdataの 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ノードの データ を結合して返す。その兄弟(siblings)を対象とする。
排他的Textノード
とは、Text
ノードであり、CDATASection
ノードではないものを指す。
連続したTextノード
とは、ノード node に対して、
node、その 前の兄弟
が Text
ノード である場合はそれ、
さらにその 連続した
Text ノード も含み、
次の兄弟
が Text
ノード である場合はそれと、
その 連続した
Text ノード も含む(重複は除く)。
連続した排他的Textノード
とは、ノード node に対して、
node、その 前の兄弟 が
排他的Textノード である場合それと、
その 連続した排他的Textノード も含み、
次の兄弟が
排他的Textノードである場合それと、
その 連続した排他的Textノード も含む(重複は除く)。
子テキスト内容
とは、ノード node の全ての
Text
ノード 子 の
データを、
ツリー順 で
連結したものである。
子孫テキスト内容
とは、ノード node の
すべての Text
ノード 子孫 の
データを、
ツリー順 で
連結したものである。
new Text(data)
コンストラクタの手順は、thisの
データを data
に設定し、
thisの
ノード文書を
現在のグローバルオブジェクトの
関連Documentに設定することである。
Textノードを分割する
には、Text
ノード node と
offset offset を指定し、次の手順を実行する:
- length を node の長さとする。
- もし offset が length より大きければ、例外を投げる "
IndexSizeError"DOMException。 - count を length からoffsetを引いた値とする。
- new data を データの部分文字列を node、offset、count で求めた結果とする。
- new node を新しい
Textノード とし、nodeと同じ ノード文書を持つ。new node の データをnew dataに設定する。 - parent を node の親とする。
-
もし parent が null でなければ:
-
ライブレンジのうち、開始ノードがnodeで、開始オフセットがoffsetより大きいもの全てについて、それらの開始ノードをnew nodeに、開始オフセットをoffset分減らす。
-
ライブレンジのうち、終了ノードがnodeで、終了オフセットがoffsetより大きいもの全てについて、それらの終了ノードをnew nodeに、終了オフセットをoffset分減らす。
-
ライブレンジのうち、開始ノードがparentで、開始オフセットがnodeのインデックス+1なら、開始オフセットを1増やす。
-
ライブレンジのうち、終了ノードがparentで、終了オフセットがnodeのインデックス+1なら、終了オフセットを1増やす。
- データの置換を node、offset、count、空文字列で実行する。
- new node を返す。
splitText(offset)
メソッドの手順は、Textノードを分割するを
this と offset
offset で実行することである。
wholeText
のゲッターの手順は、
連続したTextノードについて
データを
連結し、
thisに対して
ツリー順で返すことである。
4.12. インターフェイス CDATASection
[Exposed =Window ]interface :CDATASection Text { };
4.13.
インターフェイス ProcessingInstruction
[Exposed =Window ]interface :ProcessingInstruction CharacterData {readonly attribute DOMString target ; };
ProcessingInstruction
ノード は、関連付けられた
ターゲット を持ちます。
targetゲッター手順は、
thisのターゲットを返すことです。
4.14. インターフェイス Comment
[Exposed =Window ]interface :Comment CharacterData {constructor (optional DOMString = ""); };data
comment = new Comment([data = ""])- 新しい
Commentノードを返します。その dataは dataです。
new Comment(data)
コンストラクターの手順は、this の data を data に設定し、
this の ノードドキュメント を
現在のグローバルオブジェクト の
関連付けられた Document に設定すること。
5. Range(範囲)
5.1. 「DOM Range」について
StaticRange
と Range オブジェクト(範囲)は、
ノードツリー内の内容の連続した部分を表します。各範囲は開始と終了を持ち、
それらは境界点です。境界点は、
タプルであり、
ノードとオフセットから構成されます。つまり、
範囲は
ノードツリー内の
2つの境界点間の内容を表します。
範囲は編集時に選択やコピーなどでよく使われます。
-
Element:p
上記のノードツリーでは、範囲を使って
“syndata is awes”という連続部分を表すことができます。pが
p 要素に、
emがem
要素に割り当てられていた場合、次のようになります:
var range = new Range(),
firstText = p. childNodes[ 1 ],
secondText = em. firstChild
range. setStart( firstText, 9 ) // do not forget the leading space
range. setEnd( secondText, 4 )
// range now stringifies to the aforementioned quote
属性(例えば上記ノードツリーのsrcやaltなど)は
範囲で表すことはできません。範囲は
ノード専用です。
Range オブジェクトは
StaticRange
オブジェクトとは異なり、
ノードツリーの変更の影響を受けます。したがってこれらはライブ範囲とも呼ばれます。そのような変更によって範囲が無効になることはなく、同じ内容部分を表し続けるようにします。
必然的に、ライブ範囲自身も
ノードツリーの変更(例えば一部内容が変更された場合など)の際に修正される場合があります。
挿入や除去アルゴリズム、
normalize()
メソッド、データ置換やテキスト分割
アルゴリズムも参照してください。
ノードツリーの変更に応じて
ライブ範囲を更新するのは負荷が高い場合があります。ノードツリーが変化するたび、
影響を受けるRange
オブジェクトすべてが更新されます。アプリケーションが一部のライブ範囲に関心がなくても、変更が発生した時に全てを最新化するコストがかかります。
StaticRange
オブジェクトは、ノードツリーが変更されても更新されない軽量な範囲です。
したがってライブ範囲と比べ保守コストがかかりません。
5.2. 境界点
境界点は、タプル であり、次の要素から構成されます。 ノード(ノード)と、 オフセット(0以上の整数)。
正しい境界点のオフセットは 0以上、かつ境界点のノードの 長さ以下の値になります。
位置は、 境界点 (nodeA, offsetA)が、境界点 (nodeB, offsetB)に対して 前、 等しい、 後のいずれかとなり、以下の手順で判定されます。
-
アサート:nodeAとnodeBは同じルートを持つ。
- もしnodeAがnodeBであれば、offsetAがoffsetBと等しければ等しいを返し、 offsetAがoffsetBより小さければ前、 offsetAがoffsetBより大きければ後を返す。
-
もしnodeAが後続のnodeBであれば、 (nodeB, offsetB)が(nodeA, offsetA)に対して 位置が前なら 後を返し、 後なら 前を返す。
-
もしnodeAがnodeBの祖先であれば:
-
前を返す。
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
インターフェイスを実装するオブジェクトは
範囲
と呼ばれます。
便宜上、範囲の 開始ノードは、その開始の ノード、 開始オフセットは 開始のオフセット、 終了ノードは 終了の ノード、 終了オフセットは 終了の オフセットです。
範囲は、折り畳み済み(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
ゲッターの手順は、this が
collapsed であれば
true、そうでなければ false を返すことです。
5.4. インターフェイス StaticRange
dictionary {StaticRangeInit required Node ;startContainer required unsigned long ;startOffset required Node ;endContainer required unsigned long ; }; [endOffset Exposed =Window ]interface :StaticRange AbstractRange {constructor (StaticRangeInit ); };init
new StaticRange(init)
コンストラクタの手順は以下の通りです:
-
init["
startContainer"] または init["endContainer"] がDocumentTypeまたはAttrノードの場合、InvalidNodeTypeErrorInvalidNodeTypeErrorDOMExceptionをスローする。 -
thisの開始を (init["
startContainer"], init["startOffset"]) に、終了を (init["endContainer"], init["endOffset"]) に設定する。
StaticRange
は、以下すべてが満たされる場合に
有効(valid)です:
5.5. インターフェイス Range
[Exposed =Window ]interface :Range AbstractRange {constructor ();readonly attribute Node commonAncestorContainer ;undefined setStart (Node ,node unsigned long );offset undefined setEnd (Node ,node unsigned long );offset undefined setStartBefore (Node );node undefined setStartAfter (Node );node undefined setEndBefore (Node );node undefined setEndAfter (Node );node undefined collapse (optional boolean =toStart false );undefined selectNode (Node );node undefined selectNodeContents (Node );node const unsigned short = 0;START_TO_START const unsigned short = 1;START_TO_END const unsigned short = 2;END_TO_END const unsigned short = 3;END_TO_START 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の終了の場合です。
ノードは 部分的に包含されるのは、ライブ範囲 の開始ノードの 包括的祖先だが終了ノードではない場合、または逆の場合です。
これらの定義をよりよく理解するためのいくつかの事実:
-
ライブレンジ内に含まれると考えられる内容は、すべての 含まれる ノードに加え、 開始ノードおよび終了ノードが
CharacterDataノードの場合は、その内容の一部も含むことがあります。 -
ライブレンジに含まれる ノードは、通常は連続しているとは限りません。 これは、含まれる ノードの 親が必ずしも含まれているとは限らないためです。
-
ただし、含まれる ノードの子孫も含まれることになります。また、2つの兄弟ノードが含まれる場合、それらの間にある兄弟ノードもすべて含まれます。
-
最初の含まれる ノードが存在する場合、それは常に 開始ノードの後であり、最後の含まれる ノードは、常に 終了ノードの最後の 子孫と等しいか、その前になります。
-
commonAncestorContainer属性値は、 含まれるでも部分的に含まれるでもありません。 -
もし開始ノードが終了ノードの祖先である場合、 共通の包含祖先は 開始ノードになります。その子のうち1つだけが 部分的に含まれるようになり、 ある子が含まれるのは、 それが部分的に含まれる 子より前にある場合のみです。 もし終了ノードが 開始ノードの祖先であれば、逆も成り立ちます。
-
もし開始ノードが終了ノードの包含祖先でなく、またその逆でもない場合、 共通の包含祖先は両方と異なるノードになります。その子のうち2つだけが 部分的に含まれることになり、 その2つの間にある子だけが含まれます。
ライブレンジ事前削除手順は、ノード node に対して次のように行います:
-
parent を node の 親 とする。
-
アサート:parent は null ではない。
-
index を node の インデックス とする。
-
parent を開始ノードとし、開始オフセットが index より大きいライブレンジごとに、その開始オフセットを1減らす。
-
parent を終了ノードとし、終了オフセットが index より大きいライブレンジごとに、その終了オフセットを1減らす。
range = new Range()- 新しいライブ範囲を返します。
new Range() コンストラクタ手順は、
thisの
開始と
終了を
(current global objectの
関連付けられたDocument, 0) に設定することです。
- container = range .
commonAncestorContainer - range の 開始ノード および 終了ノード の両方の 祖先であり、 ドキュメント から最も離れている ノードを返します。
commonAncestorContainerゲッター手順は:
開始または終了を設定する には、rangeの境界点 (node, offset)を与え、次の手順を実行します:
- nodeがdoctypeの場合、
InvalidNodeTypeError
InvalidNodeTypeErrorDOMExceptionをスローする。 - offsetがnodeの長さより大きい場合、
IndexSizeError
IndexSizeErrorDOMExceptionをスローする。 - bp を境界点 (node, offset)とする。
setStart(node, offset)メソッド手順は、
開始を設定する
(this、境界点(node,
offset)) を実行することです。
setEnd(node, offset)メソッド手順は、
終了を設定する
(this、境界点(node,
offset)) を実行することです。
setStartBefore(node)メソッド手順は:
- parent を nodeの親とする。
- parentが null の場合、InvalidNodeTypeError
InvalidNodeTypeErrorDOMExceptionをスローする。 - 開始を設定する (this、 境界点( parent, nodeのインデックス)) を実行する。
setStartAfter(node)メソッド手順は:
-
parent を nodeの親とする。
-
parentが null の場合、InvalidNodeTypeError
InvalidNodeTypeErrorDOMExceptionをスローする。
setEndBefore(node)メソッド手順は:
- parent を nodeの親とする。
- parentが null の場合、InvalidNodeTypeError
InvalidNodeTypeErrorDOMExceptionをスローする。 - 終了を設定する (this、 境界点( parent, nodeのインデックス)) を実行する。
setEndAfter(node)メソッド手順は:
-
parent を nodeの親とする。
-
parentが null の場合、InvalidNodeTypeError
InvalidNodeTypeErrorDOMExceptionをスローする。
collapse(toStart)メソッド手順は、
toStartがtrueなら終了を開始に設定し、そうでなければ
開始を
終了に設定することです。
ノードを選択するには、 ノード nodeを 範囲 range内で 次の手順を実行します:
-
parent を nodeの親とする。
-
parentが null の場合、InvalidNodeTypeError
InvalidNodeTypeErrorDOMExceptionをスローする。 -
index を nodeのインデックスとする。
selectNode(node)メソッド手順は、
ノードを選択する
(node, this) を実行することです。
selectNodeContents(node)メソッド手順は:
-
nodeがdoctypeの場合、InvalidNodeTypeError
InvalidNodeTypeErrorDOMExceptionをスローする。 -
length を nodeの長さとする。
compareBoundaryPoints(how, sourceRange)
メソッドの手順は以下の通りです:
-
howが
以外の場合は、NotSupportedErrorNotSupportedErrorDOMExceptionをスローする。 - thisの
ルートが
sourceRangeの
ルートと異なる場合は、
WrongDocumentError
WrongDocumentErrorDOMExceptionをスローする。 -
howが以下の場合:
START_TO_START:- this pointをthisの 開始とし、 other pointをsourceRangeの 開始とする。
START_TO_END:- this pointをthisの 終了とし、 other pointをsourceRangeの 開始とする。
END_TO_END:- this pointをthisの 終了とし、 other pointをsourceRangeの 終了とする。
END_TO_START:- this pointをthisの 開始とし、 other pointをsourceRangeの 終了とする。
-
this pointのother pointに対する位置が
deleteContents()メソッド手順は:
- original start node、original start offset、original end node、original end offset を this の start node、 start offset、 end node、 end offset とする。
-
もし original start node が original end node であり、それが
CharacterDatanode であるなら、ノード original start node、オフセット original start offset、カウント original end offset から original start offset を引いた値、データは空文字列で replace data し、return する。 - nodes to remove を、nodes の内、contained in this で、tree order で並び、また node の親 parent が同じく contained in this の場合は除外したリストとする。
- もし original start node が inclusive ancestor of original end node であれば、 new node に original start node を、 new offset に original start offset を代入する。
-
それ以外の場合:
- reference node を original start node とする。
- reference node の 親 が null でなく、 かつ original end node の 包含的祖先 でない間は、 reference node をその 親 にする。
-
new node を reference node の
親 にし、
new offset を reference node の
インデックス
に 1 を加えた値に設定する。
もし reference node の 親 が null なら、 それは このレンジのルート であり、 また original end node の 包含的祖先 なので、この状況にはならない。
-
もし original start node が
CharacterDataノード であれば、 replace data を使用し、 ノード original start node、オフセット original start offset、カウント original start node の 長さ − original start offset、データを空文字列で置換する。 -
もし original end node が
CharacterDataノード であれば、 replace data を使用し、 ノード original end node、オフセット 0、カウント original end offset、データを空文字列で置換する。 - 開始 および 終了 を (new node, new offset) に設定する。
live range live range range を抽出するには、次の手順を踏む:
-
fragment を新しい
DocumentFragmentノードとして作成し、 その ノード文書 を range の 開始ノード の ノード文書 に設定する。 -
もし range が collapsed なら、fragment を返す。
- original start node、original start offset、 original end node、original end offset を それぞれ range の 開始ノード、 開始オフセット、 終了ノード、 終了オフセット とする。
-
もし original start node が original end node と等しく、かつそれが
CharacterDataノード の場合:- clone を クローンとして original start node から生成する。
- clone の data を original start node から、offset original start offset、 count original end offset − original start offset で 部分文字列化した結果に設定する。
- Append を使い、clone を fragment に追加する。
- Replace data を使い、 original start node の offset original start offset から count original end offset − original start offset を空文字列で置き換える。
- fragment を返す。
- common ancestor を original start node とする。
- common ancestor が 包含祖先でない間は、 original end node の自分の 親へと辿る。
- first partially contained child を null とする。
- もし original start node が 包含祖先でなければ、 first partially contained child を common ancestor の子でレンジに 部分的に含まれる最初の 子とする。
- last partially contained child を null とする。
-
もし original end node が 包含祖先でなければ、
last partially contained child を
common ancestor の子でレンジに
部分的に含まれる最後の
子とする。
これらの変数代入は常に筋が通っています。 たとえば original start node が original end node の 包含祖先でない場合、 original start node 自体も 部分的に含まれる状態であり、 その祖先も common ancestor の子まで同様です。 common ancestor が original start node であることはありません(それは original end node の 包含祖先でなければならないため)。その他のケースも同様です。両方が定義されている場合この2つの子は一致しません。
- contained children を common ancestor の全ての 子のうち range に含まれるものを、 ツリー順でリスト化したものとする。
-
もし contained children のいずれかが doctype なら、 throwし、 "
HierarchyRequestError"DOMExceptionを投げる。最初や最後の部分的に含まれるノードについて心配する必要はありません。 doctypeは 部分的に含まれることは決してなく、レンジの境界点にもなれず、 何かの祖先になることもできません。
- もし original start node が 包含祖先であれば、 new node を original start node、 new offset を original start offset に設定する。
- それ以外の場合:
-
もし first partially contained child が
CharacterDataノード であれば:この場合、first partially contained child は original start nodeです。
-
clone を クローンとして original start node から作成する。
-
clone の data を、original start node の 部分文字列(offset original start offset から original start node の 長さ − original start offset)で 設定する。
-
Append を使い clone を fragment に追加する。
-
Replace data を使い、 original start node の該当部分(offset original start offset から original start node の長さ − original start offsetぶん)を空文字列に置換する。
-
-
そうでなく、first partially contained child が null でなければ:
- clone を クローンとして first partially contained child から作成する。
- Append を使い clone を fragment に追加する。
- subrange を新しいライブレンジとして作成し、 開始を (original start node, original start offset)、 終了を (first partially contained child, first partially contained child の 長さ) に指定する。
-
subfragment を extracting subrange の結果として取得する。
- Append を使い subfragment を clone に追加する。
-
contained children の各 contained child に対し append を使い contained child を fragment に追加する。
-
もし last partially contained child が
CharacterDataノード であれば:この場合、last partially contained child は original end nodeです。
- clone を クローンとして original end node から作成する。
- clone の data を substringingによって original end node のデータの 0 から original end offset までに設定する。
- Append を使い clone を fragment に追加する。
- Replace data を使い original end node の 0 から original end offset ぶんを空文字列に置換する。
-
そうでなく、last partially contained child が null でなければ:
- clone を クローンとして last partially contained child から作成する。
- Append を使い clone を fragment に追加する。
- subrange を新しいライブレンジとして作成し、 開始を (last partially contained child, 0)、 終了を (original end node, original end offset) に指定する。
-
subfragment を extracting subrange の結果として取得する。
- Append を使い subfragment を clone に追加する。
- range の 開始 および 終了 を (new node, new offset) に設定する。
- fragment を返す。
extractContents() メソッドの手順は、extracting this を返すことである。
内容を複製する live range range については、次の手順を実行する:
-
fragment を新しい
DocumentFragmentノードとして作成し、 その ノード文書を range の 開始ノード の ノード文書にする。 -
もし range が 折りたたまれている場合、fragment を返す。
- original start node、original start offset、 original end node、original end offset を それぞれ range の 開始ノード、 開始オフセット、 終了ノード、 終了オフセット とする。
-
もし original start node が original end node と等しく、さらにそれが
CharacterDataノードであれば: - common ancestor を original start node とする。
- common ancestor が 包含祖先でない間は、 original end node の 親 にたどる。
- first partially contained child を null とする。
- もし original start node が 包含祖先でなければ common ancestor の子(child)のうちレンジに 部分的に含まれる最初のものを first partially contained child とする。
- last partially contained child を null とする。
-
もし original end node が
包含祖先でなければ、
common ancestor の子(child)のうちレンジに
部分的に含まれる最後のものを
last partially contained child とする。
これらの変数の代入は常に成立します。 例えば original start node が original end node の 包含祖先でない場合、 original start node 自体や 祖先もすべて 部分的に含まれるとして common ancestor の子に至ります。 common ancestor が original start node であることはありません。なぜなら original end node の 包含祖先でなければならないためです。逆のケースも同様です。また、両者が定義されている場合でも同じ子にはなりません。
- contained children を common ancestor の子(children)のうち range に含まれるもの全てを、 ツリー順でリスト化したものとする。
-
もし contained children に doctype が含まれていれば、 throw を投げ、 "
HierarchyRequestError"DOMException。最初または最後の部分的に含まれるノードについては考慮不要です。 doctypeは部分的に含まれることが絶対に無く、レンジの境界点にもならず、 何かの祖先にもなりません。
-
もし first partially contained child が
CharacterDataノードであれば:この場合、first partially contained child は original start node です。
-
そうでなく、first partially contained child が null でない場合:
- clone を クローンとして first partially contained child から作成する。
- Append で clone を fragment に追加する。
- subrange を新しいライブレンジとして作成し、 開始を (original start node, original start offset)、 終了を (first partially contained child, first partially contained child の 長さ) にする。
-
subfragment を cloning the contents で subrange から得る。
- Append で subfragment を clone に追加する。
-
contained children の各 contained child に対して:
-
もし last partially contained child が
CharacterDataノードであれば:この場合、last partially contained child は original end node です。
-
そうでなく、last partially contained child が null でなければ:
- clone を クローンとして last partially contained child から作成する。
- Append で clone を fragment に追加する。
- subrange を新しいライブレンジとして作成し、 開始を (last partially contained child, 0)、 終了を (original end node, original end offset) にする。
-
subfragment を cloning the contents で subrange から得る。
- Append で subfragment を clone に追加する。
- fragment を返す。
cloneContents() メソッドの手順は、
cloning the
contents of this を返すことである。
挿入としてノード node をライブレンジ range に挿入するには、次の手順を実行する:
- もしrangeの開始ノードが
ProcessingInstructionまたはCommentノードであるか、またはTextノードでその 親が null である場合、あるいは node そのものである場合、throw し、 "HierarchyRequestError"DOMExceptionを投げる。 - referenceNode を null とする。
- もしrangeの開始ノードが
Textノードである場合、 referenceNode をそのTextノードとする。 - そうでなければ、referenceNode を 開始ノード の 子のうち インデックスが 開始オフセット に等しいもの、該当する子がなければ null とする。
- parent を referenceNode が null なら range の 開始ノード、 そうでなければ referenceNode の 親とする。
- 事前挿入の有効性 を parent の referenceNode の前へ node を挿入する形で確認する。
- もしrangeの開始ノードが
Textノードなら、 それを分割し、 referenceNode をその分割結果とする(offset は range の 開始オフセット)。 - もし node が referenceNode と等しければ、referenceNode をその 次の兄弟にする。
-
newOffset に referenceNode が null なら parent の 長さ、そうでなければ referenceNode の インデックスを代入する。
-
もし node が
DocumentFragmentノードなら node の長さ分、 そうでなければ 1 だけ newOffset を増やす。 - pre-insert で node を parent の referenceNode の前に挿入する。
-
もし range が 折りたたまれているなら、 range の 終了 を (parent, newOffset) に設定する。
insertNode(node) メソッドの手順は
挿入 を用いて
node を this に追加することである。
surroundContents(newParent) メソッドの手順は以下の通り:
-
もし非
Textノードが 部分的に含まれる場合は、 throw し、 "InvalidStateError"DOMExceptionを投げる。 -
もし newParent が
Document、DocumentType、 またはDocumentFragmentノードなら throw し、 "InvalidNodeTypeError"DOMExceptionを投げる。歴史的理由により
CharacterDataノードはここではチェックされず、後で副作用としてthrowされます。 -
もし newParent が子ノードを持っていれば、 その中身をすべてreplace allでnullに置き換える。
-
append で fragment を newParent に追加する。
cloneRange() メソッドの手順は、新しい live range を返し、その start と end を this
と同じ値に設定する。
detach() メソッドの手順は何もしない。
その機能(Range
オブジェクトの無効化)は廃止されたが、互換性のためメソッド自体は残されている。
- position = range .
comparePoint(node, offset) - 点が範囲の前にあれば −1、範囲内にあれば 0、範囲の後にあれば 1 を返します。
- intersects = range .
intersectsNode(node) - range が node と交差するかどうかを返します。
The isPointInRange(node, offset)
method steps are:
- もし node の root が this の root と異なるなら、 false を返します。
- もし node が doctype であれば、throw して
"
InvalidNodeTypeError"DOMExceptionを発生させます。 -
もし offset が node の length より大きければ、 throw して "
IndexSizeError"DOMExceptionを発生させます。 - もし (node, offset) が before start または after end であれば、 false を返します。
- true を返します。
The comparePoint(node, offset)
method steps are:
- もし node の root が this の
root
と異なるなら、throw して "
WrongDocumentError"DOMExceptionを発生させます。 - もし node が doctype であれば、throw して
"
InvalidNodeTypeError"DOMExceptionを発生させます。 -
もし offset が node の length より大きければ、 throw して "
IndexSizeError"DOMExceptionを発生させます。 - もし (node, offset) が before start であれば、 −1 を返します。
- もし (node, offset) が after end であれば、 1 を返します。
- 0 を返します。
The intersectsNode(node) method steps are:
The stringification behavior must run these steps:
-
s を空文字列とする。
-
this の 開始ノード が this の 終了ノード と等しく、 かつそれが
Textノード であれば、そのTextノード の データ の this の 開始オフセット から this の 終了オフセット までの部分文字列を返す。 -
this の 開始ノード が
Textノード であれば、 その ノード の データ の this の 開始オフセット から末尾までの部分文字列を s に追加する。 -
this の 終了ノード が
Textノードであれば、 その ノード の データ の先頭から this の 終了オフセット までの部分文字列を s に追加する。 -
s を返す。
createContextualFragment()、
getClientRects()、
および getBoundingClientRect()
メソッドは他の仕様で定義されています。
[DOM-Parsing]
[CSSOM-VIEW]
6. 走査
NodeIterator
および TreeWalker
オブジェクトは、ノード
ツリーのフィルタリングおよび走査に使用できます。
各 NodeIterator
および TreeWalker
オブジェクトには、再帰的な呼び出しを避けるための
active フラグ が関連付けられています。これは最初は未設定です。
各 NodeIterator
および TreeWalker
オブジェクトにはさらに、
root(ノード)、
whatToShow(ビットマスク)、
filter(コールバック)も関連付けられます。
フィルタリングのために、
NodeIterator
または TreeWalker
オブジェクト traverser の中で、ノード node をフィルタリングするには、次の手順を行います:
-
もし traverser の active フラグ が設定されている場合、"
InvalidStateError"DOMExceptionをスローする。 -
n を node の
nodeType属性値から 1 を引いた値とする。 -
もし traverser の whatToShow の n ビット目(0が最下位ビット)が設定されていなければ、
FILTER_SKIPを返す。 -
もし traverser の filter が null なら、
FILTER_ACCEPTを返す。 -
traverser の active フラグ を設定する。
-
result を、traverser の filter に対して、 "acceptNode"操作を node だけを引数として ユーザーオブジェクトの操作を呼び出すことで得る値とする。 これが例外をスローした場合は、traverser の active フラグ を解除し、例外を再スローする。
-
traverser の active フラグ を解除する。
-
result を返す。
6.1. インターフェイス NodeIterator
[Exposed =Window ]interface { [NodeIterator SameObject ]readonly attribute Node root ;readonly attribute Node referenceNode ;readonly attribute boolean pointerBeforeReferenceNode ;readonly attribute unsigned long whatToShow ;readonly attribute NodeFilter ?filter ;Node ?nextNode ();Node ?previousNode ();undefined detach (); };
NodeIterator
オブジェクトは
Document
オブジェクトの createNodeIterator()
メソッドを使って作成できます。
各 NodeIterator
オブジェクトには関連する
イテレーターコレクションがあり、これは
NodeIterator
オブジェクトの root
をルートとし、
すべての ノード にマッチするフィルターを持つ
コレクションです。
各 NodeIterator
オブジェクトには reference(ノード)と
pointer before reference(真偽値)も関連付けられています。
前述の通り、NodeIterator
オブジェクトにはさらに
active
フラグ、
root、
whatToShow、
filter
も備わっています。
NodeIterator 事前削除手順
は、nodeIterator と toBeRemovedNode を与えられたとき、次のように動作します:
-
もし toBeRemovedNode が nodeIterator の reference の 包含祖先でない場合、 または toBeRemovedNode が nodeIterator の root なら何もしないで戻る。
-
もし nodeIterator の pointer before reference が true なら:
-
toBeRemovedNode の 前の兄弟が null なら nodeIterator の reference を toBeRemovedNode の 親 に設定し、 そうでなければ toBeRemovedNode の 前の兄弟の 包含的子孫でツリー順で最も後ろのノードに設定する。
root ゲッターの手順は、
this の
root を返す。
referenceNode ゲッターの手順は、
this の
reference
を返す。
pointerBeforeReferenceNode ゲッターの手順は、
this の
pointer before reference を返す。
whatToShow ゲッターの手順は、
this の
whatToShow を返す。
filter ゲッターの手順は、
this の
filter
を返す。
走査(traverse) について、NodeIterator
オブジェクト iterator と方向 direction が与えられたとき次の手順を実行する:
-
node を iterator の reference とする。
-
beforeNode を iterator の pointer before reference とする。
-
以下を繰り返す:
-
direction の値で分岐:
- next
-
もし beforeNode が false なら、 iterator の イテレーターコレクション の ノードのうち node にfollowingなものの最初のものを node とする。 なければ null を返す。
もし beforeNode が true なら false にする。
- previous
-
もし beforeNode が true なら iterator の イテレーターコレクション の ノードのうち node にprecedingなものの最初のものを node とする。 なければ null を返す。
もし beforeNode が false なら、true にする。
-
result を フィルタリング で node と iterator から得る。
-
result が
FILTER_ACCEPTなら break する。
-
-
iterator の reference を node にする。
-
iterator の pointer before reference を beforeNode にする。
-
node を返す。
nextNode() メソッドの手順は
走査 を this と next で実行した結果を返す。
previousNode() メソッドの手順は
走査 を this と previous で実行した結果を返す。
detach() メソッドの手順は何もしない。
この機能(NodeIterator
オブジェクトを無効化すること)は削除されましたが、このメソッド自体は互換性のために残されています。
6.2. インターフェイス TreeWalker
[Exposed =Window ]interface { [TreeWalker SameObject ]readonly attribute Node root ;readonly attribute unsigned long whatToShow ;readonly attribute NodeFilter ?filter ;attribute Node currentNode ;Node ?parentNode ();Node ?firstChild ();Node ?lastChild ();Node ?previousSibling ();Node ?nextSibling ();Node ?previousNode ();Node ?nextNode (); };
TreeWalker
オブジェクトは Document
オブジェクトの createTreeWalker()
メソッドを使って作成できます。
各 TreeWalker
オブジェクトには current(ノード)が関連付けられています。
前述の通りTreeWalker
オブジェクトには
root、
whatToShow、
filter
も関連付けられています。
root ゲッターの手順は
this の
root
を返すことです。
whatToShow ゲッターの手順は
this の
whatToShow を返すことです。
filter ゲッターの手順は
this の
filter
を返すことです。
currentNode ゲッターの手順は
this の
current を返すことです。
currentNode
セッターの手順は this の
current
を指定された値に設定することです。
parentNode() メソッドの手順:
-
null を返す。
子供の走査について、walker と type を与えられたら次の手順:
-
node を walker の current にする。
-
node が null でない間繰り返す:
-
result を フィルタリングで node と walker から得る。
-
result が
FILTER_ACCEPTなら walker の current を node にし node を返す。 -
result が
FILTER_SKIPなら: -
node が null でない間繰り返す:
-
-
null を返す。
firstChild() メソッドの手順は
子供の走査 を
this と first
で実行する。
lastChild() メソッドの手順は
子供の走査
を
this と last
で実行する。
兄弟の走査について、walker と type を与えられたら次の手順:
-
node を walker の current にする。
-
node が root なら null を返す。
-
以下を繰り返す:
-
type が next なら sibling を node の 次の兄弟 に、 previous なら 前の兄弟 にする。
-
sibling が null でない間繰り返す:
-
node を sibling にする。
-
result を フィルタリングで node と walker から得る。
-
result が
FILTER_ACCEPTなら walker の current を node にして node を返す。 -
type が next なら sibling を node の 最初の子 に、 previous なら 最後の子 にする。
-
result が
FILTER_REJECTまたは sibling が null なら、 type が next なら sibling を node の 次の兄弟 に、 previous なら 前の兄弟 にする。
-
-
node を node の 親 にする。
-
node が null または walker の root であれば null を返す。
-
フィルタリングで node と walker から得た値が
FILTER_ACCEPTの場合は null を返す。
-
nextSibling() メソッドの手順は
兄弟の走査 を
this と next
で実行する。
previousSibling() メソッドの手順は
兄弟の走査
を
this と previous
で実行する。
previousNode() メソッドの手順:
-
null を返す。
nextNode() メソッドの手順:
-
result を
FILTER_ACCEPTにする。 -
以下を繰り返す:
-
result が
FILTER_REJECTでない かつ node が 子を持つ間繰り返す: -
sibling を null にする。
-
temporary を node にする。
-
temporary が null でない間繰り返す:
-
result が
FILTER_ACCEPTなら this の current を node にして node を返す。
-
6.3. インターフェイス NodeFilter
[Exposed =Window ]callback interface { // Constants for acceptNode()NodeFilter const unsigned short FILTER_ACCEPT = 1;const unsigned short FILTER_REJECT = 2;const unsigned short FILTER_SKIP = 3; // Constants for whatToShowconst 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 = 0x10; // legacySHOW_ENTITY_REFERENCE const unsigned long = 0x20; // legacySHOW_ENTITY 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 = 0x800; // legacySHOW_NOTATION unsigned short (acceptNode Node ); };node
NodeFilter
オブジェクトは、filterとして
NodeIterator
や TreeWalker
オブジェクトに利用でき、さらに
whatToShowビットマスク用の定数も提供します。
NodeFilter
オブジェクトは通常、JavaScript関数として実装されます。
以下の定数はfilterの戻り値として利用できます:
FILTER_ACCEPT(1);FILTER_REJECT(2);FILTER_SKIP(3);
以下の定数はwhatToShowに利用できます:
SHOW_ALL(4294967295, 16進数でFFFFFFFF);SHOW_ELEMENT(1);SHOW_ATTRIBUTE(2);SHOW_TEXT(4);SHOW_CDATA_SECTION(8);SHOW_PROCESSING_INSTRUCTION(64, 16進数で40);SHOW_COMMENT(128, 16進数で80);SHOW_DOCUMENT(256, 16進数で100);SHOW_DOCUMENT_TYPE(512, 16進数で200);SHOW_DOCUMENT_FRAGMENT(1024, 16進数で400);
7. 集合
DOMTokenList
という名前は、残念ながらレガシーの名残りです。
7.1. インターフェイス DOMTokenList
[Exposed =Window ]interface {DOMTokenList readonly attribute unsigned long length ;getter DOMString ?item (unsigned long );index boolean contains (DOMString ); [token CEReactions ]undefined add (DOMString ...); [tokens CEReactions ]undefined remove (DOMString ...); [tokens CEReactions ]boolean toggle (DOMString ,token optional boolean ); [force CEReactions ]boolean replace (DOMString ,token DOMString );newToken boolean supports (DOMString ); [token CEReactions ]stringifier attribute DOMString value ;iterable <DOMString >; };
DOMTokenList
オブジェクトは、関連付けられた
トークン集合(集合)を持ち、これは最初は空です。
DOMTokenList
オブジェクトは、関連付けられた 要素 と 属性の
ローカル名 も持ちます。
仕様によっては、
サポートされるトークン を DOMTokenList
の
関連付けられた 属性 の
ローカル名 に対して定義する場合があります。
DOMTokenList
オブジェクトの 検証手順 は、与えられた
token に対して次の通りです:
-
関連付けられた 属性 の ローカル名 が サポートされるトークン を 定義していなければ、throw で
TypeErrorを投げます。 -
lowercase token を token の ASCII小文字 でのコピーとします。
-
lowercase token が サポートされるトークン に含まれていれば、true を返します。
-
false を返します。
DOMTokenList
オブジェクトの 更新手順 は次の通りです:
DOMTokenList
オブジェクトの シリアライズ手順 は、
関連付けられた 要素 と
関連付けられた 属性 の
ローカル名 を与えて
属性値取得 を実行した結果を返します。
DOMTokenList
オブジェクトは、その関連付けられた 属性変更手順 を関連付けられた
要素 について持ちます:
-
もし localName が関連付けられた属性の ローカル名 であり、 namespace が null かつ value も null であれば、 空 の トークン集合 にします。
-
それ以外で、localName が関連付けられた属性の ローカル名 であり、 namespace が null であれば、トークン集合 を value を パース したものに設定します。
DOMTokenList
オブジェクトが生成されるとき、次を実行します:
-
element を関連付けられた 要素 とします。
-
localName を関連付けられた属性の ローカル名 とします。
-
value を 属性値取得 を element と localName で実行した結果とします。
-
element、localName、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()と同じ)、false なら削除します(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) メソッドの手順は次の通りです:
contains(token) メソッドの手順は、
this の トークン集合[token] が 存在する なら true、そうでなければ
false を返します。
add(tokens…)
メソッドの手順は次の通りです:
-
各 token について:
-
token が空文字列なら throw で "
SyntaxError"DOMExceptionを投げます。 -
token に ASCII空白 が含まれている場合、 throw で "
InvalidCharacterError"DOMExceptionを投げます。
-
-
更新手順 を実行します。
remove(tokens…)
メソッドの手順は次の通りです:
-
各 token について:
-
token が空文字列なら throw で "
SyntaxError"DOMExceptionを投げます。 -
token に ASCII空白 が含まれている場合、 throw で "
InvalidCharacterError"DOMExceptionを投げます。
-
-
tokens の各 token について:remove token を this の token set から削除する。
-
更新手順 を実行します。
toggle(token, force)
メソッドの手順は次の通りです:
-
token が空文字列なら throw で "
SyntaxError"DOMExceptionを投げます。 -
token に ASCII空白 が含まれている場合、 throw で "
InvalidCharacterError"DOMExceptionを投げます。 -
それ以外の場合、force が未指定または true なら、追加 で token を this の トークン集合 に加え、 更新手順 を実行し true を返します。
-
false を返します。
更新手順 は、web互換性のため toggle()
で常に実行されるとは限りません。
replace(token, newToken)
メソッドの手順は次の通りです:
-
token または newToken のどちらかが空文字列なら throw で "
SyntaxError"DOMExceptionを投げます。 -
token または newToken のどちらかに ASCII空白 が含まれている場合、 throw で "
InvalidCharacterError"DOMExceptionを投げます。 -
更新手順 を実行します。
-
true を返します。
更新手順 はweb互換性のため replace()
で常に実行されるとは限りません。
supports(token)
メソッドの手順は次の通りです:
-
検証手順 を token で呼び出した結果を result とします。
-
result を返します。
value 属性のゲッターは、
this の シリアライズ手順
を実行した結果を返す必要があります。
value
属性を設定するときは、
関連付けられた 要素 に対し
関連付けられた 属性 の
ローカル名 および
指定された値を使って
属性値を設定 します。
8. XPath
DOM Level 3 XPathはXPath 1.0 式の評価APIを定義しました。これらのAPIは広く実装されていますが、保守されていません。インターフェイス定義はWeb IDLの変更時に更新できるようここで維持されています。 これらAPIの完全な定義は依然必要であり、その作業はwhatwg/dom#67で追跡およびコントリビュートできます。 [DOM-Level-3-XPath] [XPath] [WEBIDL]
8.1. インターフェイス XPathResult
[Exposed =Window ]interface {XPathResult const unsigned short = 0;ANY_TYPE const unsigned short = 1;NUMBER_TYPE const unsigned short = 2;STRING_TYPE const unsigned short = 3;BOOLEAN_TYPE const unsigned short = 4;UNORDERED_NODE_ITERATOR_TYPE const unsigned short = 5;ORDERED_NODE_ITERATOR_TYPE const unsigned short = 6;UNORDERED_NODE_SNAPSHOT_TYPE const unsigned short = 7;ORDERED_NODE_SNAPSHOT_TYPE const unsigned short = 8;ANY_UNORDERED_NODE_TYPE const unsigned short = 9;FIRST_ORDERED_NODE_TYPE 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 { // XPathResult.ANY_TYPE = 0XPathExpression XPathResult (evaluate Node ,contextNode optional unsigned short = 0,type 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 ); // legacy // XPathResult.ANY_TYPE = 0nodeResolver XPathResult (evaluate DOMString ,expression Node ,contextNode optional XPathNSResolver ?=resolver null ,optional unsigned short = 0,type optional XPathResult ?=result null ); };Document includes XPathEvaluatorBase ;
createNSResolver(nodeResolver)
メソッド手順はnodeResolverを返すこと。
このメソッドは歴史的理由で存在しています。
8.4. インターフェイス XPathEvaluator
[Exposed =Window ]interface {XPathEvaluator (); };constructor XPathEvaluator includes XPathEvaluatorBase ;
歴史的理由により、XPathEvaluator
をコンストラクトすることも、同じ
メソッドにDocument
上からアクセスすることもできます。
9. XSLT
XSL Transformations (XSLT)はXML文書を他のXML文書に変換する言語です。 この章で定義されているAPIは広く実装されており、Web IDLの変更時に更新できるようここで維持されています。APIの完全な定義は依然として必要であり、その作業は whatwg/dom#181で追跡およびコントリビュート可能です。 [XSLT]
9.1. インターフェイス XSLTProcessor
[Exposed =Window ]interface {XSLTProcessor ();constructor undefined (importStylesheet Node ); [style CEReactions ]DocumentFragment (transformToFragment Node ,source Document ); [output CEReactions ]Document (transformToDocument Node );source undefined ([setParameter LegacyNullToEmptyString ]DOMString ,namespaceURI DOMString ,localName any );value any ([getParameter LegacyNullToEmptyString ]DOMString ,namespaceURI DOMString );localName undefined ([removeParameter LegacyNullToEmptyString ]DOMString ,namespaceURI DOMString );localName undefined ();clearParameters undefined (); };reset
10. セキュリティとプライバシーの考慮事項
この標準には、既知のセキュリティやプライバシーの考慮事項はありません。
11. 歴史的事項
この標準には、かつて含まれていたが削除された複数のインターフェイスやインターフェイスメンバーがあります。
以下のインターフェイスは削除されました:
DOMConfigurationDOMErrorDOMErrorHandlerDOMImplementationListDOMImplementationSourceDOMLocatorDOMObjectDOMUserDataEntityEntityReferenceMutationEventMutationNameEventNameListNotationRangeExceptionTypeInfoUserDataHandler
また、以下のインターフェイスメンバーが削除されました:
Attr-
schemaTypeInfoisId
Document-
createEntityReference()xmlEncodingxmlStandalonexmlVersionstrictErrorCheckingdomConfignormalizeDocument()renameNode()
DocumentType-
entitiesnotationsinternalSubset
DOMImplementation-
getFeature()
Element-
schemaTypeInfosetIdAttribute()setIdAttributeNS()setIdAttributeNode()
Node-
isSupportedgetFeature()getUserData()setUserData()
NodeIterator-
expandEntityReferences
Text-
isElementContentWhitespacereplaceWholeText()
TreeWalker-
expandEntityReferences
謝辞
DOM の相互運用性向上に長年にわたり貢献してくださった多くの方々に感謝します。同様に、この標準が今日の形となるまで支えてくださった方々にも感謝いたします。
以下の皆様に心より感謝いたします: Adam Klein、 Adrian Bateman、 Ahmid snuggs、 Alex Komoroske、 Alex Russell、 Alexey Shvayka、 Andreas Kling、 Andreu Botella、 Anthony Ramine、 Arkadiusz Michalski、 Arnaud Le Hors、 Arun Ranganathan、 Benjamin Gruenbaum、 Björn Höhrmann、 Boris Zbarsky、 Brandon Payton、 Brandon Slade、 Brandon Wallace、 Brian Kardell、 C. Scott Ananian、 Cameron McCormack、 Chris Dumez、 Chris Paris、 Chris Rebert、 Cyrille Tuzi、 Dan Burzo、 Daniel Clark、 Daniel Glazman、 Darien Maillet Valentine、 Darin Fisher、 David Baron、 David Bruant、 David Flanagan、 David Håsäther、 David Hyatt、 Deepak Sherveghar、 Dethe Elza、 Dimitri Glazkov、 Domenic Denicola、 Dominic Cooney、 Dominique Hazaël-Massieux、 Don Jordan、 Doug Schepers、 Edgar Chen、 Elisée Maurer、 Elliott Sprehn、 Emilio Cobos Álvarez、 Eric Bidelman、 Erik Arvidsson、 François Daoust、 François Remy、 Gary Kacmarcik、 Gavin Nicol、 Giorgio Liscio、 Glen Huang、 Glenn Adams、 Glenn Maynard、 Hajime Morrita、 Harald Alvestrand、 Hayato Ito、 Henri Sivonen、 Hongchan Choi、 Hunan Rostomyan、 Ian Hickson、 Igor Bukanov、 Jacob Rossi、 Jake Archibald、 Jake Verbaten、 James Graham、 James Greene、 James M Snell、 James Robinson、 Jayson Chen、 Jeffrey Yasskin、 Jens Lindström、 Jeremy Davis、 Jesse McCarthy、 Jinho Bang、 João Eiras、 Joe Kesselman、 John Atkins、 John Dai、 Jonas Sicking、 Jonathan Kingston、 Jonathan Robie、 Joris van der Wel、 Joshua Bell、 J. S. Choi、 Jungkee Song、 Justin Summerlin、 Kagami Sascha Rosylight、 呂康豪 (Kang-Hao Lu)、 田村健人 (Kent TAMURA)、 Kevin J. Sung、 Kevin Sweeney、 Kirill Topolyan、 Koji Ishii、 Lachlan Hunt、 Lauren Wood、 Luca Casonato、 Luke Zielinski、 Magne Andersson、 Majid Valipour、 Malte Ubl、 Manish Goregaokar、 Manish Tripathi、 Marcos Caceres、 Mark Miller、 Martijn van der Ven、 Mason Freed、 Mats Palmgren、 Mounir Lamouri、 Michael Stramel、 Michael™ Smith、 Mike Champion、 Mike Taylor、 Mike West、 Nicolás Peña Moreno、 Nidhi Jaju、 Ojan Vafai、 Oliver Nightingale、 Olli Pettay、 Ondřej Žára、 Peter Sharpe、 Philip Jägenstedt、 Philippe Le Hégaret、 Piers Wombwell、 Pierre-Marie Dartus、 prosody—Gab Vereable Context(、 Rafael Weinstein、 Rakina Zata Amni、 Richard Bradshaw、 Rick Byers、 Rick Waldron、 Robbert Broersma、 Robin Berjon、 Roland Steiner、 Rune F. Halvorsen、 Russell Bicknell、 Ruud Steltenpool、 Ryosuke Niwa、 Sam Dutton、 Sam Sneddon、 Samuel Giles、 Sanket Joshi、 Scott Haseley、 Sebastian Mayr、 Seo Sanghyeon、 Sergey G. Grekhov、 Shiki Okasaka、 Shinya Kawanaka、 Simon Pieters、 Simon Wülker、 Stef Busking、 Steve Byrne、 Stig Halvorsen、 Tab Atkins、 Takashi Sakamoto、 Takayoshi Kochi、 Theresa O’Connor、 Theodore Dubois、 timeless、 Timo Tijhof、 Tobie Langel、 Tom Pixley、 Travis Leithead、 Trevor Rowbotham、 triple-underscore、 Tristan Fraipont、 Veli Şenol、 Vidur Apparao、 Warren He、 Xidorn Quan、 Yash Handa、 Yehuda Katz、 Yoav Weiss、 Yoichi Osato、 Yoshinori Sano、 Yu Han、 Yusuke Abe、 Zack Weinberg の皆様、素晴らしいご協力ありがとうございました!
この標準は Anne van Kesteren (Apple, annevk@annevk.nl) によって執筆され、 Aryeh Gregor (ayg@aryeh.name) と Ms2ger (ms2ger@gmail.com) の多大な貢献を受けています。
知的財産権
Copyright © WHATWG (Apple, Google, Mozilla, Microsoft)。この作品は クリエイティブ・コモンズ 表示 4.0 国際ライセンス の下でライセンスされています。ソースコードに組み込まれている部分については、BSD 3-Clause License の下でライセンスされます。
これはリビングスタンダードです。特許レビュー版に関心がある方は Living Standard Review Draft をご覧ください。