[11] [[DOM木]]上の[[親節点]]と[[子節点]]の[[親子]]関係を解消することを、
[[子節点]]の[DFN[[RUBYB[[[削除]]]@en[remove]]]]といいます。

[12] [[節点]]を[[削除]]しても、[[節点]]が消滅するわけではありません。
何らかの[[参照]]が存在する限りは旧[[親節点]]も旧[[子節点]]も[[ごみ収集]]されずに存続します。

[102] [DFN[[RUBYB[[[文書から削除]]]@en[remove from a document]]]]するとは、
[[文書]]の[[子孫]]ではない状態にすることをいいます。

* 仕様書

[REFS[
- [7] [CITE@en-US[DOM Standard]] ([TIME[2014-06-23 14:49:32 +09:00]] 版) <https://dom.spec.whatwg.org/#concept-node-remove>
- [1] [CITE@en-US[DOM Standard]] ([TIME[2014-08-19 13:36:28 +09:00]] 版) <https://dom.spec.whatwg.org/#concept-node-remove-ext>
- [101] [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/#remove-an-element-from-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-disconnected>
]REFS]

* 削除

[6] [[DOM Standard]] 仕様書上の操作[DFN[[RUBYB[[[削除]]]@en[remove]]]] [SRC[>>7]]
は次の箇所から呼び出されています。

[FIG(list short)[
- [[pre-insert]]
- [[replace]]
- [[replace all]]
- [[pre-remove]]
- [CODE(DOMi)@en[[[ChildNode]]]] [CODE(DOMm)@en[[[remove]]]]
- [CODE(DOMm)@en[[[adoptNode]]]]
- [[adopt]]
- [CODE(DOMm)@en[[[deleteContents]]]]
- [[範囲の挿入]]
]FIG]

[9] この操作では、[[DOM木]]上の[[親節点]]の[[子供]]のリストからの[[節点]]の[[削除]]に加えて、
関係する[[範囲]]の状態の変更や、 [CODE(DOMi)@en[[[MutationObserver]]]]
の実行の準備も行われます ([CODE(DOMi)@en[[[MutationObserver]]]] の実行そのものはこの時点ではなされません)。

[10] [[削除手順]] (>>2) も呼び出されます。

[20] [[blur]] が発生する可能性もありますが、どのタイミングかは不明です。

* 削除手順

[2] [[節点]]が他の[[節点]]の[[子供]]から[[削除]]されると、
その[[影根を含む子孫]]それぞれについて、
[[影根を含む木順]]に[DFN[[RUBYB[[[削除手順群]]]@en[removing steps]]]]
[SRC[>>1]] が呼び出されます。

;; [3] [[DOM Standard]] 上の[[アルゴリズム]]である [[replace]], [[replace all]],
[[remove]] から呼び出されます。

[4] この[[フック]]によって次の[[節点]]が何らかの処理を行います。

[FIG(list middle)[
- [8] 当該[[節点]]やその[[子孫]]が含まれる[[コレクション]]からの削除や、
[CODE(DOMi)@en[[[NodeIterator]]]] の[[イテレーターコレクション]]からの[[節点]]の[[削除]]に伴う[[参照節点]]の変更
[SRC[[[DOM Standard]]]]
- [CODE(HTMLe)@en[[[option]]]] [SRC[[[HTML Standard]]]]
- [[fullscreen element stack]] の[[要素]] [SRC[[[Fullscreen API 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]]]]
- [[カスタム要素反応]] ([CODE(DOM)@en[disconnectedCallback]]) [SRC[[[DOM Standard]]]]
- [[節点の文書からの削除]] [SRC[[[HTML Standard]]]]
- [[節点の切断]] [SRC[HTML Standard]]
- [[フォーム被関連付け要素]]
]FIG]

[5] 仕様上明確には規定されていませんが、次の動作もこの[[フック]]のタイミングで処理されると思われます。

[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]]]]
]FIG]

[25] [CODE(DOM)@en[disconnectedCallback]] の呼び出しは、[[仕様書]]上は[[削除手順群]]ではなく、
[[削除手順群]]の直後の別の処理として定義されています。

[37] 必要な場合、
[[子供達変更済手順群]]も実行されます。
これも[[削除手順群]]とは別の処理として定義されています。

* 文書から削除

[111] [[節点]]が[[文書中]]でなくなることを、
[DFN[[RUBYB[文書から節点が削除される]@en[remove a node from a document]]]]といいます
[SRC[>>101]]。

[107] 次の[[要素]]ごとの処理が定義されています。

