Перейти к содержимому

Элемент Template

В мире веб-разработки JavaScript играет ключевую роль в создании динамичных и привлекательных сайтов. Одной из особенно полезных возможностей, которую он предоставляет, является элемент <code><template></code>. Этот элемент позволяет разработчикам создавать повторно используемые фрагменты HTML-контента, которые можно использовать в разных частях сайта. Давайте разберемся, как работает этот мощный инструмент.

Как работает элемент <template>

Элемент <code><template></code> действует как контейнер для хранения HTML-контента, который не отображается на странице сразу же. В отличие от обычных HTML-элементов, содержимое внутри шаблонов остается неактивным до тех пор, пока не будет активировано с помощью JavaScript. Эта особенность делает шаблоны идеальными для хранения фрагментов разметки, которые будут повторно использоваться или отображаться условно.


html
<body>
  <div>You won't see the template, as it's not activated using JS.</div>
  <div id="template-container">
    <template id="my-template">
      <h1>Hidden!</h1>
    </template>
  </div>
</body>

Клонирование шаблонов для динамического контента

Одним из ключевых преимуществ HTML-шаблонов является их способность динамически создавать клоны. Это позволяет разработчикам создавать несколько экземпляров одной и той же разметки с уникальными данными или атрибутами. Это стандартный способ отображения содержимого шаблона. Процесс включает выбор содержимого внутри элемента шаблона, его клонирование и последующую вставку в DOM.

WARNING

Не забывайте клонировать содержимое шаблона перед вставкой его в DOM. Прямое добавление или манипулирование содержимым шаблона может привести к непреднамеренным изменениям исходного шаблона и неожиданному поведению. Примечание: используйте document.importNode(template.content, true) вместо cloneNode(), чтобы убедиться, что клонированные узлы правильно связаны с текущим документом.


html
<head>
  <style>
    .card {
      border: 1px solid #ccc;
      border-radius: 5px;
      padding: 10px;
      margin: 10px;
      width: 200px;
    }
    .card h3 {
      margin: 0;
    }
  </style>
</head>
<body>
  <div id="template-container">
    <!-- Template element -->
    <template id="card-template">
      <div class="card">
        <h3 id="card-title">Title</h3>
        <p id="card-content">Content goes here...</p>
      </div>
    </template>
  </div>

  <div id="card-container">
    <!-- Cards will be inserted here -->
  </div>

  <script>
    // Data for multiple cards
    const cardData = [
      { title: 'Card 1', content: 'This is the first card.' },
      { title: 'Card 2', content: 'This is the second card.' },
      { title: 'Card 3', content: 'This is the third card.' }
    ];

    // Function to create and insert cards
    function createCards(data) {
      const template = document.getElementById('card-template');

      data.forEach(item => {
        const clone = document.importNode(template.content, true);

        // Customize the cloned content
        clone.querySelector('#card-title').textContent = item.title;
        clone.querySelector('#card-content').textContent = item.content;

        // Insert the cloned content into the DOM
        document.getElementById('card-container').appendChild(clone);
      });
    }

    // Create cards with the provided data
    createCards(cardData);
  </script>
</body>

Повышение интерактивности с помощью JavaScript

JavaScript предоставляет методы для доступа к содержимому внутри шаблона. Используя свойство content элемента шаблона, разработчики могут программно манипулировать его внутренней структурой. Например, template.content возвращает DocumentFragment, содержащий неактивную разметку.

Кроме того, HTML-шаблоны можно комбинировать с обработкой событий для создания интерактивных пользовательских интерфейсов. Добавляя обработчики событий к содержимому шаблона, разработчики могут реагировать на действия пользователей и создавать динамическое поведение.


html
<body>
  <div id="template-container">
    <!-- Button Template -->
    <template id="button-template">
      <button id="show-content-btn">Add a content card</button>
    </template>

    <!-- Content Template -->
    <template id="content-template">
      <div class="content">
        <h2>Dynamic Content</h2>
        <p>This content is added dynamically when the button is clicked.</p>
      </div>
    </template>
  </div>

  <div id="button-container">
    <!-- Button will be inserted here -->
  </div>

  <div id="content-container">
    <!-- Content will be displayed here -->
  </div>

  <script>
    // Function to display template content
    function displayTemplateContent() {
      // Get the content template
      const contentTemplate = document.getElementById('content-template');
      // Access the .content property and clone it
      const contentClone = document.importNode(contentTemplate.content, true);

      // Display the cloned content
      document.getElementById('content-container').appendChild(contentClone);
    }

    // Insert the button template into the DOM
    function insertButton() {
      // Get the button template
      const buttonTemplate = document.getElementById('button-template');
      const buttonClone = document.importNode(buttonTemplate.content, true);

      // Add event listener to the button
      buttonClone.querySelector('#show-content-btn').addEventListener('click', displayTemplateContent);

      // Insert the button into the DOM
      document.getElementById('button-container').appendChild(buttonClone);
    }

    // Call the function to insert the button when the page loads
    insertButton();
  </script>
</body>

В этом примере:

  • У нас есть два шаблона: один для кнопки (button-template) и один для контента (content-template).
  • Функция insertButton клонирует шаблон кнопки и вставляет его в DOM. Она также добавляет обработчик событий к кнопке, чтобы вызывать функцию displayTemplateContent при нажатии.
  • Функция displayTemplateContent клонирует шаблон контента и вставляет его в DOM каждый раз при нажатии на кнопку.
  • Кнопка вставляется в DOM при загрузке страницы путем вызова insertButton.

Таким образом, при нажатии на кнопку "Попробуйте сами" вы увидите кнопку с надписью "Добавить карточку контента." Каждый раз при нажатии на эту кнопку на страницу будет добавляться новый фрагмент контента из шаблона контента, что демонстрирует интерактивность и динамическую вставку контента.

Заключение

HTML-шаблоны предлагают удобный способ управления HTML-контентом в веб-приложениях. Их универсальность и простота использования делают их незаменимыми инструментами для разработчиков, стремящихся оптимизировать рабочий процесс и создавать увлекательный пользовательский опыт. Освоив элемент <code><template></code>, разработчики могут открыть новые возможности для создания динамичных и интерактивных веб-сайтов.

Практика

Какова основная цель элемента Template в JavaScript?

Считаете ли это полезным?

Предпросмотр dual-run — сравните с маршрутами Symfony на продакшене.