[2] [DFN[[RUBYB[[[要素を文書に挿入]]]@en[insert an element into a document]]]]するとは、
[[要素]]を[[文書]]の[[子孫]]とすることをいいます。

* 仕様書

[REFS[
- [101] '''[CITE@en-US[DOM Standard]] ([TIME[2014-08-19 13:36:28 +09:00]] 版) <https://dom.spec.whatwg.org/#concept-node-insert-ext>'''
- [1] '''[CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2014-07-20 22:41:10 +09:00]] 版) <https://www.whatwg.org/specs/web-apps/current-work/#insert-an-element-into-a-document>'''
- [28] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-04-27 02:59:24 +09:00]] 版) <https://html.spec.whatwg.org/#node-is-connected>
- [14] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-04-09 09:15:24 +09:00]] 版) <https://html.spec.whatwg.org/#parser-inserted>
- [18] [CITE@en-US[Fetch Standard]] ([TIME[2016-04-15 18:13:01 +09:00]] 版) <https://fetch.spec.whatwg.org/#concept-request-parser-metadata>
- [24] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-04-16 15:05:57 +09:00]] 版) <https://html.spec.whatwg.org/#concept-module-script-parser>
- [38] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2016-09-16 22:41:59 +09:00]]) <https://html.spec.whatwg.org/#creating-and-inserting-nodes>
]REFS]

* 挿入

@@

* 構文解析器による挿入

[108] [[構文解析器]]によって[[挿入]]される[[節点]]は、すべて[[構文解析器]]によって新たに作られたものです。
[[挿入]]の時点ではまだ一度も[[スクリプト]]からアクセスされたことがないものですし、
[[子孫]]も存在しません。[[属性]]は、[[挿入]]と同時に設定されることがありますが、
それ以外の方法で追加されたものは存在しません。

;; [111] ただし [[AAA]] で既存の[[節点]]を[[親]]から別の[[要素]]に移動することはあります。
移動対象となる[[節点]]は[[スクリプト]]によって編集されているかもしれませんし、
元々[[スクリプト]]が作ったものである可能性もあります。

[109] [[里親付け]]が発生する場合と、[[根要素]]外を[[構文解析器]]中の場合を除き、
すべての[[節点]]の[[挿入]]・[[append]] 先は[[要素]]です。

[110] [[里親付け]]の場合、挿入先となるはずだった[[節点]]が [CODE(HTMLe)@en[[[table]]]]
[[要素]]などだった時、その[[兄]]として挿入されるので、その[[親]]が
[CODE(DOMi)@en[[[Document]]]] や [CODE(DOMi)@en[[[DocumentFragment]]]] のこともあります。

;; [CODE(DOMi)@en[[[Document]]]] の場合、2つ目の[[根要素]]または
[CODE(DOMi)@en[[[Document]]]] 直下の[[テキスト]]となるので、
[[挿入]]は失敗して捨てられます。 ([[注釈]]は[[里親付け]]の対象となりません。)

* 挿入手順

[102] [[節点]]が別の[[節点]]の[[子供]]として[[挿入]]されると、
[DFN[[RUBYB[[[挿入手順]]]@en[insertion steps]]]] [SRC[>>101]] が呼び出されます。
[[挿入]]された[[節点]]自体のみならず、その[[影根を含む子孫]]についても[[影根を含む木順]]に呼び出されます。

;; [103] [[DOM Standard]] 上の[[アルゴリズム]]である [[pre-insert]]、[[replace]]、
[[replace all]] によって呼び出されます。

[104] この[[フック]]によって次の[[節点]]が何らかの処理を行います。