[FIG(list middle)[
- [CODE(HTMLe)@en[[[style]]]] ※☆ [SRC[[[HTML Standard]]]]
- [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]]]]
- [[媒体要素]] [SRC[[[HTML Standard]]]]
- [[ID]] のある[[要素]] [SRC[[[HTML Standard]]]]
-- [CODE(HTMLa)@en[form][form=""]] [[属性]]
-- 
@@
- [CODE(HTMLe)@en[[[dialog]]]] [SRC[[[HTML Standard]]]]
- [CODE(HTMLe)@en[[[embed]]]] [SRC[[[HTML Standard]]]]
- [CODE(HTMLe)@en[[[applet]]]] ※ [SRC[[[HTML Standard]]]]
- [CODE(HTMLe)@en[meta]]
- [[Pointer Lock対象]] ☆
]FIG]

[108] 他に、 [CODE(HTMLe)@en[[[embed]]]] と [CODE(HTMLe)@en[[[applet]]]] と
[CODE(HTMLe)@en[[[frame]]]]
については仕様上 [[in a [CODE(DOMi)@en[Document]]]] を使って半ば宣言的に規定されていますが、
実質的に「[[要素の文書からの削除]]」の処理に該当します。

[30] [[フォーム被関連付け要素]]の削除の処理は、なぜか[[節点の切断]]と少し条件が違っていますが、
理由は不明です。

[109] 「※」のあるものは、[[構文解析器]]による挿入で特別扱いされるもので、
[[開いている要素のスタック]]からの除去で挿入時の処理が行われるかもしれませんが、
同時に削除が発生するならその処理は行われるべきではないと考えられます。
([[構文解析器]]による削除は [CODE(HTMLe)@en[[[frameset]]]] による置き換えでしか発生しないはずです。
[[AAA]] では同じ[[木]]の内部の移動しか起こらないはず...)

[29] 「☆」のあるものは、[DFN[[RUBYB[切断された]@en[becomes disconnected]]]]、
すなわち[[削除手順群]]で[[影を含む文書中]]でなくなった時 [SRC[>>28]] に処理するべきものです。

[34] 「★」のあるものは、[DFN[[RUBYB[閲覧文脈切断された]@en[browsing-context disconnected]]]]、
すなわち[[削除手順群]]で[[閲覧文脈接続]]状態でなくなった時 [SRC[>>28]] に処理するべきものです。

* 関連

[106] 逆の状況である「[[要素を文書に挿入]]」もあります。

* 歴史

[16] [[削除手順]]は、 >>15 までは[DFN[[RUBYB[[[節点の削除]]]@en[node is removed]]]]と呼ばれていました。

[18] [[HTML Standard]] では現在でも「nodes are removed」と呼ばれていますが、
[[DOM Standard]] の「removing steps」を参照するようになっています [SRC[>>17, >>19]]。

[103] [[要素]]の[[根要素]]が[[文書]]の[[根要素]]から他の[[要素]]に変更されることを、
[DFN[[RUBYB[文書から削除]@en[removed from a document]]]]されたといいます [SRC[>>101]]。

;; [104] この定義では[[文書]]の[[根要素]]が[[文書]]から削除された時が該当するのか不明瞭です
(「他の」[[要素]]には変更されていない)。他の定義との整合性を考えると、
該当すると考えるべきとも思えます。

