Cloner des modèles avec `cloneNode`
Générez efficacement le contenu d’un modèle avec `cloneNode(true)`.
Cloner des modèles avec `cloneNode` est une leçon HTML Academy gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage HTML Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours HTML Academy comprend 4 leçons au total.
Clonage profond ou superficiel
La méthode cloneNode accepte un argument booléen :
const template = document.getElementById('card-tmpl');
// Deep clone (true): copies all descendants
const deep = template.content.cloneNode(true);
// Shallow clone (false): only the root node, no children
const shallow = template.content.cloneNode(false);
// shallow has no children — use deep for templatesPlusieurs instances à partir d'un seul template
Les modèles peuvent être clonés autant de fois que nécessaire :
const tmpl = document.getElementById('item-tmpl');
const container = document.getElementById('list');
['Alpha', 'Beta', 'Gamma'].forEach((name, i) => {
const clone = tmpl.content.cloneNode(true);
clone.querySelector('.item-name').textContent = name;
clone.querySelector('.item-num').textContent = i + 1;
container.appendChild(clone);
});
// 3 separate clones — modifying one doesn't affect othersDocumentFragment et performances
Regroupez les mises à jour du DOM à l'aide de DocumentFragment pour améliorer les performances :
const frag = document.createDocumentFragment();
const tmpl = document.getElementById('row-tmpl');
rows.forEach(row => {
const clone = tmpl.content.cloneNode(true);
// fill in clone...
frag.appendChild(clone);
});
// ONE DOM append instead of many:
document.getElementById('table-body').appendChild(frag);
// Appending to a fragment doesn't trigger layout; append once for performanceClonage et écouteurs d'événements
Les écouteurs d'événements du template d'origine ne sont NOT pas copiés :
// Template definition:
const tmpl = document.getElementById('btn-tmpl');
const origBtn = tmpl.content.querySelector('.btn');
origBtn.addEventListener('click', () => console.log('click'));
// Clone:
const clone = tmpl.content.cloneNode(true);
const cloneBtn = clone.querySelector('.btn');
// cloneBtn does NOT have the click listener!
// You must re-add listeners after cloningAjout d'écouteurs après le clonage
Ajoutez les événements après le clonage :
function createCard(data) {
const clone = document.getElementById('card-tmpl').content.cloneNode(true);
const deleteBtn = clone.querySelector('.delete-btn');
deleteBtn.addEventListener('click', () => deleteItem(data.id));
clone.querySelector('.title').textContent = data.title;
return clone; // return the fragment
}
document.getElementById('list').appendChild(createCard(item));Utilisation de importNode
document.importNode est une alternative à cloneNode :
const tmpl = document.getElementById('card-tmpl');
// Equivalent to tmpl.content.cloneNode(true):
const clone = document.importNode(tmpl.content, true);
// importNode adopts the node into the current document
// In the same document, this is functionally identical to cloneNodeAperçu des emplacements de template
Les composants Web utilisent des emplacements nommés pour injecter du contenu dans les modèles :
<template id="card-tmpl">
<div class="card">
<slot name="title">Default Title</slot>
<slot name="body">Default body text.</slot>
</div>
</template>
<!-- slot elements become placeholders for projected content -->
<!-- Covered in full in the Shadow DOM course -->Mise à jour du contenu cloné
Méthodes pour remplir le contenu cloné d'un template :
const clone = tmpl.content.cloneNode(true);
// textContent — safe, no HTML parsing:
clone.querySelector('.name').textContent = user.name;
// innerHTML — only if content is trusted:
clone.querySelector('.bio').innerHTML = trustedHTML;
// setAttribute:
clone.querySelector('.avatar').src = user.avatar;
clone.querySelector('.profile-link').href = `/users/${user.id}`;Comparaison avec document.createElement
template contre createElement pour les éléments répétés :
// createElement: verbose for complex structures
const card = document.createElement('div');
card.className = 'card';
const title = document.createElement('h2');
card.appendChild(title);
// ... many lines for nested structure
// template: define once, clone efficiently
const clone = tmpl.content.cloneNode(true);
// Complex structure defined in HTML once
// Clone is fast and the template handles nestingMémoire et templates
Gestion de la mémoire des modèles :
- Les modèles sont stockés en mémoire sous forme de DocumentFragments
- Les clones sont des copies indépendantes — libérées par le ramasse-miettes lorsqu'elles sont supprimées du DOM
- Les modèles eux-mêmes persistent aussi longtemps que l'élément DOM existe
- Pour les modèles dynamiques, mettez en cache la référence au modèle en dehors de la fonction
Compatibilité des navigateurs
Prise en charge de l'élément template :
- Pris en charge par tous les navigateurs modernes depuis environ 2014
- Pas de prise en charge dans IE (IE est en fin de vie)
- Aucun polyfill nécessaire pour les projets modernes
Vérification rapide
Pourquoi faut-il ajouter de nouveau les écouteurs d'événements après avoir cloné un template ?
Récapitulatif : cloneNode
Les notions essentielles de cloneNode :
cloneNode(true)— copie profonde incluant tous les descendants- Les écouteurs d'événements ne sont NOT pas copiés — rattachez-les après le clonage
- Regroupez les ajouts avec DocumentFragment pour améliorer les performances
- Mettez en cache la référence au modèle en dehors des boucles de rendu
- Utilisez textContent pour insérer du texte en toute sécurité
Questions Fréquemment Posées
La leçon « Cloner des modèles avec `cloneNode` » est-elle gratuite ?
Oui — le texte complet de « Cloner des modèles avec `cloneNode` » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours HTML Academy, passe à CoddyKit PRO. Le cours HTML Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Cloner des modèles avec `cloneNode` » ?
Générez efficacement le contenu d’un modèle avec `cloneNode(true)`. Tu pratiques HTML Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer HTML Academy ?
Aucune expérience préalable n'est requise. HTML Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.
Combien de temps prend la leçon « Cloner des modèles avec `cloneNode` » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon HTML Academy ?
Oui. Chaque leçon HTML Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- L’élément `template` : contenu inerte
- Cloner des modèles avec `cloneNode`
- Utiliser `template` pour le rendu JavaScript
- Modèles ou `innerHTML` : sécurité