【JavaScript】要素を置換する方法|replaceWith・replaceChild・replaceChildren・outerHTML・条件分岐パターンまで解説

【JavaScript】要素を置換する方法|replaceWith・replaceChild・replaceChildren・outerHTML・条件分岐パターンまで解説 JavaScript

Web アプリケーションでは、ある要素を別の要素に差し替える(置換する)操作が頻繁に発生します。ローディングスピナーを取得結果に置き換える、バリデーションエラーを成功メッセージに差し替える、タブの表示コンテンツを切り替えるなど、DOM 要素の置換はフロントエンド開発の基本テクニックです。

この記事でわかること
・replaceWith で要素自身を置換する方法(モダン)
・replaceChild で親要素経由で置換する方法(従来)
・replaceChildren で全子要素を一括置換する方法
・outerHTML / innerHTML による HTML 文字列での置換
・テキストや複数要素への置換テクニック
・ローディング表示の切り替え・エラーメッセージ差し替え・タブ切り替えの実務パターン
スポンサーリンク

replaceWith で要素を置換する(モダン)

replaceWith は、対象の要素自身を新しい要素やテキストに置き換えるメソッドです。親要素への参照が不要で、直感的に書けます。

構文
targetElement.replaceWith(newContent1, newContent2, ...);
// newContent: Node または文字列(複数指定可)
HTML
<div id="container">
  <p id="oldMessage">読み込み中...</p>
</div>
JavaScript(要素で置換)
const oldMsg = document.getElementById("oldMessage");

// 新しい要素を作成
const newMsg = document.createElement("p");
newMsg.textContent = "データを取得しました";
newMsg.className = "success-message";

// oldMsg を newMsg に置換
oldMsg.replaceWith(newMsg);

// 結果: <div id="container"><p class="success-message">データを取得しました</p></div>

テキストで置換する

replaceWith には文字列を渡すこともできます。文字列はテキストノードとして挿入されるため、HTML タグは解釈されません。

JavaScript
const badge = document.getElementById("status-badge");

// 要素をテキストに置換
badge.replaceWith("完了しました");

// HTML タグを渡しても文字列としてそのまま表示される
// badge.replaceWith("<strong>完了</strong>");
// → 画面に「<strong>完了</strong>」とタグが文字として表示される

複数の要素やテキストで置換する

replaceWith は可変長引数をとるため、1 つの要素を複数の要素やテキストに置き換えることができます。

JavaScript
const placeholder = document.getElementById("placeholder");

const icon = document.createElement("span");
icon.textContent = "✓ ";
icon.className = "icon-check";

const text = document.createElement("span");
text.textContent = "送信完了";

// 1つの要素を2つの要素に置換
placeholder.replaceWith(icon, text);
replaceWith は IE では使えません。IE 対応が必要な場合は後述の replaceChild を使ってください。モダンブラウザのみの開発であれば replaceWith が推奨です。

replaceChild で要素を置換する(従来)

replaceChild は親要素のメソッドで、子要素を新しいノードに置き換えます。IE を含むすべてのブラウザで動作する従来の標準メソッドです。

構文
const removedNode = parentNode.replaceChild(newChild, oldChild);
// newChild: 置換後のノード
// oldChild: 置換対象の子ノード
// 戻り値: 取り除かれたノード(oldChild)
JavaScript
const parent = document.getElementById("container");
const oldChild = document.getElementById("oldElement");

// 新しい要素を作成
const newChild = document.createElement("div");
newChild.textContent = "置換後の要素";
newChild.className = "new-element";

// 親要素経由で置換
const removed = parent.replaceChild(newChild, oldChild);

// 取り除かれた要素はまだメモリに残っている
console.log(removed.textContent); // oldChild の内容にアクセス可能

replaceWith と replaceChild の比較

比較項目 replaceWith replaceChild
呼び出し元 置換される要素自身 親要素
構文 old.replaceWith(new) parent.replaceChild(new, old)
引数 Node・文字列を複数指定可 Node のみ、1 つだけ
戻り値 undefined 取り除かれたノード
IE 対応 非対応 対応(IE6+)
replaceChild の引数は (newChild, oldChild) の順です。「新→旧」の順番で、第 2 引数が置換対象です。逆にするとエラーになるため注意してください。