[FIG(list middle)[
- [CODE(HTMLe)@en[[[option]]]] [SRC[[[HTML Standard]]]]
- ([CODE(HTMLe)@en[[[script]]]] に対して) [[子供]] [SRC[[[HTML Standard]]]]
- [CODE(HTMLe)@en[[[source]]]] ([[媒体要素]]) ※ [SRC[[[HTML Standard]]]]
- [[媒体要素]] ※ [SRC[[[HTML Standard]]]]
- [CODE(HTMLe)@en[[[img]]]] ([CODE(HTMLe)@en[[[picture]]]]) [SRC[[[HTML Standard]]]]
- [CODE(HTMLe)@en[[[source]]]] ([CODE(HTMLe)@en[[[picture]]]]) [SRC[[[HTML Standard]]]]
- [[要素の文書への挿入]] ※ [SRC[[[HTML Standard]]]]
- [[節点の接続]] ★※ [SRC[[[HTML Standard]]]]
- [[フォーム被関連付け要素]] ※
]FIG]

[105] 仕様上明確には規定されていませんが、次の動作もこの[[フック]]のタイミングで処理されると思われます。

[FIG(list middle)[
- [[画像写像]] [SRC[[[HTML Standard]]]]
- [CODE(HTMLe)@en[[[style]]]] の[[子孫]] ※ [SRC[[[HTML Standard]]]]
- [CODE(HTMLe)@en[[[track]]]] ※ [SRC[[[HTML Standard]]]]
- [CODE(XML)@en[[[<?xml-stylesheet?>]]]] [SRC[[[CSSOM]]]]
- [[文書基底URL]]・[[凍結基底URL]]の更新 [SRC[[[HTML Standard]]]]
]FIG]

;; [106] 「※」は[[構文解析器]]による挿入かどうかで動作が異なることがあります。

;; [119] 多くは[[要素]]の[[挿入]]に関する処理ですが、
それ以外の種類の[[節点]]の場合もあります。

[107] なお、[[pre-insert]], [[replace]], [[replace all]] 
の各操作は[[挿入]]に先立って [[adopt]]
を行いますので、その中で[[節点]]の種類によっては [[adopting steps]] も実行されます。

@@ [124] [[custom element]] の[[コールバック]]

[49] 
[[挿入手順群]]とは別に、
[[子供達変更済手順群]]が実行される場合もあります。


* 文書に挿入

[13] [[節点]]が[[挿入手順]]により[[文書中]]となった時、
[DFN[[RUBYB[[[文書に挿入]]]@en[inserted into a document]]]]されたといいます [SRC[>>1]]。

[7] [[文書への挿入]]のタイミングで行われる[[要素]]ごとの処理も存在しています。

[FIG(list middle)[
- [CODE(HTMLe)@en[meta]]
- [CODE(HTMLe)@en[[[style]]]] ☆※ [SRC[[[HTML Standard]]]]
- [CODE(HTMLe)@en[link]]
- [CODE(HTMLe)@en[[[img]]]] ☆
- [CODE(HTMLe)@en[[[iframe]]]] [SRC[[[HTML Standard]]]]
- [CODE(HTMLe)@en[[[frame]]]] [SRC[[[HTML Standard]]]]
- [CODE(HTMLe)@en[[[object]]]] ※ [SRC[[[HTML Standard]]]]
- [CODE(HTMLe)@en[[[param]]]]
- [[ID]] のある[[要素]] [SRC[[[HTML Standard]]]]
- [CODE(HTMLa)@en[[[autofocus]]]] のある[[要素]] [SRC[[[HTML Standard]]]]
- [CODE(HTMLe)@en[script]] ☆※ [SRC[[[HTML Standard]]]]
- [CODE(HTMLe)@en[script]] への[[挿入]] ☆※ [SRC[[[HTML Standard]]]]
- [CODE(HTMLe)@en[[[embed]]]] [SRC[[[HTML Standard]]]]
- [CODE(HTMLe)@en[[[applet]]]] ※ [SRC[[[HTML Standard]]]]
- [[カスタム要素]] (>>31) ☆ [SRC[[[DOM Standard]]]]
- [CODE[NoncedElement]] ★
]FIG]