[REFS[
- [15] [CITE@en[Fix the low-level remove/insert hooks and rewrite NodeIterator in terms ... · 4937f1a · whatwg/dom]] ([TIME[2014-08-21 15:00:44 +09:00]] 版) <https://github.com/whatwg/dom/commit/4937f1a5e39c0914ad2f0a3a35558cf1678e8b89>
- [14] [CITE@en[Bug 24653 – Planning on changing mutation hooks]] ([TIME[2014-08-21 15:00:12 +09:00]] 版) <https://www.w3.org/Bugs/Public/show_bug.cgi?id=24653#c3>
- [13] [CITE@en[Fix nits and properly integrate with DOM https://www.w3.org/Bugs/Public/... · d1b6a38 · whatwg/fullscreen]] ([TIME[2014-08-21 14:59:58 +09:00]] 版) <https://github.com/whatwg/fullscreen/commit/d1b6a381a37354b65f63d81692dd7a15ba512732>
- [17] [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>
- [19] [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>
]REFS]

[21] [CITE@en[Fix #34: invoke insertion/removing steps for descendants · whatwg/dom@5ec535e]]
([TIME[2016-03-05 18:28:13 +09:00]] 版)
<https://github.com/whatwg/dom/commit/5ec535e56111d600b8afe89d0b4f709ab844461e>

[23] [CITE@en[Shadow: run insertion and removing steps also for shadow trees · whatwg/dom@2d5aaed]]
([TIME[2016-03-16 15:12:38 +09:00]] 版)
<https://github.com/whatwg/dom/commit/2d5aaed1f525561a2c92b4e23ae2b7e6ff8244ad>

[22] [CITE@en[Only pass oldParent to removing steps for the node actually removed · whatwg/dom@baf4e6e]]
([TIME[2016-03-16 15:16:05 +09:00]] 版)
<https://github.com/whatwg/dom/commit/baf4e6e83e473330e5b073df77c091815489bb81>

[112] [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>

[24] [CITE@en[Add support for custom elements · whatwg/dom@7f63535]]
([TIME[2016-04-13 22:19:26 +09:00]] 版)
<https://github.com/whatwg/dom/commit/7f63535da39a1cbf7f8f68563abc6f05f760990a>

[26] [CITE@en[Generalize inserted/removed into/from a document algorithms · whatwg/html@8da5a18]]
([TIME[2016-04-25 18:10:13 +09:00]] 版)
<https://github.com/whatwg/html/commit/8da5a18b447290ffcdd6c23e268a6e75f906c684>

[27] [CITE@en[Execute <script> in shadow trees · whatwg/html@caf203f]]
([TIME[2016-04-27 17:41:18 +09:00]] 版)
<https://github.com/whatwg/html/commit/caf203fd4d9a5047d1ff2edad2290d53e21368ba>

[31] [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>

[32] [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>

[33] [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>


[35] [CITE@en[Editorial: update variable name in removing steps]]
([[foolip]]著, [TIME[2017-05-10 19:24:09 +09:00]])
<https://github.com/whatwg/fullscreen/commit/c8164afaa1a04b77c9b45f013144c603f3e201bd>

[36] [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>

[38] [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>

[39] [CITE@en[Shadow: Specify when `slotchange` fires · Issue #447 · whatwg/dom]]
([TIME[2017-07-08 16:14:02 +09:00]])
<https://github.com/whatwg/dom/issues/447>

[40] [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>

[41] [CITE@en[Meta: add id=removing-steps for linkability of the removing steps]]
([[foolip]]著, [TIME[2018-05-18 21:35:25 +09:00]])
<https://github.com/whatwg/fullscreen/commit/e1fb3a82b6d794bc9fb165f7e2a95e1a0b51176b>

[42] [CITE@en[Meta: add id=removing-steps for linkability of the removing steps by foolip · Pull Request #127 · whatwg/fullscreen]]
([TIME[2018-05-19 17:47:57 +09:00]])
<https://github.com/whatwg/fullscreen/pull/127>

[43] [CITE@en[Editorial: a removed node's root is itself]]
([[annevk]]著, [TIME[2018-09-12 00:34:40 +09:00]])
<https://github.com/whatwg/dom/commit/42d2485c4f84fb210452ca53e07503229716b147>

[44] [CITE@en[Assign slotables for a tree should be invoked on node and not node's root in node remove · Issue #691 · whatwg/dom]]
([TIME[2018-12-14 20:43:44 +09:00]])
<https://github.com/whatwg/dom/issues/691>

[45] [CITE@en[Editorial: a removed node's root is itself by annevk · Pull Request #692 · whatwg/dom]]
([TIME[2018-12-14 20:43:58 +09:00]])
<https://github.com/whatwg/dom/pull/692>

[46] [CITE@en[Replace child text content change steps]]
([[annevk]], [TIME[2019-12-06 20:21:55 +09:00]], [TIME[2021-08-20T08:41:02.000Z]])
<https://github.com/whatwg/dom/commit/ce4c6ba5b6e8e26e9c0e6f157243df9942d8b52a>

[47] [CITE@en[Editorial: remove parent argument to remove]]
([[annevk]], [TIME[2019-12-06 21:54:06 +09:00]], [TIME[2021-08-20T08:52:37.000Z]])
<https://github.com/whatwg/dom/commit/37d847525782a2a6692aba5fb9ad0e9c419a13ff>

[48] [CITE@en[Editorial: remove parent argument to remove · Issue #801 · whatwg/dom]]
([TIME[2021-08-20T08:53:35.000Z]])
<https://github.com/whatwg/dom/issues/801>

[49] [CITE@en[Editorial: remove parent argument to remove by annevk · Pull Request #804 · whatwg/dom]]
([TIME[2021-08-20T08:54:04.000Z]])
<https://github.com/whatwg/dom/pull/804>

[50] [CITE@en[Editorial: remove parent argument to remove · Issue #801 · whatwg/dom]]
([TIME[2022-01-27T11:54:45.000Z]])
<https://github.com/whatwg/dom/issues/801>