replaceChildren で全子要素を一括置換する

replaceChildren は、要素のすべての子ノードを一括で置き換えるメソッドです。引数なしで呼び出すと全子要素の削除になり、引数を渡すと子要素の丸ごと入れ替えができます。

JavaScript
const list = document.getElementById("myList");

// すべての子要素を削除
list.replaceChildren();

// 新しい子要素で一括置換
const items = ["りんご", "みかん", "ぶどう"];
const newChildren = items.map(item => {
  const li = document.createElement("li");
  li.textContent = item;
  return li;
});

// 既存の子要素をすべて削除し、新しい要素で置き換え
list.replaceChildren(...newChildren);

innerHTML = “” との違い

比較項目 replaceChildren() innerHTML = “”
型の安全性 Node のみ受け付ける(XSS リスクなし) HTML 文字列を解釈する(XSS リスクあり)
子要素の追加 引数で新しい子要素を同時に設定可能 別途 innerHTML に代入が必要
ブラウザ対応 IE 非対応 IE6+
子要素をまるごと入れ替えるなら replaceChildren が最も意図が明確です。リストの再描画や検索結果の更新などに適しています。

outerHTML / innerHTML で HTML 文字列から置換する

outerHTML で要素ごと置換する

outerHTML に HTML 文字列を代入すると、対象の要素自体がその HTML に置き換わります。

JavaScript
const el = document.getElementById("target");

// 要素ごと新しい HTML に置換
el.outerHTML = '<div class="updated">更新済みコンテンツ</div>';

// 注意: 代入後、変数 el は DOM から切り離された旧要素を参照したまま
console.log(el.textContent); // 旧要素の内容がまだ取れる
// 新しい要素を取得するには再度 querySelector 等が必要
const newEl = document.querySelector(".updated");

innerHTML で子要素を置換する

innerHTML に HTML 文字列を代入すると、子要素がすべて置き換わります。要素自体はそのまま残ります。

JavaScript
const container = document.getElementById("container");

// 子要素をすべて新しい HTML に置換
container.innerHTML = '<h2>タイトル</h2><p>新しいコンテンツです</p>';
outerHTML / innerHTML にユーザー入力をそのまま代入すると XSS(クロスサイトスクリプティング)の脆弱性になります。ユーザー入力を含む場合は textContent を使うか、必ずエスケープ処理を行ってください。

置換方法の使い分け早見表

やりたいこと 推奨メソッド 備考
要素を別の要素に置換 el.replaceWith(newEl) モダン・シンプル
要素を別の要素に置換(IE 対応) parent.replaceChild(new, old) 従来の方法
全子要素を一括入れ替え parent.replaceChildren(...nodes) リスト再描画に最適
要素ごと HTML 文字列で置換 el.outerHTML = html 変数参照が無効になる点に注意
子要素を HTML 文字列で置換 parent.innerHTML = html XSS に注意

実務でよく使うパターン

ローディング表示を取得結果に置換する

API からデータを取得している間はローディング表示を出し、取得完了後にコンテンツに差し替えるパターンです。

HTML
<div id="result">
  <p id="loading">データを読み込み中...</p>
</div>
JavaScript
async function fetchAndRender() {
  const loading = document.getElementById("loading");

  try {
    const res = await fetch("/api/users");
    const users = await res.json();

    // ユーザーリストを作成
    const ul = document.createElement("ul");
    users.forEach(user => {
      const li = document.createElement("li");
      li.textContent = user.name;
      ul.appendChild(li);
    });

    // ローディング表示をリストに置換
    loading.replaceWith(ul);

  } catch (error) {
    // エラー時はエラーメッセージに置換
    const errMsg = document.createElement("p");
    errMsg.textContent = "データの取得に失敗しました";
    errMsg.className = "error-message";
    loading.replaceWith(errMsg);
  }
}

fetchAndRender();

バリデーションエラーを成功メッセージに差し替える

JavaScript
const form = document.getElementById("myForm");

