Zabudovaný element <template> sloužà jako úložiÅ¡tÄ Å¡ablon HTML kódu. ProhlÞeÄ ignoruje jeho obsah a zkontroluje jen správnost syntaxe, ale v JavaScriptu k nÄmu můžeme pÅistupovat a použÃvat ho k vytvoÅenà dalÅ¡Ãch elementů.
Teoreticky můžeme pro úÄely uloženà HTML kódu vytvoÅit nÄkde v HTML jakýkoli neviditelný element. Co je na <template> zvláštnÃho?
PÅedevÅ¡Ãm jeho obsahem může být libovolný HTML, i když by normálnÄ vyžadoval pÅÃsluÅ¡nou uzavÃracà znaÄku.
NapÅÃklad do nÄj můžeme vložit Åádek tabulky <tr>:
<template>
<tr>
<td>Obsah</td>
</tr>
</template>
Zpravidla když se pokusÃme vložit <tr> tÅeba dovnitÅ <div>, prohlÞeÄ detekuje vadnou strukturu DOMu a âopravÃâ ji tak, že kolem nà pÅidá <table>. To nenà to, co chceme. Naproti tomu <template> uchovává pÅesnÄ to, co tam umÃstÃme.
Do <template> můžeme ukládat i styly a skripty:
<template>
<style>
p { font-weight: bold; }
</style>
<script>
alert("Ahoj");
</script>
</template>
ProhlÞeÄ zacházà s obsahem <template>, jako by byl âmimo dokumentâ: styly se neaplikujÃ, skripty se nespustÃ, <video autoplay> se nepÅehraje a podobnÄ.
Obsah ožije (styly se aplikujÃ, skripty se spustà atd.), až když jej vložÃme do dokumentu.
Vloženà šablony
Obsah Å¡ablony je k dispozici v jejà vlastnosti content jako DocumentFragment â zvláštnà typ DOM uzlu.
Můžeme s nÃm zacházet jako s kterýmkoli jiným DOM uzlem až na jednu speciálnà vlastnost: když ho nÄkam vložÃme, namÃsto nÄj se vložà jeho dÄti.
PÅÃklad:
<template id="šablona">
<script>
alert("Ahoj");
</script>
<div class="zpráva">Ahoj, svÄte!</div>
</template>
<script>
let elem = document.createElement('div');
// Naklonujeme obsah Å¡ablony, abychom ho mohli použÃt vÃcekrát
elem.append(šablona.content.cloneNode(true));
document.body.append(elem);
// Nynà se skript z <template> spustÃ
</script>
PÅepiÅ¡me pÅÃklad stÃnového DOMu z minulé kapitoly pomocà <template>:
<template id="šablona">
<style> p { font-weight: bold; } </style>
<p id="zpráva"></p>
</template>
<div id="elem">KliknÄte na mÄ</div>
<script>
elem.onclick = function() {
elem.attachShadow({mode: 'open'});
elem.shadowRoot.append(šablona.content.cloneNode(true)); // (*)
elem.shadowRoot.getElementById('zpráva').innerHTML = "Ahoj ze stÃnu!";
};
</script>
Když na Åádku (*) naklonujeme a vložÃme Å¡ablona.content, vložà se namÃsto nÄj jeho dÄti (<style>, <p>), protože je to DocumentFragment.
Budou tvoÅit stÃnový DOM:
<div id="elem">
#shadow-root
<style> p { font-weight: bold; } </style>
<p id="zpráva"></p>
</div>
ShrnutÃ
Když to shrneme:
- Obsahem
<template>může být jakýkoli syntakticky správný HTML. - S obsahem
<template>se zacházÃ, jako by byl âmimo dokumentâ, takže nic neovlivnÃ. - V JavaScriptu můžeme pÅistupovat k obsahu Å¡ablony
Å¡ablona.contenta naklonovat ho, abychom ho mohli použÃt v nové komponentÄ.
ZnaÄka <template> je pomÄrnÄ unikátnÃ, neboÅ¥:
- ProhlÞeÄ kontroluje syntaxi HTML uvnitÅ nà (na rozdÃl od ÅetÄzce se Å¡ablonou uvnitÅ skriptu).
- â¦Stále vÅ¡ak umožÅuje použÃt libovolné HTML znaÄky nejvyššà úrovnÄ, vÄetnÄ tÄch, které bez pÅÃsluÅ¡ných obklopujÃcÃch znaÄek nedávajà smysl (napÅ.
<tr>). - Obsah se stane interaktivnÃm, až bude vložen do dokumentu: skripty se spustÃ,
<video autoplay>se zaÄne pÅehrávat atd.
Element <template> neobsahuje žádné iteraÄnà mechanismy, datové vazby nebo substituce promÄnných, ale můžeme si je na nÄm implementovat.
KomentáÅe
<code>, pro nÄkolik Åádků je obalte znaÄkou<pre>, pro vÃce než 10 Åádků vložte odkaz na pÃskoviÅ¡tÄ (plnkr, jsbin, codepenâ¦)