【jQuery】要素の前後・内側に要素を追加する完全ガイド|append・prepend・before・after

jQueryには要素を追加する方法が複数あります。append()・prepend()・before()・after()・insertBefore()・insertAfter()の使い分けを、実例コードで体系的に解説します。

この記事でわかること

  • 子要素の末尾・先頭に追加する(append/prepend)
  • 兄弟要素として直前・直後に追加する(before/after)
  • 挿入先を指定する書き方(insertBefore/insertAfter)
  • HTMLとjQueryオブジェクトの安全な追加方法
  • 動的に生成した要素の追加パターン
スポンサーリンク

1. 子要素として追加:append() / prepend()

// append(): コンテンツの末尾(最後の子)に追加
$('#list').append('<li>追加アイテム</li>');

// prepend(): コンテンツの先頭(最初の子)に追加
$('#list').prepend('<li>先頭に追加</li>');

// jQueryオブジェクトで追加(特殊文字があっても安全)
var $item = $('<li>').text('新しいアイテム').addClass('list-item');
$('#list').append($item);

// 複数要素に同じ内容を追加
$('.panel').append('<p>フッターテキスト</p>');

// 既存の要素を移動(コピーではなく移動になる)
$('#container').append($('#existing-element'));

2. 兄弟要素として追加:before() / after()

// after(): 要素の直後(兄弟として)に追加
$('#target').after('<p>ターゲットの直後に追加</p>');

// before(): 要素の直前(兄弟として)に追加
$('#target').before('<p>ターゲットの直前に追加</p>');

// 動的に生成した要素を直後に挿入
var $errorMsg = $('<span>').text('エラーが発生しました').addClass('error-msg');
$('#input-field').after($errorMsg);

// エラーメッセージを削除(後から)
$('#input-field').next('.error-msg').remove();

3. 挿入先を指定する書き方:insertBefore() / insertAfter()

追加したい要素が変数に入っている場合は insertBefore() / insertAfter() が自然な書き方です。

// appendTo(): append()の逆記法(追加する要素.appendTo(追加先))
$('<li>新しいアイテム</li>').appendTo('#list');

// prependTo()
$('<li>先頭に追加</li>').prependTo('#list');

// insertAfter(): 追加する要素.insertAfter(目印の要素)
$('<p>挿入テキスト</p>').insertAfter('#target');

// insertBefore()
$('<p>前に挿入</p>').insertBefore('#target');

// 使い分けの目安
// 追加先が確定している場合: append() / prepend() / before() / after()
// 追加する要素が変数の場合: appendTo() / prependTo() / insertAfter() / insertBefore()
メソッド 意味 逆記法
$(A).append(B) AにBを末尾の子として追加 $(B).appendTo(A)
$(A).prepend(B) AにBを先頭の子として追加 $(B).prependTo(A)
$(A).after(B) AのすぐあとにBを追加 $(B).insertAfter(A)
$(A).before(B) AのすぐまえにBを追加 $(B).insertBefore(A)

4. 実用パターン:動的なフォーム行の追加

<div id="form-rows">
  <div class="form-row">
    <input type="text" name="item[]" placeholder="アイテム名">
    <button class="remove-row">削除</button>
  </div>
</div>
<button id="add-row">行を追加</button>
$(function () {
  // 行を追加
  $('#add-row').on('click', function () {
    var $newRow = $('<div>').addClass('form-row').append(
      $('<input>').attr({ type: 'text', name: 'item[]', placeholder: 'アイテム名' }),
      $('<button>').addClass('remove-row').text('削除')
    );
    $('#form-rows').append($newRow);
  });

  // 行を削除(動的追加要素にはon()で委譲)
  $(document).on('click', '.remove-row', function () {
    if ($('.form-row').length > 1) {  // 最低1行は残す
      $(this).closest('.form-row').remove();
    }
  });
});

まとめ

jQueryの要素追加メソッドは書き方が2種類ありますが、「どこに追加するか」「何を追加するか」を整理すれば使い分けは簡単です。文字列でHTMLを渡すと特殊文字のエスケープが必要になるため、$("").text("テキスト") でjQueryオブジェクトを作成してから追加する方が安全です。

関連記事: jQueryのattr()でHTML属性を取得・設定する完全ガイド / jQueryのclone()で要素をコピーする完全ガイド

よくある質問(FAQ)

Qappend()とappendTo()の違いは?
Aどちらも同じ結果です。書き方が逆になります。$(追加先).append(追加内容)$(追加内容).appendTo(追加先) は等価です。追加する要素が変数に入っている場合はappendTo()が自然な書き方になります。
Qappend()でXSS(クロスサイトスクリプティング)が発生しますか?
Aユーザー入力をそのまま append() するとXSSの危険があります。テキストとして挿入する場合は $("

").text(userInput) で安全にエスケープされます。HTMLとして扱いたい場合は必ずサニタイズしてください。

Q既存の要素をappend()すると何が起きますか?
A既存のDOM要素を append() するとコピーではなく移動になります。元の位置から削除されて追加先に移動します。コピーしたい場合は .clone() を使ってください。
Qbefore()とprepend()の違いは?
Abefore() は対象要素の外側・直前(兄弟要素として)に追加します。prepend() は対象要素の内側・先頭(最初の子要素として)に追加します。
Q動的に追加した要素にイベントを設定するには?
A動的に追加した要素には直接 .on("click") は効きません。親要素に対してイベントデリゲーション($(document).on("click", ".dynamic-el", fn))を使います。