Клонирование шаблонов с помощью cloneNode
Эффективно создавайте содержимое шаблона с помощью cloneNode(true)
«Клонирование шаблонов с помощью cloneNode» — бесплатный урок HTML Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения HTML Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс HTML Academy содержит 4 уроков всего.
Глубокое и поверхностное клонирование
Метод cloneNode принимает логический аргумент:
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Несколько копий из одного template
template можно клонировать любое количество раз:
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 и производительность
Объединяйте обновления DOM с помощью DocumentFragment для повышения производительности:
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Клонирование и обработчики событий
Обработчики событий исходного template НЕ копируются:
// 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Добавление обработчиков после клонирования
Добавляйте обработчики событий после клонирования:
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));Использование importNode
document.importNode — это альтернатива 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Предварительный просмотр слотов template
Веб-компоненты используют именованные слоты для вставки содержимого в template:
<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 -->Обновление клонированного содержимого
Способы заполнить содержимое клонированного 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}`;Сравнение с document.createElement
template и createElement для повторяющихся элементов:
// 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Память и template
Работа template с памятью:
- template хранятся в памяти как DocumentFragments
- Клоны являются независимыми копиями и удаляются сборщиком мусора после удаления из DOM
- Сами template существуют, пока существует элемент DOM
- Для динамических template кэшируйте ссылку на template за пределами функции
Поддержка браузерами
Поддержка элемента template:
- Поддерживается всеми современными браузерами примерно с 2014 года
- IE не поддерживает (IE больше не развивается)
- Для современных проектов полифилл не нужен
Быстрая проверка
Почему после клонирования template необходимо заново добавлять обработчики событий?
Итоги: cloneNode
Основные сведения о cloneNode:
cloneNode(true)— deep-копия, включающая всех потомков- Обработчики событий НЕ копируются — добавляйте их заново после клонирования
- Объединяйте операции добавления с помощью DocumentFragment для повышения производительности
- Кэшируйте ссылку на template за пределами циклов отрисовки
- Используйте textContent для безопасной вставки текста
Часто задаваемые вопросы
Урок «Клонирование шаблонов с помощью cloneNode» бесплатный?
Да — полный текст урока «Клонирование шаблонов с помощью cloneNode» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс HTML Academy, подпишись на CoddyKit PRO. Курс HTML Academy содержит 4 уроков всего.
Чему я научусь в уроке «Клонирование шаблонов с помощью cloneNode»?
Эффективно создавайте содержимое шаблона с помощью cloneNode(true) Ты практикуешь HTML Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать HTML Academy?
Предыдущий опыт не требуется. HTML Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Клонирование шаблонов с помощью cloneNode»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке HTML Academy?
Да. Каждый урок HTML Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Элемент template: инертное содержимое
- Клонирование шаблонов с помощью cloneNode
- Использование template для отображения с JavaScript
- Шаблоны и безопасность innerHTML