Clonar plantillas con cloneNode
Genere contenido de plantillas eficientemente con cloneNode(true)
Clonar plantillas con cloneNode es una lección gratuita de HTML Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de HTML Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de HTML Academy incluye 4 lecciones en total.
Clonación profunda frente a superficial
El método cloneNode acepta un argumento booleano:
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 templatesMúltiples instancias a partir de un único template
Los templates se pueden clonar cualquier cantidad de veces:
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 y rendimiento
Agrupe las actualizaciones del DOM mediante DocumentFragment para mejorar el rendimiento:
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 performanceClonación y detectores de eventos
Los detectores de eventos del template original NO se copian:
// 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 cloningAñadir detectores después de clonar
Asocie los eventos después de clonar:
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));Uso de importNode
document.importNode es una alternativa a 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 cloneNodeVista previa de los slots de template
Los Web Components usan slots con nombre para inyectar contenido en los templates:
<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 -->Actualización del contenido clonado
Métodos para completar el contenido de un template clonado:
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}`;Comparación con document.createElement
template frente a createElement para elementos repetidos:
// 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 nestingMemoria y templates
Comportamiento de los templates en memoria:
- Los templates se almacenan en memoria como DocumentFragments
- Los clones son copias independientes; el recolector de basura los elimina cuando se quitan del DOM
- Los propios templates persisten mientras exista el elemento del DOM
- Para templates dinámicos, almacene en caché la referencia al template fuera de la función
Compatibilidad con navegadores
Compatibilidad del elemento template:
- Compatible con todos los navegadores modernos desde aproximadamente 2014
- No es compatible con IE (IE está fuera de servicio)
- No se necesita ningún polyfill en proyectos modernos
Comprobación rápida
¿Por qué es necesario volver a añadir los detectores de eventos después de clonar un template?
Repaso: cloneNode
Aspectos esenciales de cloneNode:
cloneNode(true): copia profunda que incluye todos los descendientes- Los detectores de eventos NO se copian; vuelva a asociarlos después de clonar
- Agrupe las operaciones de inserción con DocumentFragment para mejorar el rendimiento
- Almacene en caché la referencia al template fuera de los bucles de renderizado
- Use textContent para insertar texto de forma segura
Preguntas frecuentes
¿La lección «Clonar plantillas con cloneNode» es gratis?
Sí — el texto completo de «Clonar plantillas con cloneNode» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de HTML Academy, actualiza a CoddyKit PRO. El curso de HTML Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Clonar plantillas con cloneNode»?
Genere contenido de plantillas eficientemente con cloneNode(true) Practicas HTML Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar HTML Academy?
No se requiere experiencia previa. HTML Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «Clonar plantillas con cloneNode»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de HTML Academy?
Sí. Cada lección de HTML Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- El elemento template: contenido inerte
- Clonar plantillas con cloneNode
- Usar template para representar contenido con JavaScript
- Plantillas frente a innerHTML: seguridad