0Pricing
HTML Academy · บทเรียน

โคลนเทมเพลตด้วย cloneNode

สร้างสำเนาเนื้อหาเทมเพลตอย่างมีประสิทธิภาพด้วย cloneNode(true)

โคลนเทมเพลตด้วย cloneNode เป็นบทเรียน HTML Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน HTML Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส HTML Academy มีบทเรียนทั้งหมด 4 บทเรียน

การโคลนแบบลึกเทียบกับแบบตื้น

เมธอด cloneNode รับอาร์กิวเมนต์ชนิดบูลีน:

const template = document.getElementById('card-tmpl');

// Deep clone (true): copies all descendants
const deep = template.content.cloneNode(true);

// Shallow clone (false): only the root node, no children
const shallow = template.content.cloneNode(false);
// shallow has no children — use deep for templates

การสร้างสำเนาหลายชุดจาก template เดียว

สามารถโคลน template ได้กี่ครั้งก็ได้:

const tmpl = document.getElementById('item-tmpl');
const container = document.getElementById('list');

['Alpha', 'Beta', 'Gamma'].forEach((name, i) => {
  const clone = tmpl.content.cloneNode(true);
  clone.querySelector('.item-name').textContent = name;
  clone.querySelector('.item-num').textContent = i + 1;
  container.appendChild(clone);
});
// 3 separate clones — modifying one doesn't affect others

DocumentFragment และประสิทธิภาพ

รวมการอัปเดต DOM เป็นชุดโดยใช้ DocumentFragment เพื่อเพิ่มประสิทธิภาพ:

const frag = document.createDocumentFragment();
const tmpl = document.getElementById('row-tmpl');

rows.forEach(row => {
  const clone = tmpl.content.cloneNode(true);
  // fill in clone...
  frag.appendChild(clone);
});

// ONE DOM append instead of many:
document.getElementById('table-body').appendChild(frag);
// Appending to a fragment doesn't trigger layout; append once for performance

การโคลนกับตัวฟังเหตุการณ์

ตัวฟังเหตุการณ์บน template ต้นฉบับจะไม่ถูกคัดลอก:

// Template definition:
const tmpl = document.getElementById('btn-tmpl');
const origBtn = tmpl.content.querySelector('.btn');
origBtn.addEventListener('click', () => console.log('click'));

// Clone:
const clone = tmpl.content.cloneNode(true);
const cloneBtn = clone.querySelector('.btn');
// cloneBtn does NOT have the click listener!
// You must re-add listeners after cloning

การเพิ่มตัวฟังหลังการโคลน

ผูกเหตุการณ์หลังจากโคลนแล้ว:

function createCard(data) {
  const clone = document.getElementById('card-tmpl').content.cloneNode(true);

  const deleteBtn = clone.querySelector('.delete-btn');
  deleteBtn.addEventListener('click', () => deleteItem(data.id));

  clone.querySelector('.title').textContent = data.title;

  return clone;  // return the fragment
}

document.getElementById('list').appendChild(createCard(item));

การใช้ importNode

document.importNode เป็นอีกทางเลือกหนึ่งนอกเหนือจาก cloneNode:

const tmpl = document.getElementById('card-tmpl');

// Equivalent to tmpl.content.cloneNode(true):
const clone = document.importNode(tmpl.content, true);
// importNode adopts the node into the current document
// In the same document, this is functionally identical to cloneNode

ตัวอย่างการใช้ช่องของ template

คอมโพเนนต์เว็บใช้ช่องที่มีชื่อเพื่อแทรกเนื้อหาลงใน template:

<template id="card-tmpl">
  <div class="card">
    <slot name="title">Default Title</slot>
    <slot name="body">Default body text.</slot>
  </div>
</template>
<!-- slot elements become placeholders for projected content -->
<!-- Covered in full in the Shadow DOM course -->

การอัปเดตเนื้อหาที่โคลน

เมธอดสำหรับเติมเนื้อหาใน template ที่โคลนแล้ว:

const clone = tmpl.content.cloneNode(true);

// textContent — safe, no HTML parsing:
clone.querySelector('.name').textContent = user.name;

// innerHTML — only if content is trusted:
clone.querySelector('.bio').innerHTML = trustedHTML;

// setAttribute:
clone.querySelector('.avatar').src = user.avatar;
clone.querySelector('.profile-link').href = `/users/${user.id}`;

การเปรียบเทียบกับ document.createElement

template เทียบกับ createElement สำหรับรายการที่เกิดซ้ำ:

// createElement: verbose for complex structures
const card = document.createElement('div');
card.className = 'card';
const title = document.createElement('h2');
card.appendChild(title);
// ... many lines for nested structure

// template: define once, clone efficiently
const clone = tmpl.content.cloneNode(true);
// Complex structure defined in HTML once
// Clone is fast and the template handles nesting

หน่วยความจำกับ template

พฤติกรรมด้านหน่วยความจำของ template:

  • template ถูกจัดเก็บในหน่วยความจำในรูปแบบ DocumentFragments
  • สำเนาที่โคลนเป็นสำเนาอิสระ ซึ่งจะถูกเก็บคืนโดยตัวเก็บขยะเมื่อถูกนำออกจาก DOM
  • ตัว template เองจะคงอยู่ตราบเท่าที่องค์ประกอบ DOM ยังมีอยู่
  • สำหรับ template แบบไดนามิก ให้แคชการอ้างอิง template ไว้นอกฟังก์ชัน

การรองรับของเบราว์เซอร์

การรองรับองค์ประกอบ template:

  • เบราว์เซอร์สมัยใหม่ทั้งหมดรองรับมาตั้งแต่ประมาณปี 2014
  • IE ไม่รองรับ เนื่องจาก IE สิ้นสุดอายุการใช้งานแล้ว
  • โครงการสมัยใหม่ไม่จำเป็นต้องใช้โพลีฟิลล์

ตรวจสอบอย่างรวดเร็ว

เหตุใดจึงต้องเพิ่มตัวฟังเหตุการณ์อีกครั้งหลังจากโคลน template

ทบทวน: cloneNode

สิ่งสำคัญของ cloneNode:

  • cloneNode(true) — สำเนาแบบลึกที่รวมโหนดลูกหลานทั้งหมด
  • ตัวฟังเหตุการณ์จะไม่ถูกคัดลอก — ต้องผูกใหม่หลังการโคลน
  • เพิ่มหลายรายการเป็นชุดด้วย DocumentFragment เพื่อเพิ่มประสิทธิภาพ
  • แคชการอ้างอิง template ไว้นอกลูปการแสดงผล
  • ใช้ textContent เพื่อแทรกข้อความอย่างปลอดภัย

คำถามที่พบบ่อย

บทเรียน “โคลนเทมเพลตด้วย cloneNode” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “โคลนเทมเพลตด้วย cloneNode” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส HTML Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส HTML Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “โคลนเทมเพลตด้วย cloneNode”

สร้างสำเนาเนื้อหาเทมเพลตอย่างมีประสิทธิภาพด้วย cloneNode(true) คุณปฏิบัติ HTML Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน HTML Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน HTML Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “โคลนเทมเพลตด้วย cloneNode” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน HTML Academy นี้ได้ไหม

ได้ บทเรียน HTML Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. องค์ประกอบ template: เนื้อหาที่ไม่มีการทำงาน
  2. โคลนเทมเพลตด้วย cloneNode
  3. การใช้ template กับการแสดงผลด้วย JavaScript
  4. เทมเพลตเทียบกับความปลอดภัยของ innerHTML
← กลับไปที่ HTML Academy