0Pricing
HTML Academy · Урок

Клонирование шаблонов с помощью 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 others

DocumentFragment и производительность

Объединяйте обновления 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 — локальная установка не требуется.

Все уроки этого курса

  1. Элемент template: инертное содержимое
  2. Клонирование шаблонов с помощью cloneNode
  3. Использование template для отображения с JavaScript
  4. Шаблоны и безопасность innerHTML
← Назад к HTML Academy