Aller au contenu

Élément <template>

Dans le monde du développement web, JavaScript joue un rôle crucial pour rendre les sites dynamiques et engageants. Une fonctionnalité particulièrement utile qu'il offre est l'élément <code><template></code>. Cet élément permet aux développeurs de créer des blocs de contenu HTML réutilisables, qui peuvent être utilisés à différents endroits d'un site. Plongeons dans le fonctionnement de cet outil puissant.

Comprendre l'élément <template>

L'élément <code><template></code> agit comme un conteneur pour stocker du contenu HTML qui n'est pas immédiatement rendu sur la page web. Contrairement aux éléments HTML classiques, le contenu des templates reste inerte jusqu'à ce qu'il soit activé via JavaScript. Cette fonctionnalité rend les templates idéaux pour conserver des morceaux de balisage qui seront réutilisés ou affichés de manière conditionnelle.


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>

Cloner les templates pour du contenu dynamique

L'un des principaux avantages des templates HTML est leur capacité à générer des clones dynamiquement. Cela permet aux développeurs de créer plusieurs instances du même balisage avec des données ou des attributs uniques. C'est la méthode standard pour rendre le contenu d'un template. Le processus consiste à sélectionner le contenu à l'intérieur de l'élément template, à le cloner, puis à l'insérer dans le DOM.

WARNING

N'oubliez pas de cloner le contenu du template avant de l'insérer dans le DOM. L'ajout direct ou la manipulation du contenu du template peut entraîner des modifications involontaires du template original et un comportement inattendu. Remarque : Utilisez document.importNode(template.content, true) au lieu de cloneNode() pour garantir que les nœuds clonés sont correctement associés au document actuel.


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>

Améliorer l'interactivité avec JavaScript

JavaScript fournit des méthodes pour accéder au contenu d'un template. En utilisant la propriété content d'un élément template, les développeurs peuvent manipuler sa structure interne de manière programmatique. Par exemple, template.content renvoie un DocumentFragment qui contient le balisage inerte.

De plus, les templates HTML peuvent être combinés avec la gestion d'événements pour créer des interfaces utilisateur interactives. En ajoutant des écouteurs d'événements au contenu des templates, les développeurs peuvent réagir aux actions des utilisateurs et créer des comportements dynamiques.


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>

Dans cet exemple :

  • Nous avons deux templates : un pour un bouton (button-template) et un pour le contenu (content-template).
  • La fonction insertButton clone le template du bouton et l'insère dans le DOM. Elle attache également un écouteur d'événements au bouton pour appeler la fonction displayTemplateContent lors du clic.
  • La fonction displayTemplateContent clone le template de contenu et l'insère dans le DOM à chaque fois que le bouton est cliqué.
  • Le bouton est inséré dans le DOM au chargement de la page en appelant insertButton.

Ainsi, lorsque vous cliquez sur le bouton « Essayez vous-même », vous verrez un bouton intitulé « Ajouter une carte de contenu ». Chaque fois que vous cliquez sur ce bouton, il ajoutera un nouveau morceau de contenu issu du template de contenu à la page, démontrant ainsi l'interactivité et l'insertion dynamique de contenu.

Conclusion

Les templates HTML offrent un moyen pratique de gérer le contenu HTML dans les applications web. Leur polyvalence et leur facilité d'utilisation en font des outils inestimables pour les développeurs souhaitant rationaliser leur flux de travail et créer des expériences utilisateur engageantes. En maîtrisant l'élément <code><template></code>, les développeurs peuvent débloquer de nouvelles possibilités pour construire des sites web dynamiques et interactifs.

Pratique

Quel est l'objectif principal de l'élément Template en JavaScript ?

Trouvez-vous cela utile?

Aperçu dual-run — comparez avec les routes Symfony en production.