【jQuery】要素を削除する完全ガイド|remove・detach・empty・フェードアウト後削除・条件付き削除まで

jQueryで要素を削除する方法は複数あり、用途によって使い分けが必要です。この記事ではremove・detach・emptyの違い・アニメーション後に削除・条件付き削除・Ajaxリスト操作まで解説します。

この記事でわかること

  • remove() / detach() / empty() の違い
  • フェードアウトなどアニメーション後に要素を削除する
  • 条件に合う要素だけを削除する(filter・each)
  • リストの行を削除してAjaxで反映する
  • 削除前に確認ダイアログを表示する
スポンサーリンク

remove / detach / empty の違い

メソッド 動作 バインドイベントの扱い 主な用途
remove() 要素とその子要素をDOMから削除 削除される 完全削除・再利用しない
detach() DOMから一時的に取り外す 保持される 一時的に取り外して再挿入する
empty() 子要素を全て削除(自分自身は残る) 削除される コンテンツをリセットして再描画

remove() の基本的な使い方

$(function () {
  // 特定の要素を削除
  $('#target').remove();

  // ボタンクリックで親要素(リスト行)を削除
  $(document).on('click', '.delete-btn', function () {
    $(this).closest('li').remove();
  });

  // セレクター条件付き削除
  $('li').remove('.is-done'); // is-doneクラスを持つliだけ削除

  // 複数の要素を削除
  $('.temp, .preview').remove();
});
closest() でボタンから親要素を辿って削除
$(this).closest("li") は、ボタン自身から最も近い li 祖先要素を取得します。動的に追加されたリスト行にも対応するよう、イベントデリゲーション $(document).on(...) を使ってください。

フェードアウト・スライドアップ後に削除する

$(function () {
  // フェードアウトして削除
  $(document).on('click', '.delete-btn', function () {
    $(this).closest('.card')
      .fadeOut(300, function () {
        $(this).remove(); // アニメーション完了後に削除
      });
  });

  // スライドアップして削除
  $(document).on('click', '.remove-row', function () {
    $(this).closest('tr')
      .slideUp(200, function () {
        $(this).remove();
      });
  });
});
コールバック内の $(this) に注意
アニメーションのコールバック関数内の $(this) はアニメーション対象の要素(この場合 .card)を指します。$(this).remove() で正しく削除できます。コールバック外の this と混乱しないように注意してください。

detach() で一時取り外し・再挿入する

$(function () {
  // DOMを一時的に取り外して高速操作(大量の要素に追記する場合など)
  var $list = $('#big-list').detach(); // イベントを保持したままDOMから外す

  for (var i = 0; i < 1000; i++) {
    $list.append('<li>アイテム ' + i + '</li>'); // DOM外で操作(再描画なし)
  }

  $('body').append($list); // 元の位置に再挿入

  // イベントが保持されているため、detach前にバインドしたイベントが引き続き動作
});

empty() で中身をリセットして再描画する

$(function () {
  // コンテンツをリセット
  $('#content').empty();

  // Ajax取得後にコンテンツを差し替える(よく使うパターン)
  function refreshList() {
    $('#user-list').empty();
    $.getJSON('/api/users', function (users) {
      $.each(users, function (i, user) {
        $('#user-list').append(
          $('<li>').text(user.name)
            .append($('<button class="delete-btn">').text('削除').data('id', user.id))
        );
      });
    });
  }

  refreshList();
});

削除前に確認ダイアログを表示する

$(function () {
  $(document).on('click', '.delete-btn', function () {
    var $row = $(this).closest('tr');
    var name = $row.find('.name-col').text();

    if (!confirm('「' + name + '」を削除してもよいですか?')) return;

    var id = $(this).data('id');

    // Ajaxで削除APIを叩く
    $.ajax({ url: '/api/items/' + id, type: 'DELETE' })
      .done(function () {
        $row.fadeOut(200, function () { $(this).remove(); });
      })
      .fail(function () {
        alert('削除に失敗しました');
      });
  });
});

まとめ

jQueryで要素を削除する際のポイントをまとめます。

  • remove(): 完全削除(イベント消える)
  • detach(): 一時取り外し(イベント保持・再挿入可能)
  • empty(): 子要素をクリア(自分自身は残る)
  • アニメーション後削除: .fadeOut(ms, function() { $(this).remove(); })
  • Ajax削除: APIを叩いてから成功時にDOMを削除する

関連記事: 要素を別の要素に置き換える方法 / 最も近い親要素を取得する方法

よくある質問(FAQ)

Qremove()後に要素を復元したいです。
Aremove() で削除した要素はDOMから切り離されますが、jQueryオブジェクトとして変数に保持していれば再挿入できます:var $el = $("#target").remove(); ... $("body").append($el);イベントを保持したまま再挿入したい場合は detach() を使ってください。
Q特定のテキストを含む要素を全て削除したいです。
A$("li").filter(function() { return $(this).text().includes("削除対象"); }).remove()または $("li:contains('削除対象')") セレクターでも同様のことができます。:contains() は大文字小文字を区別しない点に注意してください。
Q削除取り消し(Undo)機能を実装したいです。
A削除前に要素をクローンして保存し、「元に戻す」ボタンが押されたら再挿入します。または一定時間後に完全削除する「スナックバー型」UIが使いやすいです。Googleのような「削除しました。元に戻す」UIは setTimeout で実際の削除を遅延させる実装です。
Qテーブル行を削除すると行番号がずれます。
ACSSの counter-resetcounter-increment を使えば、JavaScriptなしで行番号を自動管理できます。jQueryで番号を振り直す場合は:$("table tbody tr").each(function(i) { $(this).find(".row-num").text(i + 1); })削除後にこの処理を実行してください。
Qremove()とhide()の使い分けは?
Ahide() はDOMに残したまま非表示にします(スペースは消える場合あり)。remove() はDOMから完全に削除します。「条件によって表示/非表示を切り替える」なら show()/hide()、「完全に不要になった要素を消す」なら remove() を使ってください。