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 templatesWiele 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 othersDocumentFragment 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 performanceKlonowanie 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 cloningDodawanie 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 cloneNodePodglą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 nestingPamięć 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
- Element template — nieaktywna treść
- Klonowanie szablonów za pomocą cloneNode
- Używanie template do renderowania za pomocą JavaScript
- Szablony a bezpieczeństwo innerHTML