CodeGym /Các khóa học /Frontend SELF VI /Các thẻ template

Các thẻ template

Frontend SELF VI
Mức độ , Bài học
Có sẵn

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:

HTML
    
      <template>
        <!-- Nội dung của template -->
      </template>
    
  

Đặc điểm chính của thẻ <template>

  1. Ẩn nội dung: nội dung của thẻ <template> không hiển thị trên trang khi tải.
  2. 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.
  3. 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>.

HTML
    
      <button id="addButton">Add Item</button>
      <ul id="itemList"></ul>
      <template id="itemTemplate">
        <li class="item">This is a new item</li>
      </template>
    
  
JavaScript
    
// 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>:

HTML
    
      <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>
    
  
JavaScript
    
// Đợ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 querySelectortextContent: đượ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:

HTML
    
      <h1>Kết quả hoạt động</h1>
      <div id="messageContainer"></div>

      <template id="messageTemplate">
        <div class="message">
          <p class="content"></p>
        </div>
      </template>
    
  
JavaScript
    
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 .success.error: được áp dụng cho mẫu sao chép phụ thuộc vào loại tin nhắn để định kiểu.
1
Khảo sát/đố vui
, cấp độ , bài học
Không có sẵn
Các thẻ HTML5 Semantics
Các thẻ HTML5 Semantics
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION