0Pricing
HTML Academy · Leçon

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 templates

Plusieurs 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 others

DocumentFragment 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 performance

Clonage 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 cloning

Ajout 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 cloneNode

Aperç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 nesting

Mé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&nbsp;: 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

  1. L’élément `template` : contenu inerte
  2. Cloner des modèles avec `cloneNode`
  3. Utiliser `template` pour le rendu JavaScript
  4. Modèles ou `innerHTML` : sécurité
← Retour à HTML Academy