โคลนเทมเพลตด้วย 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 othersDocumentFragment และประสิทธิภาพ
รวมการอัปเดต 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- องค์ประกอบ template: เนื้อหาที่ไม่มีการทำงาน
- โคลนเทมเพลตด้วย cloneNode
- การใช้ template กับการแสดงผลด้วย JavaScript
- เทมเพลตเทียบกับความปลอดภัยของ innerHTML