5.1 Balise <template>
La balise <template>
en HTML permet aux développeurs de définir des fragments de code HTML
qui ne seront pas affichés lors du chargement de la page, mais qui peuvent être utilisés plus tard via JavaScript. C'est super utile pour
créer et insérer dynamiquement du contenu, comme des éléments de liste, des fiches produit ou d'autres structures répétitives.
L'élément <template>
est utilisé pour stocker du code HTML qui ne sera pas immédiatement visible sur la page.
Le contenu à l'intérieur de <template>
n'est pas rendu par le navigateur lors du chargement de la page, mais il est accessible via le DOM
(Document Object Model) et peut être cloné et inséré dans le document grâce à JavaScript.
Syntaxe :
<template>
<!-- Contenu du template -->
</template>
Principales caractéristiques de la balise <template>
- Masquage du contenu : le contenu de la balise
<template>
n'est pas affiché sur la page lors de son chargement. - Utilisation avec JavaScript : le contenu de la balise
<template>
peut être cloné et inséré dans le DOM via JavaScript. - Chargement différé : permet de charger et afficher le contenu uniquement lorsque c'est nécessaire, ce qui peut améliorer les performances de la page.
Exemple d'utilisation de la balise <template>
Dans cet exemple, en cliquant sur le bouton "Add Item", un nouvel élément de liste est créé et ajouté à la liste <ul>
.
Le template pour ce nouvel élément de liste est défini dans la balise <template>
.
<button id="addButton">Add Item</button>
<ul id="itemList"></ul>
<template id="itemTemplate">
<li class="item">This is a new item</li>
</template>
// On récupère des références aux éléments du DOM que nous allons utiliser
const addButton = document.getElementById('addButton'); // Le bouton "Ajouter"
const itemList = document.getElementById('itemList'); // La liste où ajouter les éléments
const itemTemplate = document.getElementById('itemTemplate'); // Le template de l'élément de liste
// Ajoutons un gestionnaire d'événement au bouton "Ajouter"
addButton.addEventListener('click', () => {
// On clone le contenu du template d'un élément de liste
const newItem = itemTemplate.content.cloneNode(true); // true signifie un clonage profond (inclut tous les éléments enfants)
// On ajoute le nouvel élément à la liste
itemList.appendChild(newItem);
});
5.2 Exemple : génération de fiches produit
Avec <template>
et JavaScript, on peut, par exemple, générer une liste d'éléments — des fiches produit.
Exemple d'utilisation de la balise <template> :
<h1>Liste de produits</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>
// On attend que le DOM soit complètement chargé avant d'exécuter le script
document.addEventListener('DOMContentLoaded', () => {
// Tableau de données produit
const products = [
{ title: 'Produit 1', description: 'Description du produit 1', price: '100 €' },
{ title: 'Produit 2', description: 'Description du produit 2', price: '200 €' },
{ title: 'Produit 3', description: 'Description du produit 3', price: '300 €' },
];
// On récupère des références aux éléments du DOM
const productList = document.getElementById('productList'); // Conteneur de la liste de produits
const template = document.getElementById('productTemplate').content; // Template de l'élément produit
// On parcourt le tableau des produits et on crée un élément pour chaque produit
products.forEach(product => {
// On clone le template du produit
const clone = document.importNode(template, true); // true - clonage profond
// On remplit les données dans le template cloné
clone.querySelector('.title').textContent = product.title;
clone.querySelector('.description').textContent = product.description;
clone.querySelector('.price').textContent = product.price;
// On ajoute le template rempli à la liste de produits
productList.appendChild(clone);
});
});
Explications
- Balise
<template>
: contient du code HTML qui n'est pas affiché lors du chargement de la page. - Méthode
document.importNode(template, true)
: clone le contenu du template. - Méthodes
querySelector
ettextContent
: utilisées pour modifier le contenu du template cloné avant de l'insérer dans le document.
5.3 Avantages de la balise <template>
Amélioration des performances
Utiliser des templates permet de précharger du code HTML qui sera utilisé plus tard. Cela peut améliorer les performances de la page, car le contenu des templates n'est pas rendu et n'impacte pas le chargement initial de la page.
Simplification du contenu dynamique
Les templates simplifient la création de contenu dynamique. Plutôt que de générer du code HTML de manière programmée avec JavaScript, on peut simplement cloner et modifier des templates préalablement préparés.
Facilité et lisibilité
Les templates rendent le code plus lisible et structuré, puisque le code HTML pour les éléments répétitifs peut être stocké séparément, au lieu d'être inséré dans JavaScript.
Exemple avec affichage conditionnel de contenu :
<h1>Résultats de l'opération</h1>
<div id="messageContainer"></div>
<template id="messageTemplate">
<div class="message">
<p class="content"></p>
</div>
</template>
document.addEventListener('DOMContentLoaded', () => {
// On récupère des références aux éléments du DOM
const messageContainer = document.getElementById('messageContainer'); // Conteneur pour les messages
const template = document.getElementById('messageTemplate').content; // Template du message
// Fonction pour afficher un message
function showMessage(type, text) {
// On clone le template du message
const clone = document.importNode(template, true); // true - clonage profond
// On récupère une référence à l'élément message dans le clone
const messageDiv = clone.querySelector('.message');
// On ajoute une classe correspondant au type de message (success ou error)
messageDiv.classList.add(type);
// On définit le texte du message
messageDiv.querySelector('.content').textContent = text;
// On ajoute le message au conteneur
messageContainer.appendChild(clone);
}
// On appelle la fonction pour afficher des messages
showMessage('success', 'Opération effectuée avec succès !');
showMessage('error', 'Une erreur s\'est produite lors de l\'opération.');
});
Explications :
- La fonction
showMessage()
: prend en paramètre le type de message (succès ou erreur) et le texte du message, clone le template, et l'ajoute au conteneur de messages. - Les classes
.success
et.error
: sont appliquées au template cloné selon le type de message pour le styliser.
GO TO FULL VERSION