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()後に要素を復元したいです。
A
remove() で削除した要素は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-reset・counter-increment を使えば、JavaScriptなしで行番号を自動管理できます。jQueryで番号を振り直す場合は:$("table tbody tr").each(function(i) { $(this).find(".row-num").text(i + 1); })削除後にこの処理を実行してください。Qremove()とhide()の使い分けは?
A
hide() はDOMに残したまま非表示にします(スペースは消える場合あり)。remove() はDOMから完全に削除します。「条件によって表示/非表示を切り替える」なら show()/hide()、「完全に不要になった要素を消す」なら remove() を使ってください。