form.addEventListener("submit", (e) => {
  e.preventDefault();

  const msgArea = document.getElementById("message-area");
  const email = form.querySelector("[name=email]").value;

  if (!email.includes("@")) {
    // エラーメッセージに置換
    msgArea.innerHTML = '<p class="error">有効なメールアドレスを入力してください</p>';
    return;
  }

  // 成功メッセージに置換
  msgArea.innerHTML = '<p class="success">送信しました</p>';
});

タブ切り替えでコンテンツを動的に置換する

HTML
<div class="tabs">
  <button class="tab-btn active" data-tab="overview">概要</button>
  <button class="tab-btn" data-tab="specs">仕様</button>
  <button class="tab-btn" data-tab="reviews">レビュー</button>
</div>
<div id="tab-content">ここにコンテンツが表示されます</div>
JavaScript
const tabContent = {
  overview: "<h3>商品概要</h3><p>高品質な製品です。</p>",
  specs:    "<h3>仕様</h3><table><tr><td>サイズ</td><td>100×50mm</td></tr></table>",
  reviews:  "<h3>レビュー</h3><p>★★★★☆ とても満足です。</p>"
};

document.querySelectorAll(".tab-btn").forEach(btn => {
  btn.addEventListener("click", () => {
    // アクティブタブの切り替え
    document.querySelector(".tab-btn.active").classList.remove("active");
    btn.classList.add("active");

    // コンテンツを置換
    const key = btn.getAttribute("data-tab");
    document.getElementById("tab-content").innerHTML = tabContent[key];
  });
});

既存の要素を別の場所に移動する

replaceChild の特性を活かして、ある要素の位置を別の要素と入れ替えるテクニックです。

JavaScript
function swapElements(el1, el2) {
  // el2 の位置に一時的なマーカーを置く
  const marker = document.createElement("span");
  el2.replaceWith(marker);

  // el1 の位置に el2 を置く
  el1.replaceWith(el2);

  // マーカーの位置に el1 を置く
  marker.replaceWith(el1);
}

// 使用例: 2つのカードの位置を入れ替え
const card1 = document.getElementById("card1");
const card2 = document.getElementById("card2");
swapElements(card1, card2);
この要素入れ替えパターンは、ドラッグ&ドロップによる並べ替え機能などで活用できます。

関連記事

よくある質問

QreplaceWith と replaceChild はどちらを使うべきですか?
AIE 対応が不要なら replaceWith が推奨です。構文がシンプルで、テキストや複数要素での置換にも対応しています。IE 対応が必要な場合のみ replaceChild を使いましょう。
QouterHTML で要素を置換した後、変数から新しい要素にアクセスできないのはなぜですか?
AouterHTML に代入すると、DOM 上の要素は新しい HTML に置き換わりますが、JavaScript の変数は旧要素への参照を保持したままです。新しい要素を操作するには document.querySelector() 等で改めて取得する必要があります。
Q置換した要素を元に戻す(アンドゥ)ことはできますか?
AreplaceChild の戻り値として取り除かれたノードが返されます。この参照を保持しておけば、再度 replaceWithreplaceChild で元に戻せます。replaceWith には戻り値がないため、事前に変数で参照を保持しておく必要があります。
QreplaceChildren() はどのような場面で使いますか?
Aリストの再描画や検索結果の更新など、親要素の子要素をすべて入れ替える場面に最適です。el.replaceChildren(...newItems) で全子要素の削除と新しい子要素の追加を 1 回の呼び出しで実行できます。
QinnerHTML での置換と createElement + replaceWith での置換はどちらがよいですか?
Aセキュリティの観点では createElement + replaceWith の方が安全です(XSS リスクなし)。一方、innerHTML は複雑な HTML 構造を簡潔に記述できるメリットがあります。ユーザー入力を含まない固定 HTML なら innerHTML、ユーザー入力を含む場合は createElement 系を使い分けましょう。

まとめ

JavaScript で DOM 要素を置換する方法を整理しました。モダン開発では replaceWith が最もシンプルで使いやすく、全子要素の入れ替えには replaceChildren が最適です。

実務では「ローディング → コンテンツ」「エラー → 成功メッセージ」「タブ切り替え」のように、状態の変化に応じて要素を差し替えるパターンが頻出します。置換メソッドの特徴を理解し、場面に応じて使い分けることで、保守性が高く安全な DOM 操作を実現できます。