ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
子要素を削除する 5 つの方法
「リストをクリアして再描画」「モーダルの中身をリセット」など、子要素を全削除するシーンは頻出します。JavaScript には複数のやり方があり、性能・安全性・古い API か新しい API かで選択が変わります。
| 方法 | 対応 | 速度 | イベント残し | 備考 |
|---|---|---|---|---|
el.replaceChildren() | 2020〜 | ★ 速い | クリア | ★ 現代の推奨 |
el.innerHTML = '' | 古くから | 速い | クリアされない場合あり | シンプル、最頻出 |
| while + removeChild | 古くから | 速い | クリア | 確実 |
$(el).empty() | jQuery | 普通 | ★ 自動クリア | jQuery 利用時 |
$(el).remove() | jQuery | 普通 | クリア | ★ 自身も消える |
方法1: replaceChildren()(モダン推奨)
// 子要素を全削除
const list = document.getElementById('list');
list.replaceChildren();
// 削除と差し替えを同時に
list.replaceChildren(
Object.assign(document.createElement('li'), { textContent: 'New 1' }),
Object.assign(document.createElement('li'), { textContent: 'New 2' }),
);
// 配列展開もできる
const items = ['A', 'B', 'C'].map(t => {
const li = document.createElement('li');
li.textContent = t;
return li;
});
list.replaceChildren(...items);
Chrome 86 / Safari 14 / Firefox 78(2020 年〜)で利用可能。IE はサポートしませんが、現代では考慮不要です。
方法2: innerHTML = '' (最頻出)
const list = document.getElementById('list');
list.innerHTML = '';
// 注意: innerHTML はパースが入るので、信頼できない値を代入するのは XSS リスク
// 空文字なら問題なし
シンプルで分かりやすい反面、古いブラウザではイベントリスナーや関連オブジェクトの解放が不完全で、メモリリークの温床になることがありました。モダンブラウザでは概ね問題ないですが、後述の replaceChildren() を使うのが安全。
方法3: while + removeChild(古典)
const list = document.getElementById('list');
while (list.firstChild) {
list.removeChild(list.firstChild);
}
// あるいは lastChild から
while (list.lastChild) {
list.removeChild(list.lastChild);
}
すべてのブラウザで確実に動作します。性能も高く、長くベストプラクティスとされていました。今では replaceChildren() に置き換わっていますが、IE / 古い WebView を相手にするときは依然有効。
方法4: jQuery .empty() / .remove()
// 子要素のみ全削除(自身は残る)
$('#list').empty();
// 自身も含めて削除
$('#list').remove();
// .detach() は DOM から外すがデータ・イベントは保持(再 append 可能)
const $kept = $('#list').detach();
$('body').append($kept);
// 子要素だけ削除して新しい要素を入れる
$('#list').empty().append('<li>New 1</li><li>New 2</li>');
.empty() は jQuery が子孫の data / event を自動的に解放するためメモリリーク対策として優秀でした。Vanilla の場合は手動で removeEventListener しないと残るケースに注意。
性能比較(概念)
| 1 万要素削除のおおまかな速度感 | 所要時間 |
|---|---|
replaceChildren() | ★ 最速クラス |
innerHTML = '' | 速い(パース不要のため) |
| while + removeChild | 速い |
1 つずつ removeChild(forEach) | やや遅い(再描画フラッシュが入ることあり) |
jQuery .empty() | ★ 一段遅い(イベント解放処理あり) |
体感差は小規模(数百要素)では誤差ですが、数千〜数万になると replaceChildren() の優位が見えます。
メモリリーク防止のコツ
削除する前にイベントリスナーを明示的に外すと、循環参照によるリークを防げます:
// ❌ 削除しても closure 経由でリスナーが残るパターン
const btn = document.createElement('button');
btn.addEventListener('click', () => bigState.doSomething());
list.appendChild(btn);
// 後で list.innerHTML = '' しても、登録した {bigState} の参照が残る可能性
// ✅ 削除前にリスナーを外す
const handler = () => bigState.doSomething();
btn.addEventListener('click', handler);
btn._handler = handler;
// ...
btn.removeEventListener('click', btn._handler);
list.removeChild(btn);
// ✅ AbortController で一括解除
const ctrl = new AbortController();
btn.addEventListener('click', handler, { signal: ctrl.signal });
// 後で
ctrl.abort(); // 全リスナー解除
list.replaceChildren();
React / Vue / Svelte の場合
仮想 DOM / リアクティブ系のフレームワークは、状態を空配列にするだけで DOM の子要素削除を内部処理してくれます。直接 DOM を触る必要はありません。
// React
const [items, setItems] = useState([1, 2, 3]);
setItems([]); // → 自動で子要素削除
// Vue
const items = ref([1, 2, 3]);
items.value = [];
// Svelte
let items = [1, 2, 3];
items = [];
テンプレートのリセット(よくある実装例)
function renderList(data) {
const list = document.getElementById('list');
// クリア
list.replaceChildren();
// テンプレート要素を複製して append
const tpl = document.getElementById('item-tpl');
for (const d of data) {
const node = tpl.content.cloneNode(true);
node.querySelector('.name').textContent = d.name;
node.querySelector('.price').textContent = '¥' + d.price.toLocaleString();
list.appendChild(node);
}
}
renderList([{ name: 'Apple', price: 120 }, { name: 'Banana', price: 80 }]);
FAQ
Q: innerHTML = '' は遅い?
A: 空文字代入は HTML パース不要で十分高速です。「大量 HTML 文字列を innerHTML に代入」は遅い、というよく聞く話と混同しないこと。
Q: 削除した子要素を再利用したい
A: el.removeChild(child) で取り出した child をそのまま別の親に appendChild() できます。jQuery なら .detach()。
Q: replaceChildren が古いブラウザで動かない
A: モダンブラウザのみ対応。IE 11 等を相手にする場合は while (el.firstChild) 方式にフォールバック。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?