1. 基盤
この仕様はInfra Standardに依存しています。[INFRA]
この仕様で使用されるいくつかの用語は、Encoding、 Selectors、Web IDL、XML、およびNamespaces in XMLで定義されています。 [ENCODING] [SELECTORS4] [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 .
defaultPrevented
preventDefault()
が正常に呼ばれキャンセル指示された場合は 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とEventInit
eventInitDictが、内部イベント生成手順で示された通り渡されます。
この構造は、初期化辞書のメンバーと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
like
at 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
ノード。
-
DocumentFragment
Element
-
0個以上の
Element
またはCharacterData
ノード。 DocumentType
CharacterData
Attr
-
子なし。
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. 変更アルゴリズム
ノード child の前のノード parent にノード node の事前挿入妥当性を確保するには:
-
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 の 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);
上記の例のスクリプトは
と出力します。なぜなら、以下の順序で処理されるためです。
仕様は、全てまたは一部のノードに対して 接続後手順を定義することもあります。アルゴリズムにはconnectedNodeが渡され、下記の 挿入アルゴリズムで示されます。
接続後手順の目的は、 ノードがconnectedNodeのノードツリーを変更したり、 閲覧コンテキストを作成したり、JavaScriptを実行するなど、接続に関連する操作を行う機会を提供することです。 これらの手順により、ノードのバッチ挿入がスクリプトの観点から アトミックに行われ、主な副作用がノードツリーへのバッチ挿入が完了した後に発生します。 これにより、保留中のノードツリーへの挿入が完全に終了するまで、 さらなる挿入が発生しないことが保証されます。
仕様は、全てまたは一部のノードに対して 子変更手順 を定義することができます。アルゴリズムには引数は渡されず、挿入、 削除、 データ置換から呼び出されます。
ノード挿入を nodeをparentに、childの前に、オプションの監視者抑制フラグ付きで挿入するには、以下の手順を実行します。
-
もしnodeが
DocumentFragment
ノードの場合、 nodesをnodeの子とする。そうでなければ «node» とする。 -
countをnodesのサイズとする。
-
もしcountが0なら、終了する。
-
もしnodeが
DocumentFragment
ノードの場合:-
ツリー変更記録をキューに追加する。対象はnode、« »、nodes、null、null。
このステップは意図的に 監視者抑制フラグを考慮しません。
-
もしchildがnullでない場合:
-
previousSiblingをchildの前の兄弟とする。 childがnullの場合はparentの最後の子とする。
-
nodesの各nodeについて、ツリー順で:
-
もしparentがシャドウホストで、 シャドウルートの スロット割り当てが"
named
"かつ nodeがスロッタブルなら、スロット割り当てを実行する。 -
もしparentのルートがシャドウルートで、 parentがスロットかつ 割り当てられたノードが空の場合は、 スロット変更通知をparentに対して実行する。
-
ツリーのスロッタブル割り当てを nodeのルートで実行する。
-
nodeのシャドウ含む包括的子孫 inclusiveDescendantについて、 シャドウ含むツリー順で:
-
挿入手順をinclusiveDescendantで実行する。
-
もしinclusiveDescendantが要素の場合:
-
もしinclusiveDescendantのカスタム要素レジストリがnullなら、 カスタム要素レジストリの検索を inclusiveDescendantの親で実行し、その結果を inclusiveDescendantのカスタム要素レジストリにセットする。
-
そうでなく、inclusiveDescendantのカスタム要素レジストリの スコープ済がtrueなら、 追加をinclusiveDescendantのノード文書へ、 inclusiveDescendantのカスタム要素レジストリの スコープ文書セットへ行う。
-
もしinclusiveDescendantがカスタムなら、 カスタム要素コールバックリアクションをエンキュー をinclusiveDescendant、コールバック名"
connectedCallback
"、« »で実行する。 -
そうでなければ、アップグレード試行を inclusiveDescendantに対して行う。
このアップグレードが成功した場合、 inclusiveDescendantの
connectedCallback
は 要素のアップグレードアルゴリズムの中で自動的にエンキューされます。
-
-
そうでなく、inclusiveDescendantがシャドウルートの場合:
-
もしinclusiveDescendantのカスタム要素レジストリがnullで、 null維持がfalseの場合は、 カスタム要素レジストリの検索を inclusiveDescendantのホストで実行し、 その結果をinclusiveDescendantのカスタム要素レジストリにセットする。
-
そうでなく、inclusiveDescendantのカスタム要素レジストリがnullでなく、 かつカスタム要素レジストリの スコープ済がtrueなら、 追加をinclusiveDescendantのノード文書へ inclusiveDescendantのカスタム要素レジストリの スコープ文書セットへ行う。
-
-
-
もし監視者抑制フラグが未設定なら、 ツリー変更記録をキューに追加する。対象はparent、nodes、« »、previousSibling、child。
-
子変更手順をparentに対して実行する。
-
staticNodeListをリスト(初期値は« »)とする。
全てのノードを 接続後手順呼び出し前に収集するのは、ノードツリーを走査中に接続後手順でツリー構造が変更される可能性があり、 同じノードに複数回呼び出される恐れがあるためです。
-
nodesの各nodeについて、ツリー順で:
-
nodeのシャドウ含む包括的子孫 inclusiveDescendantについて、 シャドウ含むツリー順で、 追加をstaticNodeListに対して行う。
-
仕様は、すべてまたは一部のノードに対して 移動手順を定義する場合があります。 アルゴリズムにはノード movedNodeと、ノードまたはnullである oldParentが渡されます。これは下記の移動アルゴリズムで示されます。 挿入手順と同様に、 これらの手順はmovedNodeがノードツリーに 参加している場合、そのノードツリーを変更したり、 閲覧コンテキストを作成したり、 イベントを発火したり、 その他JavaScriptを実行してはなりません。ただし、これらの処理を非同期で実行するためにタスクとしてキューに追加することは可能です。
移動を ノードnodeを ノードnewParentの ノードまたはnullであるchildの前に移動するには:
-
もしnewParentのシャドウ含むルートが nodeのシャドウ含むルートと異なる場合、 "HierarchyRequestError" DOMExceptionを投げる。
-
もしnodeがnewParentのホストを含む包括的祖先であれば、 "HierarchyRequestError" DOMExceptionを投げる。
-
もしchildがnullでなく、その親がnewParentでなければ、 "NotFoundError" DOMExceptionを投げる。
-
もしnodeが
Element
またはCharacterData
ノードでなければ、 "HierarchyRequestError" DOMExceptionを投げる。 -
もしnodeが
Text
ノードで、 newParentがドキュメントの場合、 "HierarchyRequestError" DOMExceptionを投げる。 -
もしnewParentがドキュメント、 nodeが
Element
ノードであり、 newParentが要素 子を持つ場合、 またはchildがdoctypeである場合、 またはchildがnullでなくかつdoctypeが childの後にある場合、 "HierarchyRequestError" DOMExceptionを投げる。 -
oldParentをnodeの親とする。
-
Assert: oldParentはnullでない。
-
ライブレンジ削除前手順をnodeについて実行する。
-
NodeIterator
オブジェクトiteratorで、 rootのノード文書が nodeのノード文書であるもの全てについて、NodeIterator
削除前手順を nodeとiteratorで実行する。 -
oldPreviousSiblingをnodeの前の兄弟とする。
-
oldNextSiblingをnodeの次の兄弟とする。
-
もしnodeが割り当て済みなら、 スロッタブル割り当てを nodeの割り当てられたスロットで実行する。
-
もしoldParentのルートがシャドウルートで、 oldParentがスロットかつ 割り当てられたノードが空の場合、 スロット変更通知をoldParentで実行する。
-
-
ツリーのスロッタブル割り当てを oldParentのルートで実行する。
-
ツリーのスロッタブル割り当てを nodeで実行する。
-
-
もしchildがnullでない場合:
-
newPreviousSiblingをchildがnullでない場合はchildの前の兄弟とし、 そうでなければnewParentの最後の子とする。
-
もしnewParentがシャドウホストで、 シャドウルートの スロット割り当てが"
named
"であり、 nodeがスロッタブルなら、 スロット割り当てをnodeで実行する。 -
もしnewParentのルートがシャドウルートで、 newParentがスロットかつ 割り当てられたノードが空の場合は、 スロット変更通知をnewParentで実行する。
-
ツリーのスロッタブル割り当てを nodeのルートで実行する。
-
nodeのシャドウ含む包括的子孫 inclusiveDescendantについて、シャドウ含むツリー順で:
-
もしinclusiveDescendantがnodeなら、 移動手順をinclusiveDescendantとoldParentで実行する。 そうでなければ、移動手順をinclusiveDescendantとnullで実行する。
この移動アルゴリズムは 挿入や削除とは別のプリミティブであるため、 inclusiveDescendantに対して従来の 挿入手順や削除手順は呼び出されません。
-
もしinclusiveDescendantがカスタムで、 newParentが接続済なら、 カスタム要素コールバックリアクションをエンキュー をinclusiveDescendant、コールバック名"
connectedMoveCallback
"、« »で実行する。
-
-
ツリー変更記録をキューに追加する。 oldParent、« »、« node »、oldPreviousSibling、oldNextSiblingを対象とする。
-
ツリー変更記録をキューに追加する。 newParent、« node »、« »、newPreviousSibling、childを対象とする。
追加するには、 nodeをparentに 事前挿入として nodeをparentのnullの前に挿入します。
置換するには、 parent内のchildをnodeで置き換えるには、以下の手順を実行します。
-
もしparentが
Document
、DocumentFragment
、 またはElement
ノードでなければ、 "HierarchyRequestError" DOMExceptionを投げる。 -
もしnodeがparentのホストを含む包括的祖先であれば、 "HierarchyRequestError" DOMExceptionを投げる。
-
もしchildの親がparentでなければ、 "NotFoundError" DOMExceptionを投げる。
-
もしnodeが
DocumentFragment
、DocumentType
、Element
、 またはCharacterData
ノードでなければ、 "HierarchyRequestError" DOMExceptionを投げる。 -
nodeが
Text
ノードであり、 parentがドキュメントである場合、 またはnodeがdoctypeでparentがドキュメントでなければ、 "HierarchyRequestError" DOMExceptionを投げる。 -
もしparentがドキュメントであり、下記のいずれかの条件が nodeが実装するインターフェースごとに真であれば、 "HierarchyRequestError" DOMExceptionを投げる。
DocumentFragment
-
nodeが2つ以上の要素子を持つ場合、 または
Text
ノード子を持つ場合。また、nodeが1つの要素子を持ち、 parentがchild以外の要素子を持つ場合、 またはdoctypeがchildの後にある場合。
Element
DocumentType
上記の条件は事前挿入アルゴリズムと異なります。
-
referenceChildをchildの次の兄弟とする。
-
もしreferenceChildがnodeなら、 referenceChildをnodeの次の兄弟にセットする。
-
previousSiblingをchildの前の兄弟とする。
-
removedNodesを空の集合とする。
-
もしchildの親がnullでなければ:
-
removedNodesに« child »をセットする。
-
削除をchildに監視者抑制フラグをセットして実行する。
上記が偽となるのはchildがnodeの場合のみです。
-
-
nodeが
DocumentFragment
ノードなら nodesをnodeの子とする。そうでなければ« node »とする。 -
挿入を nodeをparentのreferenceChildの前に 監視者抑制フラグ付きで実行する。
-
ツリー変更記録をキューに追加する。 parent、nodes、removedNodes、previousSibling、referenceChildを対象とする。
-
childを返す。
全て置換するには、 parent内の全てをnodeで置換するには、以下の手順を実行します。
-
removedNodesをparentの子とする。
-
addedNodesを空集合とする。
-
もしnodeが
DocumentFragment
ノードなら、 addedNodesをnodeの子にセットする。 -
そうでなく、nodeがnullでなければ、addedNodesを« node »にセットする。
-
もしnodeがnullでなければ、挿入をnodeをparentのnullの前に 監視者抑制フラグ付きで実行する。
-
addedNodesまたはremovedNodesが空でなければ、 ツリー変更記録をキューに追加する。 parent、addedNodes、removedNodes、null、nullを対象とする。
このアルゴリズムはノードツリー の制約を一切チェックしません。仕様策定者は慎重に使用する必要があります。
事前削除するには、 parentからchildを事前削除するには、以下の手順を実行します。
-
もしchildの親がparentでなければ、 "NotFoundError" DOMExceptionを投げる。
-
削除をchildに実行する。
-
childを返す。
仕様は、すべてまたは一部のノードに対して 削除手順を定義する場合があります。 アルゴリズムにはノード removedNodeと、ノードまたはnullの oldParentが渡されます。これは下記の削除アルゴリズムで示されます。
削除を ノードnodeに、 オプションで監視者抑制フラグを指定して実行するには、以下の手順を実行します。
-
parentをnodeの親とする。
-
Assert: parentはnullでない。
-
ライブレンジ削除前手順をnodeで実行する。
-
NodeIterator
オブジェクトiteratorで、 rootのノード文書が nodeのノード文書であるもの全てについて、NodeIterator
削除前手順を nodeとiteratorで実行する。 -
oldPreviousSiblingをnodeの前の兄弟とする。
-
oldNextSiblingをnodeの次の兄弟とする。
-
もしnodeが割り当て済みなら、 スロッタブル割り当てを nodeの割り当てられたスロットで実行する。
-
もしparentのルートがシャドウルートで、 parentがスロットかつ 割り当てられたノードが空の場合は、 スロット変更通知をparentで実行する。
-
-
ツリーのスロッタブル割り当てを parentのルートで実行する。
-
ツリーのスロッタブル割り当てを nodeで実行する。
-
-
削除手順をnodeとparentで実行する。
-
isParentConnectedをparentの接続状態とする。
-
もしnodeがカスタムで、 isParentConnectedがtrueなら、 カスタム要素コールバックリアクションをエンキュー をnode、コールバック名"
disconnectedCallback
"、« »で実行する。 -
nodeのシャドウ含む子孫 descendantについて、シャドウ含むツリー順で:
-
削除手順をdescendantとnullで実行する。
-
もしdescendantがカスタムで、 isParentConnectedがtrueなら、 カスタム要素コールバックリアクションをエンキュー をdescendant、コールバック名"
disconnectedCallback
"、« »で実行する。
-
-
parentの包括的祖先inclusiveAncestorについて、 さらに各 registeredを inclusiveAncestorの登録済みオブザーバリストについて調べ、 もしregisteredのoptions["
subtree
"]がtrueなら、 追加を新しい一時登録済みオブザーバで行い、 observerはregisteredのobserver、optionsは registeredのoptions、sourceはregisteredで nodeの登録済みオブザーバリストに追加する。 -
もし監視者抑制フラグが未設定なら、 ツリー変更記録をキューに追加する。 parent、« »、« node »、oldPreviousSibling、oldNextSiblingを対象とする。
-
子変更手順を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が1つのノードのみなら、 nodeにnodes[0]をセットする。
-
そうでなければ、nodeにノード文書がdocumentである 新しい
DocumentFragment
ノードをセットし、 その後nodes内の各ノード(もしあれば)を 追加する。 -
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
- nodeの子である要素を返します。
element = node .
firstElementChild
- 最初の子で要素であるものを返します。なければnull。
element = node .
lastElementChild
- 最後の子で要素であるものを返します。なければnull。
node . prepend(nodes)
-
nodesをnodeの最初の子の前に挿入します。nodes内の文字列は同等の
Text
ノードに置き換えられます。ノードツリーの制約に違反した場合、"
HierarchyRequestError
"DOMException
を投げます。 node . append(nodes)
-
nodesをnodeの最後の子の後に挿入します。nodes内の文字列は同等の
Text
ノードに置き換えられます。ノードツリーの制約に違反した場合、"
HierarchyRequestError
"DOMException
を投げます。 node . replaceChildren(nodes)
-
nodeの子全てをnodesで置換します。nodes内の文字列は同等の
Text
ノードに置き換えられます。ノードツリーの制約に違反した場合、"
HierarchyRequestError
"DOMException
を投げます。 node . moveBefore(movedNode, child)
-
事前に削除せず、movedNodeをnodeのchildの後に移動します。childがnullの場合はnodeの最後の子の後に移動します。このメソッドはmovedNodeに関連する状態を保持します。
ノードツリーの制約違反、または移動ノードの状態が保持できない場合、"
HierarchyRequestError
"DOMException
を投げます。 node . querySelector(selectors)
node . querySelectorAll(selectors)
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内の文字列は同等の
Text
ノードに置き換えられます。ノードツリーの制約に違反した場合、"
HierarchyRequestError
"DOMException
を投げます。 node .
after(...nodes)
-
nodesをnodeの直後に挿入します。nodes内の文字列は同等の
Text
ノードに置き換えられます。ノードツリーの制約に違反した場合、"
HierarchyRequestError
"DOMException
を投げます。 node .
replaceWith(...nodes)
-
nodeをnodesで置き換えます。nodes内の文字列は同等の
Text
ノードに置き換えられます。ノードツリーの制約に違反した場合、"
HierarchyRequestError
"DOMException
を投げます。 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
- コレクション内のノードの数を返します。
- element = collection .
item(index)
- element = collection[index]
- コレクションからインデックスindexのノードを返します。 コレクション内のノードはツリー順で並べられています。
オブジェクトのサポートされるプロパティインデックスは、ノードの数が0〜(ノード数-1)の範囲の数値です。 要素がない場合、サポートされるプロパティインデックスはありません。
length
属性は、
コレクションで表現されるノード数を返します。
item(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 observerは、
ノードの子孫が削除された後でも
その変化を追跡するために使われます。これは、subtree
がnodeの親でtrueのとき、変化が失われないようにするためです。
4.3.1.
インターフェース MutationObserver
[Exposed =Window ]interface {
MutationObserver constructor (MutationCallback );
callback undefined observe (Node ,
target optional MutationObserverInit = {});
options undefined disconnect ();sequence <MutationRecord >takeRecords (); };callback =
MutationCallback undefined (sequence <MutationRecord >,
mutations MutationObserver );
observer dictionary {
MutationObserverInit boolean =
childList false ;boolean ;
attributes boolean ;
characterData boolean =
subtree false ;boolean ;
attributeOldValue boolean ;
characterDataOldValue sequence <DOMString >; };
attributeFilter
MutationObserver
オブジェクトは、ツリー内のノードの
変化を監視するために使用できます。
各MutationObserver
オブジェクトには、次の概念が関連付けられています:
- 生成時に設定されるcallback
- node list(弱参照リストで、 ノードを保持)、初期値は空
- record queue(キューで、
0個以上の
MutationRecord
オブジェクト)、初期値は空
observer = new
MutationObserver(callback)
MutationObserver
オブジェクトを生成し、そのcallbackにcallbackを設定します。 callbackは、最初の引数にMutationRecord
オブジェクトのリスト、 2番目の引数に生成されたMutationObserver
オブジェクトが渡されて呼び出されます。observe()
メソッドで登録されたノードが変化した後に呼び出されます。observer .
observe(target, options)
-
ユーザーエージェントにtarget(ノード)を監視し、
options(オブジェクト)で指定した条件に基づいて変化を報告するよう指示します。
options引数は、オブジェクトメンバーでミューテーション監視のオプションを設定できます。使用可能なメンバーは以下の通り:
childList
- trueにすると、targetの子への変化を監視します。
attributes
- trueにすると、targetの属性への変化を監視します。
attributeOldValue
やattributeFilter
が指定されている場合は省略可能です。 characterData
- trueにすると、targetのデータへの変化を監視します。
characterDataOldValue
が指定されている場合は省略可能です。 subtree
- trueにすると、targetだけでなくtargetの子孫への変化も監視します。
attributeOldValue
-
attributes
がtrueか省略されていて、targetの属性の値の変化前の値を記録する必要がある場合にtrueを指定します。 characterDataOldValue
-
characterData
がtrueか省略されていて、targetのデータの変化前の値を記録する必要がある場合にtrueを指定します。 attributeFilter
-
すべての属性の変化を監視する必要がなく、
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
"] が存在し、かつ options["attributes
"] が存在しない場合は、 options["attributes
"] をtrueに設定する。 -
もしoptions["
characterDataOldValue
"] が存在し、 options["characterData
"] が存在しない場合は、options["characterData
"] をtrueに設定する。 -
もしoptions["
childList
"]、 options["attributes
"]、 options["characterData
"] のいずれもtrueでなければ、TypeErrorを投げる。 -
もしoptions["
attributeOldValue
"] がtrueかつ options["attributes
"] がfalseなら、TypeErrorを投げる。 -
もしoptions["
attributeFilter
"] が存在し、 options["attributes
"] がfalseなら、TypeErrorを投げる。 -
もしoptions["
characterDataOldValue
"] がtrueかつ options["characterData
"] がfalseなら、TypeErrorを投げる。 -
各registeredについてtargetの registered observer listを繰り返し、 registeredのobserverがthisであれば:
-
各nodeについてthisの node listを繰り返し、 removeで registeredがnodeのregistered observer listにある 全てのtransient registered observerを削除する。
-
registeredのoptionsをoptionsに設定する。
-
-
そうでなければ:
-
新しい registered observer( observerがthis、 optionsがoptions)を targetのregistered observer listに追加する。
-
disconnect()
メソッドの手順は以下の通りです:
-
各nodeについてthisの node listを繰り返し、 removeで nodeのregistered observer listに登録されていて、 thisが observerであるものを削除する。
-
空にするでthisの record queueを空にする。
takeRecords()
メソッドの手順は以下の通りです:
-
recordsをクローンでthisの record queueから作成する。
-
空にするでthisの record queueを空にする。
-
recordsを返す。
4.3.2. ミューテーションレコードのキューイング
ミューテーションレコードをキューするには、type、target、name、namespace、oldValue、addedNodes、removedNodes、previousSibling、nextSiblingを対象に、以下の手順を実行します。
-
interestedObserversを空のマップとする。
-
nodesをtargetの包括的祖先とする。
-
nodes内の各nodeについて、さらに各registeredについて、nodeのregistered observer listを繰り返す:
-
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
- 変更が属性なら"
attributes
"を返す。 ノードがCharacterData
であれば"characterData
"を返す。 ツリーへの変更なら"childList
"を返す。 record .
target
- 変更が起きたノードを返す。
type
に依存する。 "attributes
"の場合は変更された要素、 "characterData
"の場合は変更されたCharacterData
ノード、 "childList
"の場合は変更されたノードの子。 record .
addedNodes
record .
removedNodes
- 追加・削除されたノードをそれぞれ返す。
record .
previousSibling
record .
nextSibling
- 追加・削除されたノードのそれぞれの前の兄弟と次の兄弟を返す。なければnull。
record .
attributeName
- 変更された属性のローカル名を返す。なければnull。
record .
attributeNamespace
- 変更された属性の名前空間を返す。なければnull。
record .
oldValue
- 戻り値は
type
によって異なる。 "attributes
"の場合は変更前の属性値、 "characterData
"の場合は変更前のデータ、 "childList
"の場合はnull。
type
、target
、
addedNodes
、
removedNodes
、
previousSibling
、
nextSibling
、
attributeName
、
attributeNamespace
、
oldValue
の各属性は、それぞれ初期化された値を返す。
4.4. インターフェース Node
[Exposed =Window ]interface :
Node EventTarget {const unsigned short ELEMENT_NODE = 1;const unsigned short ATTRIBUTE_NODE = 2;const unsigned short TEXT_NODE = 3;const unsigned short CDATA_SECTION_NODE = 4;const unsigned short = 5; // legacy
ENTITY_REFERENCE_NODE const unsigned short = 6; // legacy
ENTITY_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; // legacy
NOTATION_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
は、すべてのノードで使用される抽象インターフェースです。直接インスタンス化することはできません。
各ノードには、生成時に設定される ノード文書が関連付けられており、 これはドキュメントです。
ノードのノード文書はadoptアルゴリズムによって変更されることがあります。
ノードの親取得アルゴリズムは、eventを受け取り、割り当てられたスロットがあればそれを返し(割り当て済みの場合)、そうでなければ親を返します。
各ノードにはregistered observer listもあります。
node .
nodeType
-
nodeの型に応じた数値を次のように返します:
Element
(1)。Node
.ELEMENT_NODE
Attr
(2)。Node
.ATTRIBUTE_NODE
- 単独の
Text
ノード
(3)。Node
.TEXT_NODE
CDATASection
(4)。Node
.CDATA_SECTION_NODE
ProcessingInstruction
(7)。Node
.PROCESSING_INSTRUCTION_NODE
Comment
(8)。Node
.COMMENT_NODE
Document
(9)。Node
.DOCUMENT_NODE
DocumentType
(10)。Node
.DOCUMENT_TYPE_NODE
DocumentFragment
(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する型によって最初に一致するものを返します:
Element
ELEMENT_NODE
(1)Attr
ATTRIBUTE_NODE
(2);- 単独の
Text
ノード TEXT_NODE
(3);CDATASection
CDATA_SECTION_NODE
(4);ProcessingInstruction
PROCESSING_INSTRUCTION_NODE
(7);Comment
COMMENT_NODE
(8);Document
DOCUMENT_NODE
(9);DocumentType
DOCUMENT_TYPE_NODE
(10);DocumentFragment
DOCUMENT_FRAGMENT_NODE
(11).
nodeName
ゲッターの手順は、インターフェースthisが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によって切り替えます:
Attr
CharacterData
- その他
-
何もしない。
テキストコンテンツ取得は、 ノードnodeについて、インターフェースnodeがimplementsする型によって次のように返します:
DocumentFragment
Element
- nodeの子孫テキストコンテンツ。
Attr
- nodeの値。
CharacterData
- nodeのデータ。
- その他
- Null。
textContent
ゲッターの手順は、
テキストコンテンツ取得をthisで実行した結果を返します。
文字列全置換は、文字列stringをノードparent内で次の手順で実行します:
-
nodeをnullとする。
-
もしstringが空文字列でなければ、 nodeにデータがstring、 ノード文書がparentのノード文書である新しい
Text
ノードを設定する。 -
全て置換をnodeでparent内で実行する。
テキストコンテンツ設定は、 ノードnodeと文字列valueについて、 インターフェースnodeがimplementsする型によって以下の通りに実行します:
DocumentFragment
Element
-
文字列全置換をvalueでnode内で実行する。
Attr
-
既存属性値の設定をnodeとvalueで行う。
CharacterData
- その他
-
何もしない。
textContent
セッターの手順は、
渡された値がnullの場合は空文字列として扱い、その後テキストコンテンツ設定をthisと渡された値で実行することです。
node .
normalize()
- 空の単独の
Text
ノードを削除し、残りの連続した単独のText
ノードのデータを最初のそのノードに連結します。
normalize()
メソッドの手順は、thisの各子孫単独のText
ノードnodeについて次の手順を実行することです:
- lengthをnodeの長さとする。
- もしlengthが0なら、nodeを削除し、次の単独の
Text
ノードに進む。 - dataをnodeの連続した単独の
Text
ノード(自身を除く)のデータの連結(ツリー順)とする。 - データ置換をノードnode、offset length、count 0、データdataで実行する。
- currentNodeをnodeの次の兄弟とする。
-
while currentNodeが単独の
Text
ノードである間:-
各ライブレンジで、開始ノードがcurrentNodeであるものについて、開始オフセットにlengthを加算し、開始ノードをnodeに設定する。
-
各ライブレンジで、終了ノードがcurrentNodeであるものについて、終了オフセットにlengthを加算し、終了ノードをnodeに設定する。
-
各ライブレンジで、開始ノードがcurrentNodeの親で、開始オフセットがcurrentNodeのインデックスと一致するものについて、開始ノードをnode、開始オフセットをlengthに設定する。
-
各ライブレンジで、終了ノードがcurrentNodeの親で、終了オフセットがcurrentNodeのインデックスと一致するものについて、終了ノードをnode、終了オフセットをlengthに設定する。
-
currentNodeの長さをlengthに加算する。
-
currentNodeをその次の兄弟に設定する。
-
- nodeを削除でnodeの連続した単独の
Text
ノード(自身を除く)をツリー順で削除する。
node . cloneNode([subtree = false])
- nodeのコピーを返します。subtreeがtrueならコピーはnodeの子孫も含みます。
node .
isEqualNode(otherNode)
- nodeとotherNodeが同じプロパティを持つかを返します。
HTML では、クローン手順が、
input
、
script
、
template
などの
複数の要素に対して定義されています。
SVG も自身の
script
要素について同様に定義すべきですが、現在は定義されていません。
ノードの複製は、ノードnodeと、オプションでドキュメントdocument(デフォルトはnodeのノード文書)、boolean型subtree(デフォルトfalse)、ノードまたはnull型parent(デフォルトnull)、nullまたは
CustomElementRegistry
オブジェクト型fallbackRegistry(デフォルトnull)で実行します:
-
copyをnode、document、fallbackRegistryで単一ノード複製した結果とする。
-
parentがnullでなければ、appendでcopyをparentに追加する。
-
subtreeがtrueなら、nodeの子各childについて、ツリー順で、ノードの複製を childに対して、documentにdocument、 subtreeにsubtree、 parentにcopy、 fallbackRegistryにfallbackRegistryを指定して実行する。
-
nodeが要素であり、nodeがシャドウホストで、nodeのシャドウルートの複製可能がtrueなら:
-
shadowRootRegistryをnodeのシャドウルートのカスタム要素レジストリとする。
-
もしshadowRootRegistryがグローバルカスタム要素レジストリなら、 shadowRootRegistryをdocumentの有効なグローバルカスタム要素レジストリに設定する。
-
シャドウルートの付加を copy、nodeのシャドウルートのmode、true、nodeのシャドウルートのserializable、nodeのシャドウルートのdelegates focus、nodeのシャドウルートのslot assignment、shadowRootRegistryで実行する。
-
copyのシャドウルートのdeclarativeを nodeのシャドウルートのdeclarativeに設定する。
-
nodeのシャドウルートの子各childについて、ツリー順で、ノードの複製をchildに対して documentにdocument、 subtreeにsubtree、 parentにcopyのシャドウルートを指定して実行する。
これは意図的にfallbackRegistry引数を渡しません。
-
copyを返す。
単一ノード複製は、ノードnode、ドキュメントdocument、nullまたはCustomElementRegistry
型fallbackRegistryで実行します:
-
copyをnullとする。
-
もしnodeが要素であれば:
-
registryをnodeのカスタム要素レジストリとする。
-
もしregistryがnullなら、registryにfallbackRegistryを設定する。
-
もしregistryがグローバルカスタム要素レジストリなら、registryをdocumentの有効なグローバルカスタム要素レジストリに設定する。
-
copyを要素生成の結果とし、document、nodeのローカル名、nodeの名前空間、nodeの名前空間接頭辞、nodeの
is
値、false、registryを渡す。
-
-
それ以外の場合、copyをnodeがimplementsするインターフェースと同じものを実装し、かつ以下の追加要件を満たすノードとする。interface nodeがimplementsする型によって切り替える:
Document
-
-
copyのエンコーディング、コンテントタイプ、URL、オリジン、型、モード、宣言的シャドウルート許可をnodeと同じ値に設定する。
-
もしnodeのカスタム要素レジストリのis scopedがtrueなら、copyのカスタム要素レジストリにnodeのカスタム要素レジストリを設定する。
-
DocumentType
Attr
Text
Comment
-
copyのデータをnodeと同じ値に設定する。
ProcessingInstruction
- その他
-
何もしない。
-
もしnodeがドキュメントなら、documentにcopyを設定する。
-
copyのノード文書にdocumentを設定する。
-
copyを返す。
cloneNode(subtree)
メソッドの手順は以下の通りです:
-
thisがシャドウルートなら、NotSupportedError(
DOMException
)を投げる。
ノードAが等しいのは、 ノードBについて、以下全ての条件を満たす場合です:
-
AとBは同じインターフェースを実装していること。
-
以下が等しいこと(interface Aがimplementsする型による):
-
AとBが子の数が同じであること。
isEqualNode(otherNode)
メソッドの手順は、
otherNode が null でなく、
this が
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と同一なら、0を返す。
-
node1をother、node2をthisとする。
-
attr1とattr2をnullとする。
-
もしnode2が属性なら:
-
attr2にnode2を設定し、node2をattr2の要素に設定する。
-
もしattr1とnode1がnullでなく、かつnode2がnode1なら:
-
-
もし attr が attr1 と 等しい なら、
DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC
とDOCUMENT_POSITION_PRECEDING
を加算した結果を返す。 -
もし attr が attr2 と 等しい なら、
DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC
とDOCUMENT_POSITION_FOLLOWING
を加算した結果を返す。
-
-
-
-
もしnode1またはnode2がnull、またはnode1のルートがnode2のルートでない場合、
DOCUMENT_POSITION_DISCONNECTED
、DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC
、 さらにDOCUMENT_POSITION_PRECEDING
またはDOCUMENT_POSITION_FOLLOWING
のいずれかを加算した結果を返す(どちらを返すかは一貫性を保つこと)。どちらを返すかは通常ポインタ比較等で実装されます。JavaScriptの実装ではキャッシュされた
Math
値を使うこともできます。. random() -
もしnode1がnode2の祖先で、attr1がnull、またはnode1がnode2かつattr2がnullでない場合、
DOCUMENT_POSITION_CONTAINS
とDOCUMENT_POSITION_PRECEDING
を加算した結果を返す。 -
もしnode1がnode2の子孫で、attr2がnull、またはnode1がnode2かつattr1がnullでない場合、
DOCUMENT_POSITION_CONTAINED_BY
とDOCUMENT_POSITION_FOLLOWING
を加算した結果を返す。 -
もしnode1がnode2より先行していれば、
DOCUMENT_POSITION_PRECEDING
を返す。
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で名前空間を特定するを実行した結果を返す。
-
Document
DocumentType
DocumentFragment
-
nullを返す。
Attr
- その他
lookupPrefix(namespace)
メソッドの手順は:
-
namespaceがnullまたは空文字ならnullを返す。
-
interface thisがimplementsする型によって分岐する:
Element
-
名前空間プレフィックスを特定するをthisにnamespaceで実行した結果を返す。
Document
-
-
名前空間プレフィックスを特定するをthisの文書要素にnamespaceで実行した結果を返す。
DocumentType
DocumentFragment
-
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 = new
Document()
- 新しいドキュメントを返します。
document .
implementation
- documentの
DOMImplementation
オブジェクトを返します。 document .
URL
document .
documentURI
- documentのURLを返します。
document .
compatMode
-
documentのモードが"
quirks
"なら文字列"BackCompat
"、それ以外は"CSS1Compat
"を返します。 document .
characterSet
- documentの エンコーディングを返します。
document .
contentType
- documentの コンテントタイプを返します。
new Document()
コンストラクタの手順は、thisのオリジンをオリジンである
現在のグローバルオブジェクトの関連付けられたDocument
のものに設定することです。[HTML]
createDocument()
とは異なり、
このコンストラクタは
XMLDocument
オブジェクトではなく、ドキュメント
(Document
オブジェクト)を返します。
implementation
ゲッターの手順は、
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)を返します。text = document .
createCDATASection(data)
CDATASection
ノード(データがdata)を返します。comment = document .
createComment(data)
Comment
ノード(データが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をnullにする。
-
isをnullにする。
-
optionsが辞書なら:
-
options["
customElementRegistry
"] が存在する場合、registryにその値を設定する。 -
registryのis scopedがfalseであり、かつregistryがdocumentのカスタム要素レジストリでない場合、 NotSupportedError(
NotSupportedError
・DOMException
)を投げる。 -
registryがnullでなく、かつisがnullでない場合は NotSupportedError(
NotSupportedError
・DOMException
)を投げる。
-
-
registryがnullなら、documentを引数として カスタム要素レジストリの検索を実行した結果をregistryに設定する。
-
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のノード文書をdocumentに設定する。
-
inclusiveDescendantがシャドウルートかつ inclusiveDescendantのカスタム要素レジストリ がグローバルカスタム要素レジストリなら、 inclusiveDescendantのカスタム要素レジストリをdocumentの 有効なグローバルカスタム要素レジストリに設定する。
-
それ以外で、inclusiveDescendantが要素なら:
-
inclusiveDescendantのカスタム要素レジストリ がグローバルカスタム要素レジストリなら、 inclusiveDescendantのカスタム要素レジストリをdocumentの 有効なグローバルカスタム要素レジストリに設定する。
-
-
nodeのシャドウを含む包括的子孫のうちカスタムなものそれぞれについて、 カスタム要素コールバックreactionのキューを inclusiveDescendant、コールバック名"
adoptedCallback
"、« oldDocument, document »で実行する。 -
nodeのシャドウを含む包括的子孫それぞれについて、 シャドウを含む木順で 採用手順をinclusiveDescendant・oldDocumentで実行する。
-
adoptNode(node)
メソッドの手順は以下の通りです:
-
nodeがドキュメントなら NotSupportedError "
NotSupportedError
"DOMException
を投げる。 -
nodeがシャドウルートなら HierarchyRequestError "
HierarchyRequestError
"DOMException
を投げる。 -
nodeが
DocumentFragment
ノードであり、 hostがnullでなければ、returnする。 -
nodeを返す。
NullまたはCustomElementRegistry
オブジェクトregistry
が非nullかつregistryのis
scopedがfalseなら
グローバルカスタム要素レジストリであるとする。
ドキュメント documentの有効なグローバルカスタム要素レジストリは:
-
documentのカスタム要素レジストリ がグローバルカスタム要素レジストリなら documentのカスタム要素レジストリを返す。
-
nullを返す。
createAttribute(localName)
メソッドの手順は以下の通りです:
-
localNameが有効な属性ローカル名でない場合、 InvalidCharacterError "
InvalidCharacterError
"DOMException
を投げる。 - thisがHTMLドキュメントなら localNameをASCII小文字化する。
- 新しい属性(ローカル名がlocalName、ノード文書がthis)を返す。
createAttributeNS(namespace, qualifiedName)
メソッドの手順は以下の通りです:
-
(namespace, prefix, localName)を、"
attribute
"を与えてnamespaceとqualifiedNameを検証・抽出した結果とする。 -
新しい属性(名前空間が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
ノードのhostの概念は、
HTML
のtemplate
要素や
シャドウルートに役立ち、
pre-insertおよび
replace
アルゴリズムにも影響します。
tree = new
DocumentFragment()
- 新しい
DocumentFragment
ノードを返します。
new DocumentFragment()
コンストラクタ手順は、thisのノード文書を
現在のグローバルオブジェクトの関連付けられたDocument
に設定することです。
4.8. インターフェイス ShadowRoot
[Exposed =Window ]interface :
ShadowRoot DocumentFragment {readonly attribute ShadowRootMode mode ;readonly attribute boolean delegatesFocus ;readonly attribute SlotAssignmentMode slotAssignment ;readonly attribute boolean clonable ;readonly attribute boolean serializable ;readonly attribute Element host ;attribute EventHandler onslotchange ; };enum {
ShadowRootMode ,
"open" };
"closed" enum {
SlotAssignmentMode ,
"manual" };
"named"
ShadowRoot
ノードは単に
シャドウルートとして知られています。
シャドウルートの関連付けられたhostは決して null になりません。
シャドウルートには、関連付けられたmode("open
" または "closed
")があります。
シャドウルートには、関連付けられたdelegates focus (真偽値)があります。初期値は false です。
シャドウルートには、関連付けられた element internals で利用可能(真偽値)があります。初期値は false です。
シャドウルートには、関連付けられたdeclarative (真偽値)があります。初期値は false です。
シャドウルートには、関連付けられたslot
assignment
("manual
" または "named
")があります。
シャドウルートには、関連付けられたclonable(真偽値)があります。 初期値は false です。
シャドウルートには、関連付けられたserializable(真偽値)があります。 初期値は false です。
シャドウルートには、関連付けられたcustom element registry
(null または CustomElementRegistry
オブジェクト)があります。初期値は null です。
シャドウルートには、関連付けられた custom element registry を null のままにする(真偽値)があります。 初期値は false です。
これは declarative シャドウルートと組み合わせてのみ true になり得ます。また、シャドウルートのcustom element registry が null の間だけ重要です。
シャドウルートのget the parentアルゴリズムは、 eventが与えられた場合、 eventのcomposed flagが解除されていて、シャドウルートが eventのpathの最初の構造体の invocation targetのrootである場合は null を返し、 それ以外はシャドウルートの hostを返します。
mode
ゲッター手順は、
thisのmodeを返すことです。
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が シャドウルートであれば、 そのhostの シャドウを含む root、 それ以外の場合はそのrootです。
オブジェクト A がオブジェクト B の シャドウを含む子孫であるとは、 A が 子孫である場合、 または A のrootが シャドウルートであり、 Aのrootの hostが シャドウを含む包括的子孫である場合です。
シャドウを含む包括的子孫 とは、オブジェクト自身またはそのシャドウを含む子孫のいずれかです。
オブジェクト A がオブジェクト B の シャドウを含む祖先であるのは、 Bがシャドウを含む子孫である場合に限ります。
シャドウを含む包括的祖先 とは、オブジェクト自身またはそのシャドウを含む祖先のいずれかです。
ノード A が closed-shadow-hiddenであるのは、ノード Bについて、以下のすべての条件が真である場合です:
-
A の ルートは B の シャドウを含む包括的な先祖ではない。
-
A の ルートは シャドウルートであり、 mode が "
closed
" であるか、または A の ルート の ホストが B から見て である。
retargetとは、オブジェクトAをオブジェクト Bに対して次の手順を繰り返し、オブジェクトを返すまで実施することです:
-
以下のいずれかが真の場合
この場合は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 DOMString ); [
value CEReactions ]undefined setAttributeNS (DOMString ?,
namespace DOMString ,
qualifiedName DOMString ); [
value CEReactions ]undefined removeAttribute (DOMString ); [
qualifiedName CEReactions ]undefined removeAttributeNS (DOMString ?,
namespace DOMString ); [
localName CEReactions ]boolean toggleAttribute (DOMString ,
qualifiedName optional boolean );
force boolean hasAttribute (DOMString );
qualifiedName boolean hasAttributeNS (DOMString ?,
namespace DOMString );
localName Attr ?getAttributeNode (DOMString );
qualifiedName Attr ?getAttributeNodeNS (DOMString ?,
namespace DOMString ); [
localName CEReactions ]Attr ?setAttributeNode (Attr ); [
attr CEReactions ]Attr ?setAttributeNodeNS (Attr ); [
attr CEReactions ]Attr removeAttributeNode (Attr );
attr ShadowRoot attachShadow (ShadowRootInit );
init readonly attribute ShadowRoot ?shadowRoot ;readonly attribute CustomElementRegistry ?customElementRegistry ;Element ?closest (DOMString );
selectors boolean matches (DOMString );
selectors boolean webkitMatchesSelector (DOMString ); // legacy alias of .matches
selectors HTMLCollection getElementsByTagName (DOMString );
qualifiedName HTMLCollection getElementsByTagNameNS (DOMString ?,
namespace DOMString );
localName HTMLCollection getElementsByClassName (DOMString ); [
classNames CEReactions ]Element ?insertAdjacentElement (DOMString ,
where Element ); // legacy
element 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 null ; };
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を与えて 属性を設定するには:
-
attrの要素が null でも element でもない場合、 InUseAttributeError
DOMException
をスローする。 -
oldAttr が attr なら、attr を返す。
-
oldAttr が null でなければ、置換 oldAttr を attrにする。
-
それ以外は、追加 attr を elementにする。
-
oldAttr を返す。
要素 element、文字列 localName、文字列 value、オプションの null または文字列 prefix(省略時は null)、オプションの null または文字列 namespace(省略時は null)を与えて 属性値を設定するには:
文字列 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
型の場合、
それを
親要素と呼びます。
ノードの
親が異なる型の場合は
親要素は 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)
-
elementの属性のうち、修飾名がqualifiedNameである最初のものを返します。該当する属性がなければnullを返します。
element . getAttributeNS(namespace, localName)
-
elementの属性のうち、名前空間がnamespace、ローカル名がlocalNameであるものを返します。該当する属性がなければnullを返します。
element . setAttribute(qualifiedName, value)
element . setAttributeNS(namespace, localName, value)
element . removeAttribute(qualifiedName)
element . removeAttributeNS(namespace, localName)
element . toggleAttribute(qualifiedName [, force])
-
forceが与えられない場合、qualifiedNameを「トグル」します。存在すれば除去、なければ追加します。forceがtrueなら追加、falseなら除去します。
qualifiedNameが現在存在すればtrue、そうでなければfalseを返します。
element . hasAttribute(qualifiedName)
-
elementが属性を持ち、その修飾名がqualifiedNameであればtrue、そうでなければfalseを返します。
element . hasAttributeNS(namespace, localName)
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 が有効な属性ローカル名でない場合、InvalidCharacterError
InvalidCharacterError
DOMException
をスローする。パラメータ名に反して、 qualifiedNameは既存の修飾名の属性があれば修飾名として使われ、なければ新しい属性のローカル名として使われます。バリデートは後者だけ必要です。
-
thisがHTML名前空間にあり、そのノード文書がHTML文書なら、 qualifiedName を ASCII小文字に変換する。
-
attribute を thisの 属性リスト内で修飾名が qualifiedName である最初の属性とし、なければ null。
-
attribute が null なら、属性を新しく作り、ローカル名を qualifiedName、値を value、ノード文書を thisのノード文書にし、 追加して return する。
-
変更 attribute を valueにする。
setAttributeNS(namespace, qualifiedName, value)
メソッド手順は以下の通りです:
-
(namespace, prefix, localName) を バリデートおよび抽出(引数は namespace, qualifiedName, "element")の結果とする。
removeAttribute(qualifiedName)
メソッド手順は
名前で属性を除去する(引数は qualifiedName, this)を実行し、undefined を返すことです。
removeAttributeNS(namespace, localName)
メソッド手順は
名前空間とローカル名で属性を除去する
(引数は namespace, localName, this)を実行し、undefined を返すことです。
hasAttribute(qualifiedName)
メソッド手順は以下の通りです:
toggleAttribute(qualifiedName, force)
メソッド手順は以下の通りです:
-
qualifiedName が有効な属性ローカル名でない場合、InvalidCharacterError
InvalidCharacterError
DOMException
をスローする。上記の議論参照。バリデーションは修飾名ではなくローカル名として行います。
-
thisがHTML名前空間にあり、そのノード文書がHTML文書なら、 qualifiedName を ASCII小文字に変換する。
-
attribute を thisの 属性リスト内で修飾名が 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を含まない場合、 NotFoundError
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のカスタム要素レジストリとする。
-
init["
customElementRegistry
"] が null でない場合:-
registry を init["
customElementRegistry
"]とする。 -
registryのis scopedがfalseで、 registryがthisのノード文書の カスタム要素レジストリと異なる場合、 NotSupportedError
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
NotSupportedError
DOMException
をスローする。 -
elementのローカル名が 有効なシャドウホスト名でない場合、 NotSupportedError
NotSupportedError
DOMException
をスローする。 -
elementのローカル名が有効なカスタム要素名である、または elementの
is
値がnullでない場合:-
definition を カスタム要素定義の検索 (引数は elementのカスタム要素レジストリ、名前空間、ローカル名、
is
値)とする。 -
definitionが null でなく、かつ definitionの disable shadowがtrueなら、 NotSupportedError
NotSupportedError
DOMException
をスローする。
-
-
elementがシャドウホストの場合:
-
currentShadowRoot を elementのシャドウルートとする。
-
以下いずれかが真の場合:
-
currentShadowRootのdeclarativeがfalse
-
currentShadowRootのmodeが modeと異なる
この場合は NotSupportedError
NotSupportedError
DOMException
をスローする。 -
-
それ以外の場合:
-
currentShadowRootのdeclarativeをfalseにする。
-
return。
-
-
shadow を新しいシャドウルート(ノード文書は elementのノード文書、hostは element、modeは 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に設定する。
registry = element .
customElementRegistry
-
elementの
CustomElementRegistry
オブジェクトを返します(存在しない場合はnull)。
customElementRegistry
ゲッター手順は
thisのカスタム要素レジストリを返すことです。
element .
closest(selectors)
- elementから始めて selectorsに一致する最初の包括的祖先を返します。一致しなければnull。
element .
matches(selectors)
- elementのrootに対してselectorsと照合し、 elementが一致するならtrue、そうでなければfalse。
closest(selectors)
メソッド手順は:
-
s をselectorsからセレクターを構文解析するの結果とする。 [SELECTORS4]
-
sが失敗ならSyntaxError
SyntaxError
DOMException
をスローする。 -
elements 内の各 element について、s、element、および スコープルート this を用いて セレクターを要素にマッチさせるが成功を返した場合は、 element を返す。[SELECTORS4]
-
null を返す。
matches(selectors)
および
webkitMatchesSelector(selectors)
メソッド手順は:
-
s をselectorsからセレクターを構文解析するの結果とする。 [SELECTORS4]
-
sが失敗ならSyntaxError
SyntaxError
DOMException
をスローする。 -
s、 this、 そしてスコープルート thisを用いて セレクターを要素にマッチさせる の結果が成功を返した場合は true を返し、そうでなければ false を返す。[SELECTORS4]
getElementsByTagName(qualifiedName)
メソッド手順はqualifiedNameがqualifiedNameである要素のリスト(thisに対して)を返すことです。
getElementsByTagNameNS(namespace, localName)
メソッド手順はnamespaceがnamespace、localNameがlocalNameである要素のリスト(thisに対して)を返すことです。
getElementsByClassName(classNames)
メソッド手順はclassNamesがclassNamesである要素のリスト(thisに対して)を返すことです。
隣接挿入には、 要素 element、文字列 where、ノード nodeを与え、whereの最初の ASCII大小区別なし一致に対する手順を実行します:
- "
beforebegin
" -
elementの親が null なら、null を返す。
nodeをelementの 親に elementの前にpre-insertする結果を返す。
- "
afterbegin
" -
nodeをelementの elementの最初の子の前にpre-insertする結果を返す。
- "
beforeend
" -
nodeをelementの null の前にpre-insertする結果を返す。
- "
afterend
" -
elementの親が null なら、null を返す。
nodeをelementの 親に elementの次の兄弟の前にpre-insertする結果を返す。
- それ以外
-
SyntaxError
SyntaxError
DOMException
をスローする。
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
NotFoundError
DOMException
をスローする。 -
attr を返す。
removeNamedItemNS(namespace, localName)
メソッド手順は:
-
attr を 名前空間とローカル名で属性を除去する(引数は namespace, localName, element)の結果とする。
-
attr が null なら、NotFoundError
NotFoundError
DOMException
をスローする。 -
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のローカル名を返すことです。
既存の属性値を設定するには、属性 attributeと 文字列 valueを与えて、下記手順を実行します:
value
セッター手順は 既存の属性値を設定する(引数は this、与えられた値)を実行することです。
ownerElement
ゲッター手順は
thisの要素を返すことです。
specified
ゲッター手順は true を返すことです。
4.10.
インターフェイス CharacterData
[Exposed =Window ]interface :
CharacterData Node {attribute [LegacyNullToEmptyString ]DOMString data ;readonly attribute unsigned long length ;DOMString substringData (unsigned long ,
offset unsigned long );
count undefined appendData (DOMString );
data undefined insertData (unsigned long ,
offset DOMString );
data undefined deleteData (unsigned long ,
offset unsigned long );
count undefined replaceData (unsigned long ,
offset unsigned long ,
count DOMString ); };
data
CharacterData
は抽象インターフェイスです。直接インスタンス化することはできません。
Text
、ProcessingInstruction
、
Comment
ノードで使用されます。
各ノード(CharacterData
インターフェイス継承)は、
dataと呼ばれる可変文字列を持ちます。
データを置換するには、 ノード node、オフセットoffset、カウントcount、データdataを与えて、次の手順を実行します:
- length を nodeのlengthとする。
- offset が length より大きい場合、IndexSizeError
IndexSizeError
DOMException
をスローする。 - 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
IndexSizeError
DOMException
をスローする。 - offset + count が length より大きい場合は、 nodeのdataの offset番目のコード単位から最後までの文字列を返して終了。
- それ以外は nodeのdataの offset番目のコード単位から offset+count番目のコード単位までの文字列を返す。
data
ゲッター手順は
thisのdataを返すことです。セッターは
データを置換する(ノード
this、オフセット0、
カウント thisのlength、新しい値)を実行することです。
length
ゲッター手順は
thisのlengthを返すことです。
substringData(offset, count)
メソッドの手順は、ノード substring data を
this、
offset offset、count count で実行した結果を返すことである。
appendData(data)
メソッド手順は
データを置換する(ノード this、
オフセット thisのlength、カウント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は dataです。 text .
splitText(offset)
- dataを指定された
offsetで分割し、残りを
Text
ノードとして返します。 text .
wholeText
- 全ての直接の
Text
ノード 兄弟の dataを連結して返します。
排他的なText
ノードは、
Text
ノードで、
CDATASection
ノードでないものです。
連続するText
ノードは、
ノードnodeに対し、
node、nodeの前の兄弟のText
ノード(あれば)とその
連続するText
ノード、
nodeの次の兄弟
Text
ノード(あれば)とその 連続するText
ノードを含み、重複は避けます。
連続する排他的Text
ノードは、
ノードnodeに対し、
node、nodeの前の兄弟の
排他的Text
ノード(あれば)とその
連続する排他的Text
ノード、
nodeの
次の兄弟の
排他的Text
ノード(あれば)とその
連続する排他的Text
ノードを含み、重複は避けます。
子のテキスト内容は、
ノードnodeに対し、
nodeの全てのText
ノード 子の
dataを
連結(ツリー順で)したものです。
子孫のテキスト内容は、
ノードnodeに対し、
nodeの全てのText
ノード
子孫の
dataを
連結(ツリー順で)したものです。
new Text(data)
コンストラクタ手順は、thisのdataをdataに設定し、
thisのノード文書を
current global objectの
関連付けられたDocument
に設定することです。
Textノードを分割するには、
Text
ノードnodeと
オフセットoffsetを与えて、次の手順を実行します:
- length を nodeのlengthとする。
- offset が length より大きい場合、IndexSizeError
IndexSizeError
DOMException
をスローする。 - count を length - offsetとする。
- new data を データの部分文字列(ノード node、オフセットoffset、カウントcount)の結果とする。
- new node を新しい
Text
ノード(ノード文書は nodeと同じ)、new nodeの dataにnew dataを設定する。 - parent を nodeの 親とする。
-
parentが null でない場合:
-
各live rangeで start nodeがnode、 start offsetがoffsetより大きい場合、 start nodeをnew nodeにし、 start offset を offsetだけ減らす。
-
各live rangeで end nodeがnode、 end offsetがoffsetより大きい場合、 end nodeをnew nodeにし、 end offsetを offsetだけ減らす。
-
各live rangeで start nodeがparent、 start offsetがnodeのindex+1と等しい場合、 start offsetを1増やす。
-
各live rangeで end nodeがparent、 end offsetがnodeのindex+1と等しい場合、 end offsetを1増やす。
- データを置換する (ノード node、オフセットoffset、カウントcount、データ空文字列)を実行する。
- new nodeを返す。
メソッド splitText(offset)
の手順は、
オフセット offset を使用して 分割するために
this を呼び出します。
wholeText
ゲッター手順は、
連結した
data(連続する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のノード文書を
current global objectの
関連付けられた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が折り畳み済みなら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
ノードの場合、InvalidNodeTypeErrorInvalidNodeTypeError
DOMException
をスローする。 -
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
属性値は 包含されるでも 部分的に包含されるでもありません。 -
もし開始ノードが 終了ノードの 祖先である場合、 共通の包括的祖先は 開始ノードとなります。その子のうちちょうど一つが 部分的に包含されることになり、 子は 包含されるのは、 先行する 部分的に包含される子の場合のみです。 終了ノードが 開始ノードの 祖先である場合は逆になります。
-
もし開始ノードが 終了ノードの 包括的祖先でなく、逆もまた然りの場合、 共通の包括的祖先は両者と異なるノードとなります。その子のうちちょうど2つが 部分的に包含されることになり、 子はその2つの間にある場合のみ 包含されます。
ライブ範囲除去前手順として、 ノード nodeを与えた場合、以下の通りです:
-
parent を nodeの親とする。
-
アサート: parent は null でない。
-
index を nodeのインデックスとする。
-
ライブ範囲のうち、 開始ノードがnodeの 包括的子孫であるものについて、 その開始を (parent, index)に設定する。
-
ライブ範囲のうち、 終了ノードがnodeの 包括的子孫であるものについて、 その終了を(parent, index)に設定する。
-
ライブ範囲のうち、 開始ノードがparentで、 開始オフセットがindexより大きいものについて、 その開始オフセットを1減らす。
-
ライブ範囲のうち、 終了ノードがparentで、 終了オフセットがindexより大きいものについて、 その終了オフセットを1減らす。
range = new Range()
- 新しいライブ範囲を返します。
new Range()
コンストラクタ手順は、
thisの
開始と
終了を
(current global objectの
関連付けられたDocument
, 0) に設定することです。
- container = range .
commonAncestorContainer
- documentから最も遠い、 両方の range の 開始ノード と 終了ノードの 祖先である ノードを返します。
commonAncestorContainer
ゲッター手順は:
開始または終了を設定する には、rangeの境界点 (node, offset)を与え、次の手順を実行します:
- nodeがdoctypeの場合、
InvalidNodeTypeError
InvalidNodeTypeError
DOMException
をスローする。 - offsetがnodeの長さより大きい場合、
IndexSizeError
IndexSizeError
DOMException
をスローする。 - bp を境界点 (node, offset)とする。
setStart(node, offset)
メソッド手順は、
開始を設定する
(this、境界点(node,
offset)) を実行することです。
setEnd(node, offset)
メソッド手順は、
終了を設定する
(this、境界点(node,
offset)) を実行することです。
setStartBefore(node)
メソッド手順は:
- parent を nodeの親とする。
- parentが null の場合、InvalidNodeTypeError
InvalidNodeTypeError
DOMException
をスローする。 - 開始を設定する (this、 境界点( parent, nodeのインデックス)) を実行する。
setStartAfter(node)
メソッド手順は:
-
parent を nodeの親とする。
-
parentが null の場合、InvalidNodeTypeError
InvalidNodeTypeError
DOMException
をスローする。
setEndBefore(node)
メソッド手順は:
- parent を nodeの親とする。
- parentが null の場合、InvalidNodeTypeError
InvalidNodeTypeError
DOMException
をスローする。 - 終了を設定する (this、 境界点( parent, nodeのインデックス)) を実行する。
setEndAfter(node)
メソッド手順は:
-
parent を nodeの親とする。
-
parentが null の場合、InvalidNodeTypeError
InvalidNodeTypeError
DOMException
をスローする。
collapse(toStart)
メソッド手順は、
toStartがtrueなら終了を開始に設定し、そうでなければ
開始を
終了に設定することです。
ノードを選択するには、 ノード nodeを 範囲 range内で 次の手順を実行します:
-
parent を nodeの親とする。
-
parentが null の場合、InvalidNodeTypeError
InvalidNodeTypeError
DOMException
をスローする。 -
index を nodeのインデックスとする。
selectNode(node)
メソッド手順は、
ノードを選択する
(node, this) を実行することです。
selectNodeContents(node)
メソッド手順は:
-
nodeがdoctypeの場合、InvalidNodeTypeError
InvalidNodeTypeError
DOMException
をスローする。 -
length を nodeの長さとする。
compareBoundaryPoints(how, sourceRange)
メソッドの手順は以下の通りです:
-
howが
以外の場合は、NotSupportedErrorNotSupportedError
DOMException
をスローする。 - thisの
ルートが
sourceRangeの
ルートと異なる場合は、
WrongDocumentError
WrongDocumentError
DOMException
をスローする。 -
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の 開始ノード、 開始オフセット、 終了ノード、 終了オフセットとする。
-
original start nodeがoriginal end nodeと等しく、 かつ
CharacterData
ノードであれば、 データ置換 (ノード original start node、オフセット original start offset、カウント original end offset− original start offset、データ空文字列)を実行し、returnする。 - nodes to remove を包含される
ノード(this内、ツリー順、かつ
親も
this
内で包含されている場合は省略)とするリストにする。 - original start nodeがoriginal end nodeの 包括的祖先であれば、 new nodeをoriginal start node、new offsetをoriginal start offsetとする。
-
original start nodeが
CharacterData
ノードなら データ置換 (ノードoriginal start node、オフセット original start offset、カウントoriginal start nodeの長さ − original start offset、データ空文字列)を実行する。 -
original end nodeが
CharacterData
ノードなら データ置換 (ノード original end node、オフセット0、カウント original end offset、データ空文字列)を実行する。 - 開始と 終了を (new node, new offset)に設定する。
範囲を抽出するには、 ライブ範囲 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
ノードの場合:- cloneを 複製(ノードoriginal start node)とする。
- cloneのdataを 部分文字列取得(ノード original start node、オフセット original start offset、カウント original end offset− original start offset)の結果に設定する。
- appendでcloneをfragmentへ追加。
- データ置換 (ノード original start node、オフセット original start offset、カウント original end offset− original start offset、データ空文字列)を実行。
- fragmentを返す。
- common ancestor を original start nodeとする。
- common ancestorがoriginal end nodeの 包括的祖先でない間、 common ancestorをその親にする。
- first partially contained childをnullにする。
- original start nodeがnot 包括的祖先であれば、 first partially contained childをcommon ancestorの 子のうち 部分的に包含されるものの最初のものとする。
- last partially contained childをnullにする。
-
- original end nodeがnot
包括的祖先であれば、
last partially contained childをcommon ancestorの
子のうち
部分的に包含されるものの最後のものとする。
これらの変数代入は常に妥当です。 例えば、original start nodeが 包括的祖先でない場合、 original start node自身がrange内で 部分的に包含されることになり、 その祖先も同様にcommon ancestorの 子まで遡る。 common ancestorはoriginal start node自体にはならず、 包括的祖先である必要がある。もう一方のパターンも同様で、 両方が定義されている場合は二つの子は一致しない。
- original end nodeがnot
包括的祖先であれば、
last partially contained childをcommon ancestorの
子のうち
部分的に包含されるものの最後のものとする。
- contained childrenをcommon ancestorの 子のうち 包含されるもの(ツリー順)とするリストにする。
-
contained childrenのどれかがdoctypeなら、 HierarchyRequestError
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、オフセット original start offset、カウントoriginal start nodeの長さ−original start offset)の結果に設定する。
-
appendでcloneをfragmentへ追加。
-
データ置換 (ノードoriginal start node、オフセット original start offset、カウントoriginal start nodeの長さ−original start offset、データ空文字列)を実行。
-
- それ以外でfirst partially contained childがnullでない場合:
- contained children内の各contained childを appendで fragmentへ追加。
-
last partially contained childが
CharacterData
ノードの場合:この場合、last partially contained childは original end nodeです。
- それ以外でlast partially contained childがnullでない場合:
- rangeの開始と 終了を (new node, new offset)に設定する。
- fragmentを返す。
extractContents()
メソッドの手順は、抽出(this)の結果を返すことです。
内容を複製する には、ライブ範囲 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の 包括的祖先でない間、 common ancestorをその親にする。
- first partially contained childをnullにする。
- original start nodeがnot 包括的祖先であれば、 first partially contained childをcommon ancestorの 子のうち 部分的に包含されるものの最初のものとする。
- last partially contained childをnullにする。
-
- original end nodeがnot
包括的祖先であれば、
last partially contained childをcommon ancestorの
子のうち
部分的に包含されるものの最後のものとする。
これらの変数代入は常に妥当です。 例えば、original start nodeが 包括的祖先でない場合、 original start node自身がrange内で 部分的に包含されることになり、 その祖先も同様にcommon ancestorの 子まで遡る。 common ancestorはoriginal start node自体にはならず、 包括的祖先である必要がある。もう一方のパターンも同様で、 両方が定義されている場合は二つの子は一致しない。
- original end nodeがnot
包括的祖先であれば、
last partially contained childをcommon ancestorの
子のうち
部分的に包含されるものの最後のものとする。
- contained childrenをcommon ancestorの 子のうち 包含されるもの(ツリー順)とするリストにする。
-
contained childrenのどれかがdoctypeなら、 HierarchyRequestError
HierarchyRequestError
DOMException
をスローする。最初や最後の部分的に包含されるノードについては心配不要です。 doctypeは部分的に包含されることがなく、 範囲の境界点にもならず、何かの祖先にもなりません。
-
first partially contained childが
CharacterData
ノードの場合:この場合、first partially contained childは original start nodeです。
- それ以外でfirst partially contained childがnullでない場合:
- contained children内の各contained childについて:
-
last partially contained childが
CharacterData
ノードの場合:この場合、last partially contained childは original end nodeです。
- それ以外でlast partially contained childがnullでない場合:
- fragmentを返す。
cloneContents()
メソッドの手順は、内容を複製(this)の結果を返すことです。
挿入は、ノード nodeをライブ範囲 rangeに挿入する手順です:
- rangeの開始ノードが
ProcessingInstruction
、Comment
ノード、Text
ノードで親がnull、 またはnode自身の場合は、HierarchyRequestErrorHierarchyRequestError
DOMException
をスローする。 - referenceNodeをnullにする。
- rangeの開始ノードが
Text
ノードなら、 referenceNodeをそのText
ノードにする。 - それ以外なら、referenceNodeを 開始ノードの 子で インデックスが 開始オフセットのもの、 該当する子がなければnullにする。
- parentをreferenceNodeがnullならrangeの開始ノード、 そうでなければreferenceNodeの親にする。
- 挿入前の妥当性確認をnode、parent、referenceNodeに対して行う。
- rangeの開始ノードが
Text
ノードなら、 referenceNodeを分割(オフセットはrangeの開始オフセット)の結果にする。 - nodeがreferenceNodeの場合は、referenceNodeをその次兄弟にする。
- nodeの親がnullでない場合は、 除去する。
- newOffsetをreferenceNodeがnullならparentの長さ、そうでなければreferenceNodeのインデックスにする。
- nodeが
DocumentFragment
ノードなら、 newOffsetにnodeの長さを加算、 そうでなければ1加算する。 - pre-insert でnodeをparentのreferenceNodeの前に挿入する。
insertNode(node)
メソッドの手順は、
挿入
(node, this)を実行することです。
surroundContents(newParent)
メソッド手順は:
-
非
Text
ノードが 部分的に包含される場合、 InvalidStateErrorInvalidStateError
DOMException
をスローする。 -
newParentが
Document
、DocumentType
、DocumentFragment
ノードの場合は、 InvalidNodeTypeErrorInvalidNodeTypeError
DOMException
をスローする。歴史的理由により
CharacterData
ノードはここではチェックされず、後で副作用として例外が投げられます。 -
newParentが子を持つ場合、 replace all (null) をnewParent内で実行する。
-
appendで fragmentをnewParentへ追加する。
cloneRange()
メソッドの手順は、新しい
ライブ範囲(開始・終了は開始と終了がthisと同じ)を返すことです。
detach()
メソッドの手順は何もしないことです。
この機能(Range
オブジェクトの無効化)は削除されましたが、
メソッド自体は互換性のため残されています。
- position = range .
comparePoint(node, offset)
- 点が範囲より前なら−1、範囲内なら0、後なら1を返します。
- intersects = range .
intersectsNode(node)
- rangeがnodeと交差するかどうかを返します。
isPointInRange(node, offset)
メソッドの手順は:
- nodeのルートがthisの ルートと異なればfalseを返す。
- nodeがdoctypeなら、InvalidNodeTypeError
InvalidNodeTypeError
DOMException
をスローする。 -
offsetがnodeの長さより大きい場合、 IndexSizeError
IndexSizeError
DOMException
をスローする。 - (node, offset)が 前 開始または 後 終了の場合はfalse。
- trueを返す。
comparePoint(node, offset)
メソッドの手順は:
- nodeのルートがthisの
ルートと異なる場合、
WrongDocumentError
WrongDocumentError
DOMException
をスローする。 - nodeがdoctypeの場合、
InvalidNodeTypeError
InvalidNodeTypeError
DOMException
をスローする。 -
offsetがnodeの長さより大きい場合、 IndexSizeError
IndexSizeError
DOMException
をスローする。 - (node, offset)が 前 開始なら−1。
- (node, offset)が 後 終了なら1。
- 0を返す。
intersectsNode(node)
メソッドの手順は:
文字列化挙動は以下の手順を実行すること:
-
sを空文字列とする。
-
thisの開始ノードがthisの終了ノードと同じで
Text
ノードなら、 そのText
ノードのdataの thisの 開始オフセットから thisの終了オフセットまでの部分文字列を返す。 -
thisの開始ノードが
Text
ノードなら そのノードのdataのthisの 開始オフセットから末尾までの部分文字列をsに追加。 -
thisの終了ノードが
Text
ノードなら そのノードのdataの先頭から thisの 終了オフセットまでの部分文字列をsに追加。 -
sを返す。
createContextualFragment()
、
getClientRects()
、
getBoundingClientRect()
メソッドは他の仕様で定義されています。
[DOM-Parsing]
[CSSOM-VIEW]
6. 走査
NodeIterator
および TreeWalker
オブジェクトは、ノード
ツリーをフィルターし走査するために利用できます。
各NodeIterator
および TreeWalker
オブジェクトは、再帰的な呼び出しを防ぐための
activeフラグ を持ちます。初期状態では未設定です。
各NodeIterator
および TreeWalker
オブジェクトはさらに、
root(ノード)、whatToShow(ビットマスク)、および
filter(コールバック)を持ちます。
フィルターを
ノード nodeに対して
NodeIterator
または TreeWalker
オブジェクト traverser 内で適用するには、以下の手順を実行します:
-
traverserのactiveフラグが設定されていれば、 "
InvalidStateError
"DOMException
をスローする。 -
n を nodeの
nodeType
属性値 − 1 とする。 -
traverserのwhatToShowの n番目のビット(0が最下位ビット)が設定されていなければ、
FILTER_SKIP
を返す。 -
traverserのfilterがnullなら
FILTER_ACCEPT
を返す。 -
traverserのactiveフラグを設定する。
-
resultを ユーザーオブジェクトのoperationを呼び出す (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
オブジェクトは
createNodeIterator()
メソッドをDocument
オブジェクト上で使って生成できます。
各NodeIterator
オブジェクトには関連する
iterator collection(
collectionで
NodeIterator
オブジェクトのrootをルートとし、
フィルターはすべてのノードに一致)を持ちます。
各NodeIterator
オブジェクトにはさらに、関連する reference(
ノード)および
pointer before reference(boolean)も持ちます。
前述の通り、NodeIterator
オブジェクトには
activeフラグ、
root、
whatToShow、
filter
も関連付けられています。
NodeIterator
除去前手順
は、nodeIteratorとtoBeRemovedNodeを与え、以下の通りです:
-
toBeRemovedNodeがnodeIteratorのreferenceの包括的祖先でないか、 toBeRemovedNodeがnodeIteratorのrootならreturn。
-
nodeIteratorのpointer before referenceがtrueなら:
-
toBeRemovedNode の 前の兄弟 が null の場合、 nodeIterator の 参照 を toBeRemovedNode の 親 に設定し、それ以外の場合は、 toBeRemovedNode の 前の兄弟 の 包括的子孫で 木の順序で最後に現れるものに設定する。
referenceNode
ゲッター手順は
thisのreferenceを返すこと。
pointerBeforeReferenceNode
ゲッター手順は
thisのpointer before referenceを返すこと。
whatToShow
ゲッター手順は
thisのwhatToShowを返すこと。
filter
ゲッター手順は
thisのfilterを返すこと。
走査は、
NodeIterator
オブジェクト iteratorと方向directionを与えて、以下の手順を実行する:
-
nodeをiteratorのreferenceとする。
-
beforeNodeをiteratorの pointer before referenceとする。
-
while true:
-
directionで分岐:
- next
-
beforeNodeがfalseなら、nodeをiteratorの iterator collectionで nodeの最初のfollowingノードにする。該当がなければnullを返す。
beforeNodeがtrueならfalseにする。
- previous
-
beforeNodeがtrueなら、nodeをiteratorの iterator collectionで nodeの最初のprecedingノードにする。該当がなければnullを返す。
beforeNodeがfalseならtrueにする。
-
resultをiterator内でnodeをフィルターした結果とする。
-
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
オブジェクトは createTreeWalker()
メソッドを Document
オブジェクト上で利用して生成できます。
各TreeWalker
オブジェクトには関連する current(
ノード)が存在します。
前述の通り、TreeWalker
オブジェクトには
root、
whatToShow、
filter
も関連付けられています。
whatToShow
ゲッター手順は
thisのwhatToShowを返すこと。
filter
ゲッター手順は
thisのfilterを返すこと。
currentNode
ゲッター手順は
thisのcurrentを返すこと。
currentNode
セッター手順は
thisの
currentを与えられた値に設定すること。
parentNode()
メソッド手順は:
-
nullを返す。
子を走査するは walkerとtypeを与え、以下の手順を実行する:
-
nodeをwalkerのcurrentとする。
-
typeがfirstならnodeをnodeのfirst childに、 lastならnodeをnodeのlast childに設定する。
-
nodeがnullでない間:
-
resultをnodeをwalker内でフィルターした結果とする。
-
resultが
FILTER_ACCEPT
なら walkerのcurrentをnodeにし、nodeを返す。 -
resultが
FILTER_SKIP
の場合:-
typeがfirstならchildをnodeのfirst childに、 lastならchildをnodeのlast childに設定する。
-
childがnullでなければnodeをchildに設定し、 continueする。
-
-
nodeがnullでない間:
-
typeがfirstならsiblingをnodeのnext siblingに、 lastならsiblingをnodeのprevious siblingに設定する。
-
siblingがnullでなければnodeをsiblingに設定し、 breakする。
-
parentをnodeの親とする。
-
nodeをparentに設定する。
-
-
-
nullを返す。
firstChild()
メソッド手順は
子を走査する
(this,
first)を実行すること。
lastChild()
メソッド手順は
子を走査する
(this,
last)を実行すること。
兄弟を走査するは walkerとtypeを与え、以下の手順を実行する:
-
nodeをwalkerのcurrentとする。
-
nodeがrootならnullを返す。
-
while true:
-
typeがnextならsiblingをnodeのnext siblingに、 previousならsiblingをnodeのprevious siblingに設定する。
-
siblingがnullでない間:
-
nodeをsiblingに設定する。
-
resultをnodeをwalker内でフィルターした結果とする。
-
resultが
FILTER_ACCEPT
なら walkerのcurrentをnodeにし、nodeを返す。 -
typeがnextならsiblingをnodeのfirst childに、 previousならsiblingをnodeのlast childに設定する。
-
resultが
FILTER_REJECT
またはsiblingがnullなら typeがnextならsiblingをnodeのnext siblingに、 previousならsiblingをnodeのprevious siblingに設定する。
-
-
nodeをnodeの親に設定する。
-
nodeがnullまたはwalkerのrootならnullを返す。
-
nodeをwalker内でフィルターした結果が
FILTER_ACCEPT
ならnullを返す。
-
nextSibling()
メソッド手順は
兄弟を走査する
(this,
next)を実行すること。
previousSibling()
メソッド手順は
兄弟を走査する
(this,
previous)を実行すること。
previousNode()
メソッド手順は:
-
-
siblingをnodeのprevious siblingに設定する。
-
siblingがnullでない間:
-
nodeをsiblingに設定する。
-
resultが
FILTER_REJECT
でなく、かつnodeが子を持つ間:-
nodeをnodeのlast childに設定する。
-
-
resultが
FILTER_ACCEPT
なら、 thisの currentをnodeにし、nodeを返す。 -
siblingをnodeのprevious siblingに設定する。
-
-
nodeをnodeの親に設定する。
-
nodeをフィルター (this内)した結果が
FILTER_ACCEPT
なら thisのcurrentをnodeにし、nodeを返す。
-
-
nullを返す。
nextNode()
メソッド手順は:
-
resultを
FILTER_ACCEPT
にする。 -
while true:
-
resultが
FILTER_REJECT
でなく、 かつnodeが子を持つ間:-
nodeをnodeのfirst childに設定する。
-
resultが
FILTER_ACCEPT
なら thisのcurrentをnodeにし、nodeを返す。
-
-
siblingをnullにする。
-
temporaryをnodeにする。
-
temporaryがnullでない間:
-
siblingをtemporaryのnext siblingに設定する。
-
siblingがnullでなければnodeをsiblingに設定し、 breakする。
-
temporaryをtemporaryの親に設定する。
-
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; // legacy
SHOW_ENTITY_REFERENCE const unsigned long = 0x20; // legacy
SHOW_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; // legacy
SHOW_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に対して以下の通りです:
-
関連付けられた属性のローカル名に サポートされるトークンが定義されていなければ、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 whitespaceが含まれていれば"
InvalidCharacterError
"DOMException
をスローする。 tokenlist . remove(tokens…)
-
渡された引数を、存在すれば削除する。
引数に空文字列が含まれていれば"
SyntaxError
"DOMException
をスローする。引数にASCII whitespaceが含まれていれば"
InvalidCharacterError
"DOMException
をスローする。 tokenlist . toggle(token [, force])
-
forceが与えられない場合はtokenを「トグル」し、存在すれば削除、存在しなければ追加する。forceがtrueならtokenを追加 (
add()
と同じ)。 forceがfalseならtokenを削除 (remove()
と同じ)。tokenが現在存在すればtrue、そうでなければfalseを返す。
tokenが空文字列なら"
SyntaxError
"DOMException
をスローする。tokenにスペースが含まれていれば"
InvalidCharacterError
"DOMException
をスローする。 tokenlist . replace(token, newToken)
-
tokenをnewTokenで置き換える。
tokenがnewTokenに置き換わればtrue、そうでなければfalse。
引数に空文字列が含まれていれば"
SyntaxError
"DOMException
をスローする。引数にASCII whitespaceが含まれていれば"
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…)
メソッドの手順は:
-
tokens内の各tokenについて:
-
tokenが空文字列ならSyntaxErrorをスローする。
-
tokenにASCII whitespaceが含まれていればInvalidCharacterErrorをスローする。
-
-
更新手順を実行する。
remove(tokens…)
メソッドの手順は:
-
tokens内の各tokenについて:
-
tokenが空文字列ならSyntaxErrorをスローする。
-
tokenにASCII whitespaceが含まれていればInvalidCharacterErrorをスローする。
-
-
更新手順を実行する。
toggle(token, force)
メソッドの手順は:
-
tokenが空文字列ならSyntaxErrorをスローする。
-
tokenにASCII whitespaceが含まれていればInvalidCharacterErrorをスローする。
-
それ以外でforceが与えられていないかtrueなら、 トークン追加 をtokenに対して実行し、更新手順を実行し、trueを返す。
-
falseを返す。
更新手順はweb互換性のためtoggle()
で常に実行されるわけではありません。
replace(token, newToken)
メソッドの手順は:
-
tokenまたはnewTokenが空文字列ならSyntaxErrorをスローする。
-
tokenまたはnewTokenにASCII whitespaceが含まれていればInvalidCharacterErrorをスローする。
-
更新手順を実行する。
-
trueを返す。
更新手順はweb互換性のためreplace()
で常に実行されるわけではありません。
supports(token)
メソッドの手順は:
-
resultを検証手順(引数はtoken)の返り値とする。
-
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 = 0
XPathExpression 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 = 0
nodeResolver 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. 歴史的事項
この標準には、かつて含まれていたが削除された複数のインターフェイスやインターフェイスメンバーがあります。
以下のインターフェイスは削除されました:
DOMConfiguration
DOMError
DOMErrorHandler
DOMImplementationList
DOMImplementationSource
DOMLocator
DOMObject
DOMUserData
Entity
EntityReference
MutationEvent
MutationNameEvent
NameList
Notation
RangeException
TypeInfo
UserDataHandler
また、以下のインターフェイスメンバーが削除されました:
Attr
-
schemaTypeInfo
isId
Document
-
createEntityReference()
xmlEncoding
xmlStandalone
xmlVersion
strictErrorChecking
domConfig
normalizeDocument()
renameNode()
DocumentType
-
entities
notations
internalSubset
DOMImplementation
-
getFeature()
Element
-
schemaTypeInfo
setIdAttribute()
setIdAttributeNS()
setIdAttributeNode()
Node
-
isSupported
getFeature()
getUserData()
setUserData()
NodeIterator
-
expandEntityReferences
Text
-
isElementContentWhitespace
replaceWholeText()
TreeWalker
-
expandEntityReferences
謝辞
DOM の相互運用性向上に長年にわたり貢献してくださった多くの方々に感謝します。同様に、この標準が今日の形となるまで支えてくださった方々にも感謝いたします。
以下の皆様に心より感謝いたします: Adam Klein、 Adrian Bateman、 Ahmid snuggs、 Alex Komoroske、 Alex Russell、 Alexey Shvayka、 Andreas Kling、 Andreu Botella、 Anthony Ramine、 Arkadiusz Michalski、 Arnaud Le Hors、 Arun Ranganathan、 Benjamin Gruenbaum、 Björn Höhrmann、 Boris Zbarsky、 Brandon Payton、 Brandon Slade、 Brandon Wallace、 Brian Kardell、 C. Scott Ananian、 Cameron McCormack、 Chris Dumez、 Chris Paris、 Chris Rebert、 Cyrille Tuzi、 Dan Burzo、 Daniel Clark、 Daniel Glazman、 Darien Maillet Valentine、 Darin Fisher、 David Baron、 David Bruant、 David Flanagan、 David Håsäther、 David Hyatt、 Deepak Sherveghar、 Dethe Elza、 Dimitri Glazkov、 Domenic Denicola、 Dominic Cooney、 Dominique Hazaël-Massieux、 Don Jordan、 Doug Schepers、 Edgar Chen、 Elisée Maurer、 Elliott Sprehn、 Emilio Cobos Álvarez、 Eric Bidelman、 Erik Arvidsson、 François Daoust、 François Remy、 Gary Kacmarcik、 Gavin Nicol、 Giorgio Liscio、 Glen Huang、 Glenn Adams、 Glenn Maynard、 Hajime Morrita、 Harald Alvestrand、 Hayato Ito、 Henri Sivonen、 Hongchan Choi、 Hunan Rostomyan、 Ian Hickson、 Igor Bukanov、 Jacob Rossi、 Jake Archibald、 Jake Verbaten、 James Graham、 James Greene、 James M Snell、 James Robinson、 Jeffrey Yasskin、 Jens Lindström、 Jeremy Davis、 Jesse McCarthy、 Jinho Bang、 João Eiras、 Joe Kesselman、 John Atkins、 John Dai、 Jonas Sicking、 Jonathan Kingston、 Jonathan Robie、 Joris van der Wel、 Joshua Bell、 J. S. Choi、 Jungkee Song、 Justin Summerlin、 Kagami Sascha Rosylight、 呂康豪 (Kang-Hao Lu)、 田村健人 (Kent TAMURA)、 Kevin J. Sung、 Kevin Sweeney、 Kirill Topolyan、 Koji Ishii、 Lachlan Hunt、 Lauren Wood、 Luca Casonato、 Luke Zielinski、 Magne Andersson、 Majid Valipour、 Malte Ubl、 Manish Goregaokar、 Manish Tripathi、 Marcos Caceres、 Mark Miller、 Martijn van der Ven、 Mason Freed、 Mats Palmgren、 Mounir Lamouri、 Michael Stramel、 Michael™ Smith、 Mike Champion、 Mike Taylor、 Mike West、 Nicolás Peña Moreno、 Nidhi Jaju、 Ojan Vafai、 Oliver Nightingale、 Olli Pettay、 Ondřej Žára、 Peter Sharpe、 Philip Jägenstedt、 Philippe Le Hégaret、 Piers Wombwell、 Pierre-Marie Dartus、 prosody—Gab Vereable Context(、 Rafael Weinstein、 Rakina Zata Amni、 Richard Bradshaw、 Rick Byers、 Rick Waldron、 Robbert Broersma、 Robin Berjon、 Roland Steiner、 Rune F. Halvorsen、 Russell Bicknell、 Ruud Steltenpool、 Ryosuke Niwa、 Sam Dutton、 Sam Sneddon、 Samuel Giles、 Sanket Joshi、 Scott Haseley、 Sebastian Mayr、 Seo Sanghyeon、 Sergey G. Grekhov、 Shiki Okasaka、 Shinya Kawanaka、 Simon Pieters、 Simon Wülker、 Stef Busking、 Steve Byrne、 Stig Halvorsen、 Tab Atkins、 Takashi Sakamoto、 Takayoshi Kochi、 Theresa O’Connor、 Theodore Dubois、 timeless、 Timo Tijhof、 Tobie Langel、 Tom Pixley、 Travis Leithead、 Trevor Rowbotham、 triple-underscore、 Tristan Fraipont、 Veli Şenol、 Vidur Apparao、 Warren He、 Xidorn Quan、 Yash Handa、 Yehuda Katz、 Yoav Weiss、 Yoichi Osato、 Yoshinori Sano、 Yu Han、 Yusuke Abe、 Zack Weinberg の皆様、素晴らしいご協力ありがとうございました!
この標準は Anne van Kesteren (Apple, annevk@annevk.nl) によって執筆され、 Aryeh Gregor (ayg@aryeh.name) と Ms2ger (ms2ger@gmail.com) の多大な貢献を受けています。
知的財産権
Copyright © WHATWG (Apple, Google, Mozilla, Microsoft)。この作品は クリエイティブ・コモンズ 表示 4.0 国際ライセンス の下でライセンスされています。ソースコードに組み込まれている部分については、BSD 3-Clause License の下でライセンスされます。
これはリビングスタンダードです。特許レビュー版に関心がある方は Living Standard Review Draft をご覧ください。