;; [8] [CODE(HTMLe)@en[[[embed]]]] と [CODE(HTMLe)@en[[[applet]]]]
と [CODE(HTMLe)@en[[[frame]]]]
については仕様上 [[in a [CODE(DOMi)@en[Document]]]] を使って半ば宣言的に規定されていますが、
実質的に「[[要素の文書からの挿入]]」の処理に該当します。

[9] 「※」のあるものは、[[構文解析器]]による挿入か否かで動作が異なります。

;; [10] [[レンダリング]]の更新は、また別のタイミングで行われます。
[CODE(HTMLe)@en[[[title]]]] [[要素]]など[[画布]]外の[[UI]]に関する更新は特に規定がありませんが、
[[レンダリング]]と同タイミングが好ましいでしょうか。 ([[相互運用性]]に直接影響しないためか規定がありません。)

[26] 「☆」のあるものは、[DFN[[RUBYB[[[接続された]]]@en[becomes connected]]]]、
すなわち[[挿入手順群]]で[[影を含む文書中]]となったときに実行されます [SRC[>>28]]。
([[節点の挿入]]に加えて、[[影木]]への[[挿入]]でも実行されます。)

[36] 「★」のあるものは、[DFN[[RUBYB[閲覧文脈接続された]@en[becomes browsing-context connected]]]]、
すなわち[[挿入手順群]]で[[閲覧文脈接続]]状態となったときに実行されます
[SRC[>>28]]。

[31] [[カスタム要素]]の処理は、[[仕様書]]上は[[挿入手順群]]ではなく、
[[挿入手順群]]の直後に実行する別の処理として定義されています。

[11] [[Webブラウザー]]によっては、[[文書要素]]の[[文書への挿入]]のタイミングで[[内容スクリプト]]が実行されるかもしれません。

* 構文解析による挿入

[39] [[構文解析器]]による[[要素]][VAR[要素]]の[VAR[位置]]への[[挿入]]は、
次のようにしなければ[MUST[なりません]] [SRC[>>38]]。
[FIG(steps)[
= [43] [VAR[キュー]]を、新しい[[要素キュー]]に設定します。
= [40] [[関連する類似起源閲覧文脈群の単位]]の[F[カスタム要素反応群スタック]]に、[VAR[要素キュー]]を [[push]] します。
= [41] [VAR[要素]]を[VAR[位置]]に[[挿入]]します。
= [42] [[関連する類似起源閲覧文脈群の単位]]の[F[カスタム要素反応群スタック]]を [[pop]] します。
= [44] [VAR[要素キュー]]について[[カスタム要素反応群の呼び出し]]をします。
]FIG]

;; [45] つまり、[[要素]]の[[挿入]]の直後に[[カスタム要素反応群]]の処理が行われます。

;; [46] これは[[開いている要素のスタック]]への [[push]] の前に行われます。

[15] [CODE(HTMLe)@en[script]] [[要素]]は、
[F[[DFN[[RUBYB[[[「構文解析器挿入」]]]@en["parser inserted"]]]]フラグ]]を持ちます [SRC[>>14]]。
[[構文解析器]]が[[挿入][要素の挿入]]した [CODE(HTMLe)@en[[[script]]]] [[要素]]に設定されます。
初期状態では未設定です [SRC[>>14]]。

;; [20] これは [CODE(HTMLe)@en[script]] [[要素]]の動作に深く関与します。
[CODE(HTMLe)@en[script]] 参照。

[53] [[フォーム被関連付け要素]]は、
[DFN[[F[[RUBYB[[[構文解析器挿入フラグ]]]@en[parser inserted flag]]]]]]を持ちます
[SRC[[[HTML Standard]]]]。[[構文解析器]]が[[挿入][要素の挿入]]した[[フォーム被関連付け要素]]に設定されます。
初期状態では未設定です。

;; [30] [[字句の要素の作成]]と[[フォーム所有者の再設定]]も参照。

