0Pricing
HTML Academy · Lekcja

Klonowanie szablonów za pomocą cloneNode

Efektywne powielanie zawartości szablonu za pomocą cloneNode(true)

Klonowanie szablonów za pomocą cloneNode to bezpłatna lekcja HTML Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej HTML Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs HTML Academy zawiera 4 lekcji w sumie.

Klonowanie głębokie a płytkie

Metoda cloneNode przyjmuje argument typu boolean:

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

Wiele instancji z jednego szablonu

Szablony można klonować dowolną liczbę razy:

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 a wydajność

Grupuj aktualizacje DOM za pomocą DocumentFragment, aby zwiększyć wydajność:

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

Klonowanie a nasłuchiwanie zdarzeń

Nasłuchiwacze zdarzeń dodani do oryginalnego szablonu NIE są kopiowani:

// 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

Dodawanie nasłuchiwaczy po sklonowaniu

Dodaj obsługę zdarzeń po sklonowaniu:

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));

Używanie importNode

document.importNode jest alternatywą dla 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

Podgląd slotów szablonu

Web Components używają nazwanych slotów do wstrzykiwania zawartości do szablonów:

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

Aktualizowanie sklonowanej zawartości

Metody uzupełniania zawartości sklonowanego szablonu:

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}`;

Porównanie z document.createElement

template a createElement w przypadku powtarzalnych elementów:

// 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

Pamięć i szablony

Zachowanie szablonów w pamięci:

  • Szablony są przechowywane w pamięci jako DocumentFragment
  • Klonowane elementy są niezależnymi kopiami — garbage collector usuwa je po usunięciu z DOM
  • Same szablony pozostają w pamięci tak długo, jak długo istnieje element DOM
  • W przypadku dynamicznych szablonów należy przechowywać referencję do szablonu poza funkcją

Obsługa przeglądarek

Obsługa elementu template:

  • Obsługiwany we wszystkich nowoczesnych przeglądarkach od około 2014 roku
  • Brak obsługi w IE (IE nie jest już rozwijany)
  • W nowoczesnych projektach nie jest potrzebny polyfill

Szybkie sprawdzenie

Dlaczego po sklonowaniu szablonu trzeba ponownie dodać nasłuchiwacze zdarzeń?

Podsumowanie: cloneNode

Najważniejsze informacje o cloneNode:

  • cloneNode(true) — głęboka kopia obejmująca wszystkich potomków
  • Nasłuchiwacze zdarzeń NIE są kopiowani — należy dodać je ponownie po sklonowaniu
  • Grupuj operacje dodawania za pomocą DocumentFragment, aby zwiększyć wydajność
  • Buforuj referencję do szablonu poza pętlami renderowania
  • Używaj textContent do bezpiecznego wstawiania tekstu

Często zadawane pytania

Czy lekcja „Klonowanie szablonów za pomocą cloneNode” jest bezpłatna?

Tak — pełny tekst „Klonowanie szablonów za pomocą cloneNode” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu HTML Academy, przejdź na CoddyKit PRO. Kurs HTML Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Klonowanie szablonów za pomocą cloneNode”?

Efektywne powielanie zawartości szablonu za pomocą cloneNode(true) Ćwiczysz HTML Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć HTML Academy?

Nie wymagamy żadnego doświadczenia. HTML Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Klonowanie szablonów za pomocą cloneNode”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji HTML Academy?

Tak. Każda lekcja HTML Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Element template — nieaktywna treść
  2. Klonowanie szablonów za pomocą cloneNode
  3. Używanie template do renderowania za pomocą JavaScript
  4. Szablony a bezpieczeństwo innerHTML
← Powrót do HTML Academy