5.1 Thẻ <template>
Thẻ <template> trong HTML cho phép developer định nghĩa những đoạn mã HTML không hiển thị khi tải trang, nhưng có thể được sử dụng sau đó qua JavaScript. Điều này đặc biệt hữu ích cho việc tạo và chèn nội dung động, như các phần tử danh sách, thẻ sản phẩm và các cấu trúc lặp lại khác.
Phần tử <template> được dùng để lưu trữ mã HTML mà không hiển thị trên trang ngay lập tức. Nội dung bên trong <template> không được trình duyệt render khi tải trang, nhưng có sẵn qua DOM (Document Object Model) và có thể được sao chép và chèn vào tài liệu bằng JavaScript.
Cú pháp:
<template>
<!-- Nội dung của template -->
</template>
Đặc điểm chính của thẻ <template>
- Ẩn nội dung: nội dung của thẻ
<template>không hiển thị trên trang khi tải. - Sử dụng JavaScript: nội dung của thẻ
<template>có thể được sao chép và chèn vào DOM qua JavaScript. - Tải trễ: cho phép tải và hiển thị nội dung chỉ khi cần, có thể cải thiện hiệu suất trang.
Ví dụ sử dụng thẻ <template>
Trong ví dụ này, khi nhấn nút "Add Item" tạo ra phần tử danh sách mới được thêm vào trong danh sách <ul>. Mẫu cho phần tử danh sách mới được xác định bên trong thẻ <template>.
<button id="addButton">Add Item</button>
<ul id="itemList"></ul>
<template id="itemTemplate">
<li class="item">This is a new item</li>
</template>
// Lấy các phần tử từ DOM để sử dụng
const addButton = document.getElementById('addButton'); // Nút "Thêm"
const itemList = document.getElementById('itemList'); // Danh sách để thêm phần tử
const itemTemplate = document.getElementById('itemTemplate'); // Mẫu phần tử danh sách
// Thêm event listener cho nút "Thêm"
addButton.addEventListener('click', () => {
// Sao chép nội dung của mẫu phần tử danh sách
const newItem = itemTemplate.content.cloneNode(true); // true có nghĩa là sao chép sâu (bao gồm tất cả các phần tử con)
// Thêm phần tử mới vào danh sách
itemList.appendChild(newItem);
});
5.2 Ví dụ: tạo thẻ sản phẩm
Với <template> và JavaScript, bạn có thể tạo danh sách phần tử — thẻ sản phẩm.
Ví dụ sử dụng thẻ <template>:
<h1>Danh sách sản phẩm</h1>
<div id="productList"></div>
<template id="productTemplate">
<div class="item">
<h2 class="title"></h2>
<p class="description"></p>
<span class="price"></span>
</div>
</template>
// Đợi toàn bộ DOM tải xong trước khi thực thi script
document.addEventListener('DOMContentLoaded', () => {
// Mảng dữ liệu sản phẩm
const products = [
{ title: 'Sản phẩm 1', description: 'Mô tả sản phẩm 1', price: '100 USD' },
{ title: 'Sản phẩm 2', description: 'Mô tả sản phẩm 2', price: '200 USD' },
{ title: 'Sản phẩm 3', description: 'Mô tả sản phẩm 3', price: '300 USD' },
];
// Lấy các phần tử từ DOM
const productList = document.getElementById('productList'); // Container cho danh sách sản phẩm
const template = document.getElementById('productTemplate').content; // Mẫu phần tử sản phẩm
// Duyệt qua mảng sản phẩm và tạo phần tử trong danh sách cho mỗi sản phẩm
products.forEach(product => {
// Sao chép mẫu sản phẩm
const clone = document.importNode(template, true); // true - sao chép sâu
// Điền dữ liệu vào mẫu sao chép
clone.querySelector('.title').textContent = product.title;
clone.querySelector('.description').textContent = product.description;
clone.querySelector('.price').textContent = product.price;
// Thêm mẫu đã điền vào danh sách sản phẩm
productList.appendChild(clone);
});
});
Giải thích
- Thẻ
<template>: chứa mã HTML không hiển thị trên trang khi tải. - Phương thức
document.importNode(template, true): sao chép nội dung của mẫu. - Các phương thức
querySelectorvàtextContent: được dùng để thay đổi nội dung của mẫu sao chép trước khi chèn vào tài liệu.
5.3 Lợi ích của thẻ <template>
Cải thiện hiệu suất
Sử dụng template cho phép tải trước mã HTML sẽ được dùng sau đó. Điều này có thể cải thiện hiệu suất trang, vì nội dung của các template không được render và không ảnh hưởng đến tải ban đầu của trang.
Đơn giản hóa nội dung động
Template đơn giản hóa việc tạo nội dung động. Thay vì tạo mã HTML bằng JavaScript, có thể sao chép và chỉnh sửa các template đã chuẩn bị trước đó.
Tiện lợi và dễ đọc
Template làm mã dễ đọc và có cấu trúc hơn, vì mã HTML cho các phần tử lặp đi lặp lại có thể được lưu trữ tách biệt, thay vì chèn vào JavaScript.
Ví dụ với hiển thị nội dung điều kiện:
<h1>Kết quả hoạt động</h1>
<div id="messageContainer"></div>
<template id="messageTemplate">
<div class="message">
<p class="content"></p>
</div>
</template>
document.addEventListener('DOMContentLoaded', () => {
// Lấy các phần tử từ DOM
const messageContainer = document.getElementById('messageContainer'); // Container cho tin nhắn
const template = document.getElementById('messageTemplate').content; // Mẫu tin nhắn
// Hàm để hiển thị tin nhắn
function showMessage(type, text) {
// Sao chép mẫu tin nhắn
const clone = document.importNode(template, true); // true - sao chép sâu
// Lấy phần tử tin nhắn trong clone
const messageDiv = clone.querySelector('.message');
// Thêm class ứng với loại tin nhắn (success hoặc error)
messageDiv.classList.add(type);
// Đặt văn bản cho tin nhắn
messageDiv.querySelector('.content').textContent = text;
// Thêm tin nhắn vào container
messageContainer.appendChild(clone);
}
// Gọi hàm để hiển thị tin nhắn
showMessage('success', 'Hoạt động thành công!');
showMessage('error', 'Đã xảy ra lỗi trong quá trình thực hiện.');
});
Giải thích:
- Hàm
showMessage(): nhận loại tin nhắn (thành công hoặc lỗi) và nội dung tin nhắn, sao chép mẫu và thêm vào container tin nhắn. - Các lớp
.successvà.error: được áp dụng cho mẫu sao chép phụ thuộc vào loại tin nhắn để định kiểu.
GO TO FULL VERSION