開いている要素のスタック

開いている要素のスタック (Web)

[3] 開いている要素のスタック (stack of open elements) は、 HTML構文解析器XML構文解析器において、(明示的または暗示的な) 開始タグが現れ、まだ終了タグが現れていない要素が積まれるスタックです。

仕様書

操作と状態

[4] このスタック下方向 (downward) へと進みます。 最初に追加された要素 (根要素) は最上 (topmost) 、 最も直近に追加された要素最下方 (bottommost) と呼ばれています。

[5] このスタックには次のような変更操作が行われます。

[22] このスタックは、末尾、先頭など任意の位置にアクセスがあります。

[6] 初期状態ではこのスタックは空です。 HTML構文解析器の場合、一旦要素が追加されると、 最後まで空にはなりません。 XML構文解析器の場合、文書要素終了タグにより空になります。 どちらの構文解析器でも、最終的に stops parsing により、 すべての要素スタックから除去されます。 (abort a parser が行われる場合は、スタックから除去されないまま構文解析器が破棄されることになります。)

現在節点

[16] 開いている要素のスタックの最下方の要素 (最も直近に追加された要素) のことを現在節点 (current node) といいます >>2

[17] 調整済み現在節点 (adjusted current node) とは、 HTML素片構文解析アルゴリズムによって起動された構文解析器開いている要素のスタック要素が1つだけの時は文脈要素、 それ以外の時は現在節点と同じものです >>2

[18] 調整済み現在節点は、構文解析器によって外来要素に関する処理がなされる際に参照されます。 HTML素片構文解析アルゴリズム (innerHTML) でも開いている要素のスタックの最上方の要素HTMLhtml 要素ですが、 調整済み現在節点としてはそのかわりに文脈要素が使われるので、 文脈要素外来要素 (SVGMathML) ならそのように処理されることとなります。

[19] 現在節点は、構文解析器のあらゆる部分で参照されています。

[20] 調整済み現在節点は、構文解析器の次の処理で参照されています。

[21] reset the insertion mode appropriately でも最上方の html 要素のかわりに文脈要素が参照されます。 (ただし現在節点とは限りません。)

要素の処理

[10] 開いている要素のスタックから要素が除去された時に、 副作用として要素固有の処理が実行されることがあります。

[9] そのような要素固有の処理は、開いている要素のスタック上にあるかどうかによって分岐することがあります。

[26] 一般にこうした操作は構文解析器外では要素挿入された時点で実行されるものですが、 構文解析器内では終了タグ時点まで実行が遅延されることになります。

[14] HTMLSVGscript 要素終了タグ時点で特別な動作がありますが、EOF や祖先の終了タグによって開いている要素のスタックから除去される場合には動作しないので、 >>9 とは異なります。
[15] link 要素の処理など、構文解析器によるかどうかに関わらず、 要素が挿入された時点で発生するものも多々あります。

歴史

[28] 開いている要素という語は SGML でも使われていました。

[27] Process custom element connectedCallback immediately during parsing (domenic著, ) <https://github.com/whatwg/html/commit/ca818ee1c8458c3b862acd00d11779294cb89eea>

[29] Remove <applet> (zcorpan著, ) <https://github.com/whatwg/html/commit/b9b9d60f9451c05f8e8d542e4094f987ae1a5fb8>

[30] <style> should use child text content changed steps · Issue #2996 · whatwg/html () <https://github.com/whatwg/html/issues/2996>