JavaScript | DOM 操作:ノード操作 – remove(直接削除)

JavaScript
スポンサーリンク

remove とは何か(直接削除のイメージ)

remove は、要素自身が「自分を親から切り離して画面から消える」ためのメソッドです。document.getElementById(“x”).remove() のように、親を意識せず一発で削除できます。ここが重要です:remove は「自分で自分を外す」ため、parent.removeChild(child) と違って“親指定”が不要。シンプルで読みやすく、モダンブラウザで広く使えます。


基本の使い方(単体削除とまとめ削除)

単体の要素を直接削除する

<div id="card">カード</div>
<script>
  const card = document.getElementById("card");
  card.remove(); // 画面から消える。親との関係が切れる
</script>
HTML

ここが重要です:remove は“存在していれば成功、無ければ何も起こらない”安全な動作です。親を参照する必要がないため、再利用性の高いコンポーネント内コードでも使いやすいです。

まとめて削除する(クエリで拾って一気に処理)

<div class="toast">通知A</div>
<div class="toast">通知B</div>
<script>
  document.querySelectorAll(".toast").forEach(node => node.remove());
</script>
HTML

ここが重要です:NodeList を回して remove するだけで、複数要素を一括削除できます。DOM の再計算は削除数に応じて発生しますが、“まとめて”処理することで視覚のチラつきを抑えられます。


remove と removeChild の違い(親を意識するかしないか)

親を意識しない remove/親から外す removeChild

<ul id="list">
  <li id="a">A</li>
  <li id="b">B</li>
</ul>
<script>
  const b = document.getElementById("b");
  b.remove(); // 親指定なしで削除(モダン)

  // 伝統的な書き方(親に対して削除)
  // document.getElementById("list").removeChild(b);
</script>
HTML

ここが重要です:どちらも結果は同じですが、remove は読みやすく、削除対象が決まっている場面でミスが少ないです。親が必要なシナリオ(たとえば old = parent.removeChild(child) の返り値を使って再挿入したい)では removeChild を選びます。


よくある落とし穴と安全対策(参照・イベント・クリーンアップ)

参照が残るとメモリが回収されないことがある

let btn = document.getElementById("btn");
const handler = () => {/*…*/};
btn.addEventListener("click", handler);
btn.remove();           // 画面からは消える
btn = null;             // 外部参照も切る(ガベージコレクションされやすく)
JavaScript

ここが重要です:remove は DOM から外すだけです。グローバル変数、配列、Map などに残った参照は引き続きメモリを保持します。不要になったら参照を null にし、タイマー(setInterval)、Observer(Mutation/Intersection)、一時URL(URL.createObjectURL)も停止・解放します。

Object URL やメディアの解放を忘れない

const url = URL.createObjectURL(file);
const img = document.getElementById("preview");
img.src = url;

// 削除するタイミングで解放
img.remove();
URL.revokeObjectURL(url);
JavaScript

ここが重要です:一時的なリソースは“明示的な後片付け”が必要です。remove だけではメモリ資源が解放されないケースに注意します。


位置に依存しない削除(closest で目的の塊を消す)

クリックされたボタンの“親カード”を消す

<article class="card">
  <p>内容</p>
  <button class="close">閉じる</button>
</article>
<script>
  document.addEventListener("click", (e) => {
    const btn = e.target.closest(".close");
    if (!btn) return;
    const card = btn.closest(".card"); // 削除対象の単位に辿る
    if (card) card.remove();           // ひとまとまりを削除
  });
</script>
HTML

ここが重要です:closest で“削除単位”に確実に辿り、remove で消すと、内部構造が変わっても壊れにくいコードになります。親を固定参照しておくより保守性が高いです。


部分クリアと全クリア(replaceChildren や textContent との比較)

子要素だけ全消ししたいなら置き換えが便利

<div id="box">
  <p>一行目</p>
  <p>二行目</p>
</div>
<script>
  const box = document.getElementById("box");
  box.replaceChildren(); // 中身を全部削除(自分自身は残す)
  // box.textContent = ""; // 同様に中身を空にできる
</script>
HTML

ここが重要です:要素自体は残して“中身だけ”消すなら replaceChildren や textContent が最短です。要素ごと完全に消したいなら remove を使います。この切り分けを明確にすると、意図が伝わるコードになります。


削除後の再挿入(一時保管して Undo を実装)

削除前に位置情報を持っておく

<ul id="list">
  <li id="a">A</li>
  <li id="b">B</li>
  <li id="c">C</li>
</ul>
<script>
  const b = document.getElementById("b");
  const parent = b.parentNode;
  const next = b.nextSibling;

  // 一時保管:ノードそのものを変数に保持
  b.remove();

  // Undo:元の位置に戻す
  if (next) parent.insertBefore(b, next);
  else parent.appendChild(b);
</script>
HTML

ここが重要です:remove は返り値が無いので、再挿入したい場合は“元のノードそのもの”を変数で持ち、元位置の目印(nextSibling)も保管しておくと綺麗に戻せます。


実践例(モーダルのクリーンアップ、通知の自動消去、動的行の削除)

モーダルを閉じるときに関連要素をセットで削除

<div id="backdrop" class="backdrop"></div>
<div id="modal" class="modal">内容</div>
<script>
  function closeModal() {
    document.getElementById("modal")?.remove();
    document.getElementById("backdrop")?.remove();
    // 必要ならスクロールロック解除やフォーカス復帰もここで
  }
</script>
HTML

ここが重要です:表示・操作不可・読み上げ(aria)などの状態を“セットで”元に戻す設計にします。remove は視覚とDOM構造を即時に整えられます。

トースト通知を出して一定時間で自動削除

function toast(text, kind = "info") {
  const t = document.createElement("div");
  t.className = `toast toast-${kind}`;
  t.textContent = text;
  document.body.append(t);
  setTimeout(() => t.remove(), 2000);
}
toast("保存しました", "success");
JavaScript

ここが重要です:create → append → remove(タイマー)の型を覚えると、使い捨て UI を簡単に実装できます。

行削除ボタンで対象行を消す

<table id="grid">
  <tr><td>りんご</td><td><button class="del">削除</button></td></tr>
  <tr><td>バナナ</td><td><button class="del">削除</button></td></tr>
</table>
<script>
  document.getElementById("grid").addEventListener("click", (e) => {
    const btn = e.target.closest(".del");
    if (!btn) return;
    const row = btn.closest("tr");
    row?.remove();
  });
</script>
HTML

ここが重要です:イベント委譲+closest+remove の組み合わせは、後から追加された行にも自動対応でき、コードが短く堅牢です。


まとめ(直接削除の作法)

remove は「要素自身が、親から即座に離れて画面から消える」ための直感的で強力なメソッドです。親を意識せず書けるためバグが減り、複数削除も簡単。削除後は外部参照・タイマー・Observer・一時URLなどの“後片付け”を忘れず、部分削除は replaceChildren/textContent を使い分ける。closest と組み合わせれば“削除単位”へ確実に辿れて、構造変化にも強い。これらを押さえれば、初心者でも安全で意図通りの“直接削除”がすっきり書けます。

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