องค์ประกอบ template: เนื้อหาที่ไม่มีการทำงาน
กำหนด HTML ที่ถูกแยกวิเคราะห์แต่ยังไม่แสดงผลจนกว่าจะเปิดใช้งาน
องค์ประกอบ template: เนื้อหาที่ไม่มีการทำงาน เป็นบทเรียน HTML Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน HTML Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส HTML Academy มีบทเรียนทั้งหมด 4 บทเรียน
องค์ประกอบ template คืออะไร
องค์ประกอบ <template> ใช้เก็บ HTML ที่ถูกแยกวิเคราะห์แล้วแต่ ยังไม่แสดงผล:
- เนื้อหาอยู่ใน DOM แต่ไม่แสดงบนหน้าเว็บ
- สคริปต์ภายในจะไม่ทำงาน
- รูปภาพจะไม่โหลด
- CSS จะไม่มีผล
- องค์ประกอบจะอยู่ในสถานะ 'ไม่ทำงาน' จนกว่าจะถูกโคลน
การใช้ template เบื้องต้น
กำหนด template แล้วตรวจสอบเนื้อหาของ template:
<template id="card-template">
<div class="card">
<h2 class="card-title"></h2>
<p class="card-body"></p>
<a class="card-link">Learn more</a>
</div>
</template>
<script>
const tmpl = document.getElementById('card-template');
console.log(tmpl.content); // DocumentFragment
console.log(tmpl.content.querySelector('.card')); // The div node
// Not rendered on the page yet
</script>template.content
คุณสมบัติ .content จะส่งคืน DocumentFragment:
const template = document.querySelector('#card-template');
const fragment = template.content;
// fragment is a DocumentFragment — a lightweight DOM container
// It is not attached to the document
// Modifying fragment does NOT affect the original template
// You must clone it before using itการโคลน template
ใช้ cloneNode(true) เพื่อสร้างสำเนาของเนื้อหาใน template:
const tmpl = document.getElementById('card-template');
const clone = tmpl.content.cloneNode(true); // true = deep clone
// Modify the clone:
clone.querySelector('.card-title').textContent = 'HTML5 Guide';
clone.querySelector('.card-body').textContent = 'Learn HTML5 from scratch.';
clone.querySelector('.card-link').href = '/html5';
// Add to the page:
document.getElementById('card-list').appendChild(clone);การแสดงรายการจาก template
สร้างรายการหลายรายการจาก template เดียว:
<ul id="users"></ul>
<template id="user-tmpl">
<li class="user">
<strong class="user-name"></strong>
<span class="user-role"></span>
</li>
</template>
<script>
const tmpl = document.getElementById('user-tmpl');
const list = document.getElementById('users');
const users = [
{ name: 'Alice', role: 'Admin' },
{ name: 'Bob', role: 'Editor' },
];
users.forEach(user => {
const clone = tmpl.content.cloneNode(true);
clone.querySelector('.user-name').textContent = user.name;
clone.querySelector('.user-role').textContent = user.role;
list.appendChild(clone);
});
</script>เหตุใดจึงใช้ template แทน innerHTML
template ปลอดภัยและมีประสิทธิภาพมากกว่า innerHTML:
// innerHTML approach (less safe):
container.innerHTML = `<div>${userProvidedContent}</div>`;
// Risk: XSS if userProvidedContent is not sanitized
// template approach (safer):
const clone = tmpl.content.cloneNode(true);
clone.querySelector('.name').textContent = userProvidedContent;
// textContent sets text only — HTML tags are not parsed
// No XSS risktemplate กับข้อมูลแบบซ้อนกัน
template ที่ซับซ้อนซึ่งมีโครงสร้างแบบซ้อนกัน:
<template id="post-tmpl">
<article>
<header>
<h2 class="title"></h2>
<time class="date" datetime=""></time>
</header>
<p class="excerpt"></p>
<a class="read-more">Read more</a>
</article>
</template>
<script>
function renderPost(post) {
const clone = document.getElementById('post-tmpl').content.cloneNode(true);
clone.querySelector('.title').textContent = post.title;
clone.querySelector('.date').textContent = post.date;
clone.querySelector('.date').dateTime = post.isoDate;
clone.querySelector('.excerpt').textContent = post.excerpt;
clone.querySelector('.read-more').href = post.url;
return clone;
}
</script>template จะไม่แสดงผล
ตรวจสอบว่าเนื้อหาใน template ถูกซ่อนไว้จากผู้ใช้:
<template id="hidden-tmpl">
<script>alert('This runs when cloned, not when defined');</script>
<img src="wont-load-yet.jpg" alt="Won't load until cloned">
</template>
<!-- The script and image are NOT activated until you clone and append the template -->
<!-- This makes templates safe for defining content without side effects -->template เทียบกับ script type=text/html
รูปแบบแบบเดิมเทียบกับ template สมัยใหม่:
<!-- Old pattern (script hack): -->
<script type="text/html" id="old-tmpl">
<div class="card">...</div>
</script>
<script>
const html = document.getElementById('old-tmpl').innerHTML;
container.innerHTML = html; // XSS risk!
</script>
<!-- Modern template: -->
<template id="card-tmpl">...</template>
<!-- Safer, semantic, no XSS risk -->template ในไลบรารีคอมโพเนนต์
รูปแบบการใช้ template ในไลบรารีคอมโพเนนต์แบบไม่พึ่งเฟรมเวิร์ก:
class UserCard extends HTMLElement {
connectedCallback() {
const tmpl = document.getElementById('user-card-tmpl').content.cloneNode(true);
tmpl.querySelector('.name').textContent = this.getAttribute('name');
this.appendChild(tmpl);
}
}ตรวจสอบอย่างรวดเร็ว
cloneNode(true) ทำอะไรกับคุณสมบัติ content ของ template
ทบทวน: องค์ประกอบ template
สิ่งสำคัญของ template:
- HTML ที่ไม่ทำงาน — ถูกแยกวิเคราะห์แล้วแต่ยังไม่แสดงผล
template.content— ส่งคืน DocumentFragmentcontent.cloneNode(true)— สำเนาแบบลึกที่พร้อมให้แก้ไขและเพิ่มเข้าไป- ปลอดภัยกว่า innerHTML — ไม่มีการแทรก HTML เมื่อใช้ textContent
- ใช้ในองค์ประกอบแบบกำหนดเอง รูปแบบส่วนติดต่อผู้ใช้ที่เกิดซ้ำ และคอมโพเนนต์เว็บ
คำถามที่พบบ่อย
บทเรียน “องค์ประกอบ template: เนื้อหาที่ไม่มีการทำงาน” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “องค์ประกอบ template: เนื้อหาที่ไม่มีการทำงาน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส HTML Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส HTML Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “องค์ประกอบ template: เนื้อหาที่ไม่มีการทำงาน”
กำหนด HTML ที่ถูกแยกวิเคราะห์แต่ยังไม่แสดงผลจนกว่าจะเปิดใช้งาน คุณปฏิบัติ HTML Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน HTML Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน HTML Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “องค์ประกอบ template: เนื้อหาที่ไม่มีการทำงาน” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน HTML Academy นี้ได้ไหม
ได้ บทเรียน HTML Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- องค์ประกอบ template: เนื้อหาที่ไม่มีการทำงาน
- โคลนเทมเพลตด้วย cloneNode
- การใช้ template กับการแสดงผลด้วย JavaScript
- เทมเพลตเทียบกับความปลอดภัยของ innerHTML