[23] [[スクリプトfetchオプション群]]は[DFN[[F[[RUBYB[[[構文解析器メタデータ]]]@en[parser metadata]]]]]]を持ちます
[WEAK[(旧: [[モジュールスクリプト]]は[DFN[[F[[RUBYB[[[構文解析器状態]]]@en[parser state]]]]]]を持ちます)]]
[SRC[>>24]]。
[[スクリプトのfetch]]の際に[[要求]]の[F[構文解析器メタデータ]]として使う値を保持するものです。
[F[「構文解析挿入」フラグ]]の設定された [CODE(HTMLe)@en[script]]
[[要素]]から[[作成][スクリプトの作成]]された[[スクリプト]]では、 
[CODE[parser-inserted]] に設定されます。それ以外の[[スクリプト]]では、
[CODE[not-parser-inserted]] に設定されます。

[17] [[要求]]は、[DFN[[F[[RUBYB[[[構文解析器メタデータ]]]@en[parser metadata]]]]]]を持ちます。
値は[[空文字列]]、 [DFN[[CODE[parser-inserted]]]]、
[DFN[[CODE[not-parser-inserted]]]] のいずれかです。
初期状態では[[空文字列]]です。 [SRC[>>18]]

;; [21] これは [[CSP]] の指定 [CODE[unsafe-dynamic]] の挙動に影響します。

[32] [[カスタム要素]]が[[挿入]]される場合、[[カスタム要素反応のスタック]]に[[節点の接続]]の[[コールバック]]実行が追加されます。
これがいつ実行されるのかは定かではありません。

* 関連

[6] 逆に[[要素が文書から削除]]される場合に発生する処理もあり、
挿入時と共通しているものも多くあります。

* 歴史

[114] [[挿入手順]]は、 >>112 までは[DFN[[RUBYB[[[節点の挿入]]]@en[node is inserted]]]]と呼ばれていました。

[116] [[HTML Standard]] は現在でも「nodes are inserted」という用語を使っていますが、
[[DOM Standard]] の「insertion steps」を参照するようになっています [SRC[>>115, >>117]]。

[3] [[要素]]の[[根要素]]が変更され、[[文書]]の[[根要素]]となったとき、
[DFN[[RUBYB[[[文書に挿入]]]@en[inserted into a document]]]]されたといいます [SRC[>>1]]。

;; [4] この定義によれば、[[根要素]]が[[文書]]に挿入されて[[文書]]の[[根要素]]となった時には、
[[根要素]]自身は変化していませんから、[[文書に挿入]]はされていないこととなります。
(意図通りなのかは不明です。) 他の定義との整合性を考えると、
このケースも該当すると考えるべきかもしれません。

