JavaScript | DOM 操作:ノード操作 – removeChild

JavaScript
スポンサーリンク

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などの後片付けを忘れず、テキストノードと要素ノードの違いにも注意する。これらを押さえれば、初心者でも安全で意図通りの“削除”操作が書けます。

タイトルとURLをコピーしました