【jQuery】要素を別の要素に置き換える完全ガイド|replaceWith・replaceAll・テキスト←→入力欄の切り替えまで

jQueryの replaceWith() を使うと、ある要素を別の要素に置き換えられます。クリックしたラベルを入力欄に変えるインライン編集や、Ajaxで取得したコンテンツとの差し替えなどに活用できます。この記事ではreplaceWith・replaceAllの使い分け・インライン編集・条件付き置換・アニメーション付き置換まで解説します。

この記事でわかること

  • replaceWith() で要素を置き換える基本
  • replaceWith() と replaceAll() の違い
  • テキスト表示と入力欄を切り替えるインライン編集
  • Ajax後にコンテンツを差し替える
  • アニメーション付きで要素を置き換える
スポンサーリンク

replaceWith() の基本的な使い方

$(function () {
  // HTML文字列で置き換え
  $('#old-element').replaceWith('<p>新しい要素</p>');

  // jQueryオブジェクトで置き換え
  var $newBtn = $('<button>').text('新ボタン').addClass('btn-primary');
  $('#old-btn').replaceWith($newBtn);

  // 関数で置き換え(現在の要素を参照できる)
  $('span.editable').replaceWith(function () {
    return '<strong>' + $(this).text() + '</strong>';
  });
});
replaceWith() は元の要素を返す
var $old = $("#target").replaceWith($new); とすると、$old に置換前の要素が返されます。元の要素を別の場所に移動したいときに活用できます。

replaceWith と replaceAll の違い

// replaceWith: 対象要素を引数で指定したものに置き換える
$('#target').replaceWith('<div>新しい要素</div>');
// → $(置き換えられる要素).replaceWith(置き換え後の要素)

// replaceAll: 引数で指定した要素を自分自身に置き換える(順番が逆)
$('<div>新しい要素</div>').replaceAll('#target');
// → $(置き換え後の要素).replaceAll(置き換えられる要素)

// どちらも同じ結果になる。replaceWith の方が直感的で多く使われる。

インライン編集(テキスト↔入力欄の切り替え)

<ul id="editable-list">
  <li><span class="editable-text">タスク1</span> <button class="edit-btn">編集</button></li>
  <li><span class="editable-text">タスク2</span> <button class="edit-btn">編集</button></li>
</ul>
$(function () {
  // 「編集」ボタンクリック → テキストを入力欄に置き換え
  $(document).on('click', '.edit-btn', function () {
    var $span = $(this).siblings('.editable-text');
    var text  = $span.text();

    var $input = $('<input type="text">')
      .val(text)
      .addClass('editable-input');

    $span.replaceWith($input);
    $input.focus().select();
    $(this).text('保存').removeClass('edit-btn').addClass('save-btn');
  });

  // 「保存」ボタンクリック → 入力欄をテキストに置き換え
  $(document).on('click', '.save-btn', function () {
    var $input = $(this).siblings('.editable-input');
    var newText = $input.val().trim() || '(空)';

    $input.replaceWith($('<span>').text(newText).addClass('editable-text'));
    $(this).text('編集').removeClass('save-btn').addClass('edit-btn');
  });

  // Enterキーでも保存
  $(document).on('keydown', '.editable-input', function (e) {
    if (e.key === 'Enter') $(this).siblings('.save-btn').click();
    if (e.key === 'Escape') $(this).siblings('.save-btn').click(); // 変更を保存してキャンセル
  });
});

Ajax後にコンテンツを差し替える

$(function () {
  $('#refresh-btn').on('click', function () {
    var $placeholder = $('<div>').text('読み込み中...').addClass('loading');
    $('#content-area').replaceWith($placeholder);

    $.get('/api/content')
      .done(function (html) {
        // 新しいコンテンツと置き換え
        $placeholder.replaceWith($(html).attr('id', 'content-area'));
      })
      .fail(function () {
        $placeholder.replaceWith($('<div id="content-area">').text('取得に失敗しました'));
      });
  });
});

アニメーション付きで置き換える

$(function () {
  $('#swap-btn').on('click', function () {
    var $target = $('#animated-content');
    var $new    = $('<div id="animated-content">').text('新しいコンテンツ').hide();

    // フェードアウトして置き換え、新しい要素をフェードイン
    $target.fadeOut(300, function () {
      $(this).replaceWith($new);
      $new.fadeIn(300);
    });
  });
});

まとめ

jQueryで要素を置き換える際のポイントをまとめます。

  • replaceWith(): 対象を新しい要素に置き換える(返り値は元の要素)
  • replaceAll(): 書き方が逆(対象と引数が逆転)
  • インライン編集: span→input→spanのサイクル、focus().select() で使いやすく
  • Ajax差し替え: ローディング要素で一時置換 → 完了後に最終コンテンツへ

関連記事: 要素を削除する完全ガイド / 要素内のテキストを設定・取得するtext()の基本

よくある質問(FAQ)

QreplaceWith()後にイベントが効かなくなりました。
A置き換えた新しい要素には古い要素のイベントは引き継がれません。イベントデリゲーション $(document).on("click", ".class", fn) を使うと、置き換え後の要素にも同じイベントが効きます。または置き換え後に新しい要素に再バインドしてください。
QouterHTML で置き換えと同じことができますか?
Ael.outerHTML = "<div>新しい要素</div>" でネイティブJSでも同様のことができます。ただし outerHTML による置き換えは古い要素への参照が無効になります。jQueryの replaceWith() は元の要素を返すため、より明示的に扱えます。
QreplaceWith()でXSSの危険はありますか?
AHTML文字列を引数に渡す場合、ユーザー入力やAPIからの値を含めると XSS 脆弱性が生じます。外部データを含む場合は $("<div>").text(safeData) のようにjQueryオブジェクトを作って渡すか、.text() でテキストとして設定してください。
Q複数要素を一括置換したいです。
A$(".items").replaceWith(fn) のように関数を渡すと、マッチした全要素に対して個別に置き換えが実行されます:$(".badge").replaceWith(function() { return "<strong>" + $(this).text() + "</strong>"; })各要素で異なる置き換え内容にしたい場合は .each() と組み合わせることもできます。
Q置き換えではなく中身だけを変えたいです。
A要素自体は残して中身だけ変えるには .html().text() を使います:$("#box").html("<strong>新しい内容</strong>")replaceWith() は要素ごと差し替えるため、要素自体のIDやクラスも変わります。