cloneNode で要素を複製する
cloneNode は、既存の要素をコピーして新しい要素を作るメソッドです。複雑な構造の要素を複製したいときに便利です。
基本的な使い方
element.cloneNode(deep) で要素を複製します。引数 deep で、子要素も含めるかを指定します。
const original = document.getElementById('template');
// 浅いコピー(子要素を含まない)
const shallow = original.cloneNode(false);
// 深いコピー(子要素も含む)
const deep = original.cloneNode(true);浅いコピーと深いコピー
<div id="template">
<h2>タイトル</h2>
<p>説明文</p>
</div>cloneNode(false)
外側の div だけがコピーされる。中身は空
cloneNode(true)
div と中の h2、p もすべてコピーされる
実際に動かしてみよう
テンプレートを複製してリストに追加します。
HTML
CSS
JavaScript
<template id="template">
<div class="card">
<h3 class="title">タイトル</h3>
<p class="desc">説明</p>
</div>
</template>
<div id="container"></div>
<button id="addBtn">カードを追加</button>.card {
border: 1px solid #ddd;
padding: 10px;
margin: 8px 0;
border-radius: 4px;
}
.card h3 { margin: 0 0 8px 0; }
.card p { margin: 0; color: #666; }let count = 0;
document.getElementById('addBtn').addEventListener('click', function() {
count++;
const template = document.getElementById('template');
const clone = template.content.cloneNode(true);
clone.querySelector('.title').textContent = 'カード ' + count;
clone.querySelector('.desc').textContent = 'これは ' + count + ' 番目のカードです';
document.getElementById('container').appendChild(clone);
});cloneNode の注意点
id は重複に注意
複製元に id があると、同じ id を持つ要素が複数になります。複製後に id を変更するか削除しましょう。
イベントリスナーはコピーされない
addEventListener で追加したイベントリスナーは複製されません。必要なら複製後に再設定します。
id の重複を防ぐ
const original = document.getElementById('item');
const clone = original.cloneNode(true);
// id を削除
clone.removeAttribute('id');
// または新しい id を設定
clone.id = 'item-copy';template 要素との組み合わせ
上の例でも使いましたが、<template> 要素と組み合わせるとテンプレートパターンが実現できます。
<template id="row-template">
<tr>
<td class="name"></td>
<td class="value"></td>
</tr>
</template>const template = document.getElementById('row-template');
const clone = template.content.cloneNode(true);
clone.querySelector('.name').textContent = 'りんご';
clone.querySelector('.value').textContent = '100円';
table.appendChild(clone);テンプレートの content プロパティを複製するのがポイントです。