Web アプリケーションでは、ある要素を別の要素に差し替える(置換する)操作が頻繁に発生します。ローディングスピナーを取得結果に置き換える、バリデーションエラーを成功メッセージに差し替える、タブの表示コンテンツを切り替えるなど、DOM 要素の置換はフロントエンド開発の基本テクニックです。
・replaceWith で要素自身を置換する方法(モダン)
・replaceChild で親要素経由で置換する方法(従来)
・replaceChildren で全子要素を一括置換する方法
・outerHTML / innerHTML による HTML 文字列での置換
・テキストや複数要素への置換テクニック
・ローディング表示の切り替え・エラーメッセージ差し替え・タブ切り替えの実務パターン
replaceWith で要素を置換する(モダン)
replaceWith は、対象の要素自身を新しい要素やテキストに置き換えるメソッドです。親要素への参照が不要で、直感的に書けます。
targetElement.replaceWith(newContent1, newContent2, ...); // newContent: Node または文字列(複数指定可)
<div id="container"> <p id="oldMessage">読み込み中...</p> </div>
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 タグは解釈されません。
const badge = document.getElementById("status-badge");
// 要素をテキストに置換
badge.replaceWith("完了しました");
// HTML タグを渡しても文字列としてそのまま表示される
// badge.replaceWith("<strong>完了</strong>");
// → 画面に「<strong>完了</strong>」とタグが文字として表示される
複数の要素やテキストで置換する
replaceWith は可変長引数をとるため、1 つの要素を複数の要素やテキストに置き換えることができます。
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);
replaceChild で要素を置換する(従来)
replaceChild は親要素のメソッドで、子要素を新しいノードに置き換えます。IE を含むすべてのブラウザで動作する従来の標準メソッドです。
const removedNode = parentNode.replaceChild(newChild, oldChild); // newChild: 置換後のノード // oldChild: 置換対象の子ノード // 戻り値: 取り除かれたノード(oldChild)
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+) |
(newChild, oldChild) の順です。「新→旧」の順番で、第 2 引数が置換対象です。逆にするとエラーになるため注意してください。replaceChildren で全子要素を一括置換する
replaceChildren は、要素のすべての子ノードを一括で置き換えるメソッドです。引数なしで呼び出すと全子要素の削除になり、引数を渡すと子要素の丸ごと入れ替えができます。
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+ |
outerHTML / innerHTML で HTML 文字列から置換する
outerHTML で要素ごと置換する
outerHTML に HTML 文字列を代入すると、対象の要素自体がその HTML に置き換わります。
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 文字列を代入すると、子要素がすべて置き換わります。要素自体はそのまま残ります。
const container = document.getElementById("container");
// 子要素をすべて新しい HTML に置換
container.innerHTML = '<h2>タイトル</h2><p>新しいコンテンツです</p>';
置換方法の使い分け早見表
| やりたいこと | 推奨メソッド | 備考 |
|---|---|---|
| 要素を別の要素に置換 | el.replaceWith(newEl) |
モダン・シンプル |
| 要素を別の要素に置換(IE 対応) | parent.replaceChild(new, old) |
従来の方法 |
| 全子要素を一括入れ替え | parent.replaceChildren(...nodes) |
リスト再描画に最適 |
| 要素ごと HTML 文字列で置換 | el.outerHTML = html |
変数参照が無効になる点に注意 |
| 子要素を HTML 文字列で置換 | parent.innerHTML = html |
XSS に注意 |
実務でよく使うパターン
ローディング表示を取得結果に置換する
API からデータを取得している間はローディング表示を出し、取得完了後にコンテンツに差し替えるパターンです。
<div id="result"> <p id="loading">データを読み込み中...</p> </div>
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();
バリデーションエラーを成功メッセージに差し替える
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>';
});
タブ切り替えでコンテンツを動的に置換する
<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>
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 の特性を活かして、ある要素の位置を別の要素と入れ替えるテクニックです。
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);
関連記事
- HTML 要素を追加・削除する方法 — createElement・append・remove の基本
- 子要素を取得・操作する方法 — children・firstElementChild・追加・削除・置換
- getAttribute の使い方 — 属性値の取得・設定・削除
- classList の使い方完全ガイド — クラスの操作に特化した API
- 兄弟要素を取得する方法 — nextElementSibling で隣接要素にアクセス
よくある質問
replaceWith が推奨です。構文がシンプルで、テキストや複数要素での置換にも対応しています。IE 対応が必要な場合のみ replaceChild を使いましょう。outerHTML に代入すると、DOM 上の要素は新しい HTML に置き換わりますが、JavaScript の変数は旧要素への参照を保持したままです。新しい要素を操作するには document.querySelector() 等で改めて取得する必要があります。replaceWith や replaceChild で元に戻せます。replaceWith には戻り値がないため、事前に変数で参照を保持しておく必要があります。el.replaceChildren(...newItems) で全子要素の削除と新しい子要素の追加を 1 回の呼び出しで実行できます。createElement + replaceWith の方が安全です(XSS リスクなし)。一方、innerHTML は複雑な HTML 構造を簡潔に記述できるメリットがあります。ユーザー入力を含まない固定 HTML なら innerHTML、ユーザー入力を含む場合は createElement 系を使い分けましょう。まとめ
JavaScript で DOM 要素を置換する方法を整理しました。モダン開発では replaceWith が最もシンプルで使いやすく、全子要素の入れ替えには replaceChildren が最適です。
実務では「ローディング → コンテンツ」「エラー → 成功メッセージ」「タブ切り替え」のように、状態の変化に応じて要素を差し替えるパターンが頻出します。置換メソッドの特徴を理解し、場面に応じて使い分けることで、保守性が高く安全な DOM 操作を実現できます。