[REFS[
- [112] [CITE@en[Fix the low-level remove/insert hooks and rewrite NodeIterator in terms ... · 4937f1a · whatwg/dom]] ([TIME[2014-08-21 15:10:21 +09:00]] 版) <https://github.com/whatwg/dom/commit/4937f1a5e39c0914ad2f0a3a35558cf1678e8b89>
- [113] [CITE@en[Bug 24653 – Planning on changing mutation hooks]] ([TIME[2014-08-21 15:10:10 +09:00]] 版) <https://www.w3.org/Bugs/Public/show_bug.cgi?id=24653#c3>
- [115] [CITE@en[Web Applications 1.0 r8769 Integrate with DOM for 'removing steps' and 'insertion steps'.]] ([TIME[2014-09-13 03:23:00 +09:00]] 版) <http://html5.org/r/8769>
- [117] [CITE@en[Sync with r8769 (Integrate with DOM for 'removing steps' and 'insertion ... · 4a62050 · ResponsiveImagesCG/picture-element]] ([TIME[2014-09-15 08:59:45 +09:00]] 版) <https://github.com/ResponsiveImagesCG/picture-element/commit/4a620502e75e2839842fa737a3bc25894836e895>
- [118] [CITE@en[Need to grab children of a DocumentFragment before an insert. Fixes h… · whatwg/dom@1b9e2f9]]
([TIME[2015-05-11 13:27:23 +09:00]] 版)
<https://github.com/whatwg/dom/commit/1b9e2f9765884460410d1396dbba99951eafe838>
- [120] [CITE@en[Fix #34: invoke insertion/removing steps for descendants · whatwg/dom@5ec535e]]
([TIME[2016-03-05 18:26:41 +09:00]] 版)
<https://github.com/whatwg/dom/commit/5ec535e56111d600b8afe89d0b4f709ab844461e>
- [121] [CITE@en[Shadow: run insertion and removing steps also for shadow trees · whatwg/dom@2d5aaed]]
([TIME[2016-03-16 15:14:38 +09:00]] 版)
<https://github.com/whatwg/dom/commit/2d5aaed1f525561a2c92b4e23ae2b7e6ff8244ad>
- [122] [CITE@en[Only pass oldParent to removing steps for the node actually removed · whatwg/dom@baf4e6e]]
([TIME[2016-03-16 15:16:55 +09:00]] 版)
<https://github.com/whatwg/dom/commit/baf4e6e83e473330e5b073df77c091815489bb81>
- [123] [CITE@en[Add support for custom elements · whatwg/dom@7f63535]]
([TIME[2016-04-13 22:17:41 +09:00]] 版)
<https://github.com/whatwg/dom/commit/7f63535da39a1cbf7f8f68563abc6f05f760990a>
]REFS]

[12] [CITE@en[Editorial: synchronize with the DOM Standard · whatwg/html@21c6ec7]] ([TIME[2016-03-20 17:40:31 +09:00]] 版) <https://github.com/whatwg/html/commit/21c6ec77594eb89b836d4872222f5916910967fd>

[16] [CITE@en[Add 'parser metadata' to requests · whatwg/fetch@bc399d5]] ([TIME[2016-04-15 23:11:56 +09:00]] 版) <https://github.com/whatwg/fetch/commit/bc399d58e4dacc625857bd37671e6c1a7844e3ec>

[19] [CITE@en[Use the 'parser metadata' concept from Fetch · w3c/webappsec-csp@4793499]]
([TIME[2016-04-15 23:16:40 +09:00]] 版)
<https://github.com/w3c/webappsec-csp/commit/479349944cc90e1584dcade60e80d17ea1e6b56b>

[22] [CITE@en[Pass parser metadata to Fetch · whatwg/html@e6500b9]]
([TIME[2016-04-16 22:23:08 +09:00]] 版)
<https://github.com/whatwg/html/commit/e6500b90244376c023e7b78642dbc7b86829233f>

[25] [CITE@en[Generalize inserted/removed into/from a document algorithms · whatwg/html@8da5a18]]
([TIME[2016-04-25 17:59:46 +09:00]] 版)
<https://github.com/whatwg/html/commit/8da5a18b447290ffcdd6c23e268a6e75f906c684>

[5] [CITE@en[Add custom elements to HTML · whatwg/html@6e7eaa4]]
([TIME[2016-04-26 18:24:46 +09:00]] 版)
<https://github.com/whatwg/html/commit/6e7eaa4bd2912965fd83766f99f984f249531f3a>

[27] [CITE@en[Execute <script> in shadow trees · whatwg/html@caf203f]]
([TIME[2016-04-27 17:38:49 +09:00]] 版)
<https://github.com/whatwg/html/commit/caf203fd4d9a5047d1ff2edad2290d53e21368ba>

[29] [CITE@en[Make forms work in shadow trees]]
( ([[annevk]]著, [TIME[2016-05-12 00:45:25 +09:00]]))
<https://github.com/whatwg/html/commit/927fda0f305452a9c54a25d3ebf9a6ed5ae29fd3>

[33] [CITE@en[Integrate with the Referrer Policy spec, part 1 of n]]
( ([[domenic]]著, [TIME[2016-05-05 23:01:42 +09:00]]))
<https://github.com/whatwg/html/commit/6a7318072f340ad45229df171245d70d8621c2fe>

[34] [CITE@en[Align with vocabulary changes in the DOM Standard]]
([[annevk]]著, [TIME[2016-07-08 02:32:18 +09:00]])
<https://github.com/whatwg/html/commit/5b9c5d5a39c38b08e5a5c9334e14804f063235b2>

[35] [CITE@en[Make <link rel="stylesheet"> work inside shadow trees]]
([[domenic]]著, [TIME[2016-07-20 16:29:57 +09:00]])
<https://github.com/whatwg/html/commit/43c57866c2bbc20dc0deb15a721a28cbaad2140c>


[37] [CITE@en[Process custom element connectedCallback immediately during parsing]]
([[domenic]]著, [TIME[2016-08-24 15:32:24 +09:00]])
<https://github.com/whatwg/html/commit/ca818ee1c8458c3b862acd00d11779294cb89eea>

[47] [CITE@en[Be more precise about removal and insertion]]
([[annevk]]著, [TIME[2017-04-07 17:44:16 +09:00]])
<https://github.com/whatwg/dom/commit/26faf9a74154b5d1dd3d1f8dd699404716649ae4>

[48] [CITE@en[Add child text content and its change steps]]
([[domenic]]著, [TIME[2017-06-28 01:07:56 +09:00]])
<https://github.com/whatwg/dom/commit/93db3408c360a958c2f1c00fbb99bf6c5d6fa5b2>

[50] [CITE@en[Make slots do nothing outside shadow trees]]
([[hayatoito]]著, [TIME[2017-07-04 18:01:33 +09:00]])
<https://github.com/whatwg/dom/commit/8f8c1c30c39be38480336e7fc39c1cc7b40b6a83>

[51] [CITE@en[Shadow: Specify when `slotchange` fires · Issue #447 · whatwg/dom]]
([TIME[2017-07-08 16:13:59 +09:00]])
<https://github.com/whatwg/dom/issues/447>

[52] [CITE@en[Track HTML parser form-associated elements with a flag]]
([[annevk]]著, [TIME[2017-08-19 16:02:48 +09:00]])
<https://github.com/whatwg/html/commit/384c30c56d6dfd26dfbd3a5024ae10e7f7134483>

[54] [CITE@en[Make integrity="" work on module scripts]]
([[domenic]]著, [TIME[2017-09-14 18:00:24 +09:00]])
<https://github.com/whatwg/html/commit/9275d955dcd604e959cfcc672e0c234b1b8c00db>

[55] [CITE@en[Consider hiding `nonce` content attributes. · Issue #2369 · whatwg/html]]
([TIME[2018-02-17 23:20:30 +09:00]])
<https://github.com/whatwg/html/issues/2369>

[56] [CITE@en[Replace child text content change steps]]
([[annevk]], [TIME[2019-12-06 20:21:55 +09:00]], [TIME[2021-08-20T08:40:59.000Z]])
<https://github.com/whatwg/dom/commit/ce4c6ba5b6e8e26e9c0e6f157243df9942d8b52a>


- [57] [CITE@en[Insertion of empty DocumentFragment is a no-op]], [[annevk]], [TIME[2019-12-10 18:26:53 +09:00]], [TIME[2023-12-03T03:18:08.000Z]] <https://github.com/whatwg/dom/commit/c8462cb8cdf74283dae6ca85d72f761499c5c0be>
- [58] [CITE@en[Insertion of empty DocumentFragment is a no-op by annevk · Pull Request #806 · whatwg/dom · GitHub]], [TIME[2023-12-03T03:18:27.000Z]] <https://github.com/whatwg/dom/pull/806>


[59] 
>>57 >>58 [CODE[DocumentFragment]] を [[insert]] したときの[[副作用]]に関して正しい挙動に修正。

