中学理科1626729 views
高校生物549999 views
いろは2988729 views
高校化学2914160 views
数学講師2856326 views
高校国語785873 views
英語608453 views
りんご194232 views
中学数学621573 views
中学社会667231 views
Help
Tools

English

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 プロパティを複製するのがポイントです。