removeChild とは何か
removeChild は「親ノードから指定した子ノードを取り外す」メソッドです。形は parent.removeChild(child)。画面から消えるだけでなく、DOMの親子関係が切れるため、その要素は“孤立ノード”になります。ここが重要です:削除対象は「その親の“直下の子”」である必要があります。親子関係が違うとエラーになります。
基本の使い方(親と対象を正しくそろえる)
親から特定の子を取り外す
<ul id="list">
<li id="a">A</li>
<li id="b">B</li>
<li id="c">C</li>
</ul>
<script>
const list = document.getElementById("list");
const b = document.getElementById("b");
list.removeChild(b); // B が画面から消える(A, C が残る)
</script>
HTMLここが重要です:removeChild は「親に対して呼ぶ」。対象の子(b)は“list の直下の子”でなければなりません。
戻り値(取り外したノード)を再利用できる
const removed = list.removeChild(b);
document.body.appendChild(removed); // 別の場所へ再配置(“移動”になる)
JavaScriptここが重要です:removeChild は“返り値として削除したノード”を返します。ゴミ箱行きではなく、必要なら再配置できます。
親子関係の前提と安全なガード
親が違うと例外(HierarchyRequestError)
const other = document.getElementById("other");
other.removeChild(b); // b は list の子 → ここで例外
JavaScriptここが重要です:削除前に「親が一致しているか」を確認すると安全です。
if (b.parentNode === list) list.removeChild(b);
JavaScript子が見つからない場合(null ガード)
const x = document.getElementById("x"); // ないかも
if (x && x.parentNode) x.parentNode.removeChild(x);
JavaScriptここが重要です:DOM生成タイミングや条件分岐で“存在しない可能性”に備えるクセを付けると、実装が堅牢になります。
element.remove() との違い(親を意識するか、しないか)
自分自身から消える、という書き方
const b = document.getElementById("b");
b.remove(); // 親を意識せずに削除(モダンブラウザ)
JavaScriptここが重要です:remove() は“自分で自分を外す”。removeChild は“親から子を外す”。親子関係が明確なら removeChild、単に消したいだけなら remove の方が簡潔です。
まとめて消す・入れ替える(replaceChildren / innerHTML)
子ノードを一気にクリアする
const list = document.getElementById("list");
list.replaceChildren(); // 全ての子を削除(空に)
JavaScriptここが重要です:多数の子を個別に removeChild するより、replaceChildren や textContent = “” のほうが高速で読みやすいことが多いです。
list.textContent = ""; // テキスト・要素を全部消す(イベントリスナーも失われる)
JavaScriptクリアしてから新しい内容を差し込む
const fresh = document.createElement("li");
fresh.textContent = "新しい1行";
list.replaceChildren(fresh);
JavaScriptここが重要です:“全消し→差し込み”は replaceChildren が一撃で行えるため、差し替えパターンに向いています。
イベント、リソース、後片付け(メモリリークを防ぐ)
イベントリスナーは自動で外れるが、参照が残るとリークに
const btn = document.getElementById("btn");
function onClick() { /* ... */ }
btn.addEventListener("click", onClick);
// 親から削除
btn.remove();
// ボタン自体は消えるが、外部に btn を保持しているとメモリが残ることも → 参照も破棄する
JavaScriptここが重要です:DOMから外せばイベントは発火しなくなりますが、グローバルやクロージャで参照を持ち続けると回収されないことがあります。不要になった参照は null にする、タイマーや観測(MutationObserver、IntersectionObserver)を停止するなど、“後片付け”を徹底します。
画像・Object URL の解放
const url = URL.createObjectURL(file);
img.src = url;
// 削除するとき
img.remove();
URL.revokeObjectURL(url); // リソースを解放
JavaScriptここが重要です:一時URLやメディアストリームは“明示的なクリーンアップ”が必要です。
テキストノードと要素ノード(何を消すかを正確に選ぶ)
空白や改行も“ノード”
<ul id="list">
<!-- 改行や空白が firstChild として存在することがある -->
<li>A</li>
</ul>
<script>
const list = document.getElementById("list");
list.removeChild(list.firstElementChild); // “要素”としての先頭を確実に削除
</script>
HTMLここが重要です:firstChild はテキストノードの可能性、firstElementChild は要素のみ。何を消すかを明確に選ぶと、意図した動作になります。
実践例(行削除、閉じるボタン、Undo 用に保管)
テーブル行を削除する
function removeRow(btn) {
const row = btn.closest("tr");
if (row && row.parentNode) row.parentNode.removeChild(row);
}
JavaScriptここが重要です:closest で“削除対象の単位”に辿り、親から removeChild。構造の変更に強い書き方です。
モーダルの閉じる
const modal = document.getElementById("modal");
const backdrop = document.getElementById("backdrop");
function closeModal() {
modal.remove(); // remove でもOK
backdrop.remove(); // まとめて消す
}
JavaScriptここが重要です:関連要素を“セットで”消すのが安全。表示・操作・読み上げ(必要なら aria)の整合性を保ちます。
Undo のために一時保管して再挿入
const item = document.getElementById("item");
const parent = item.parentNode;
const next = item.nextSibling; // 元の位置の目印
const stash = parent.removeChild(item);
// Undo
if (next) parent.insertBefore(stash, next);
else parent.appendChild(stash);
JavaScriptここが重要です:removeChild の返り値を保管して、元の位置情報(nextSibling)と組み合わせれば簡単に“元に戻す”が実装できます。
まとめ
removeChild は「親から指定の子を取り外す」ための基本メソッドです。親子関係を必ず一致させ、返り値のノードは再利用できる。単純に消すだけなら element.remove()、まとめて消すなら replaceChildren や textContent が便利。削除時はイベント・タイマー・オブジェクトURLなどの後片付けを忘れず、テキストノードと要素ノードの違いにも注意する。これらを押さえれば、初心者でも安全で意図通りの“削除”操作が書けます。
