ÐÑÑÑоеннÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ <template> пÑедназнаÑен Ð´Ð»Ñ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ñаблона HTML. ÐÑаÑÐ·ÐµÑ Ð¿Ð¾Ð»Ð½Ð¾ÑÑÑÑ Ð¸Ð³Ð½Ð¾ÑиÑÑÐµÑ ÐµÐ³Ð¾ ÑодеÑжимое, пÑовеÑÑÑ Ð»Ð¸ÑÑ ÑинÑакÑиÑ, но Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ иÑполÑзоваÑÑ ÑÑÐ¾Ñ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð² JavaScript, ÑÑÐ¾Ð±Ñ ÑоздаÑÑ Ð´ÑÑгие ÑлеменÑÑ.
Ð ÑеоÑии, Ð´Ð»Ñ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ ÑазмеÑки Ð¼Ñ Ð¼Ð¾Ð³Ð»Ð¸ Ð±Ñ ÑоздаÑÑ Ð½ÐµÐ²Ð¸Ð´Ð¸Ð¼Ñй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð² лÑбом меÑÑе HTML. ЧÑо Ñакого оÑобенного в <template>?
Ðо-пеÑвÑÑ , его ÑодеÑжимÑм Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð»Ñбой коÑÑекÑнÑй HTML-код, даже Ñакой, коÑоÑÑй обÑÑно нÑждаеÑÑÑ Ð² ÑпеÑиалÑном ÑодиÑеле.
РпÑимеÑÑ, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ помеÑÑиÑÑ ÑÑда ÑÑÑÐ¾ÐºÑ ÑаблиÑÑ <tr>:
<template>
<tr>
<td>СодеÑжимое</td>
</tr>
</template>
ÐбÑÑно, еÑли ÑÐ»ÐµÐ¼ÐµÐ½Ñ <tr> Ð¼Ñ Ð¿Ð¾Ð¼ÐµÑÑим, Ñкажем, в <div>, бÑаÑÐ·ÐµÑ Ð¾Ð±Ð½Ð°ÑÑÐ¶Ð¸Ñ Ð½ÐµÐ¿ÑавилÑнÑÑ ÑÑÑÑкÑÑÑÑ DOM и «иÑпÑавиÑ» еÑ, добавив ÑнаÑÑжи <table>. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð¾ÐºÐ°Ð·Ð°ÑÑÑÑ Ð½Ðµ Ñем, ÑÑо Ð¼Ñ Ñ
оÑели. <template> же оÑÑÐ°Ð²Ð¸Ñ ÑазмеÑÐºÑ Ñовно Ñакой, какой Ð¼Ñ ÐµÑ ÑÑда помеÑÑили.
Также внÑÑÑи <template> можно помеÑÑиÑÑ ÑÑили и ÑкÑипÑÑ:
<template>
<style>
p { font-weight: bold; }
</style>
<script>
alert("ÐÑивеÑ");
</script>
</template>
ÐÑаÑÐ·ÐµÑ ÑаÑÑмаÑÑÐ¸Ð²Ð°ÐµÑ ÑодеÑжимое <template> как наÑ
одÑÑееÑÑ Â«Ð²Ð½Ðµ докÑменÑа»: ÑÑили, опÑеделÑннÑе в нÑм, не пÑименÑÑÑÑÑ, ÑкÑипÑÑ Ð½Ðµ вÑполнÑÑÑÑ, <video autoplay> не запÑÑÑиÑÑÑ Ð¸ Ñ.д.
СодеÑжимое оживÑÑ (ÑкÑÐ¸Ð¿Ñ Ð²ÑполниÑÑÑ), когда Ð¼Ñ Ð¿Ð¾Ð¼ÐµÑÑим его в нÑжное нам меÑÑо.
ÐÑполÑзование template
СодеÑжимое Ñаблона доÑÑÑпно по его ÑвойÑÑÐ²Ñ content в каÑеÑÑве DocumentFragment â оÑобÑй Ñип DOM-Ñзла.
Ðожно обÑаÑаÑÑÑÑ Ñ Ð½Ð¸Ð¼ Ñак же, как и Ñ Ð»ÑбÑми дÑÑгими DOM-Ñзлами, за иÑклÑÑением одной оÑобенноÑÑи: когда Ð¼Ñ ÐµÐ³Ð¾ кÑда-Ñо вÑÑавлÑем, Ñо в ÑÑо меÑÑо вÑÑавлÑеÑÑÑ Ð½Ðµ он Ñам, а его деÑи.
ÐÑимеÑ:
<template id="tmpl">
<script>
alert("ÐÑивеÑ");
</script>
<div class="message">ÐÑивеÑ, ÐиÑ!</div>
</template>
<script>
let elem = document.createElement('div');
// ÐлониÑÑем ÑодеÑжимое Ñаблона Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð¿ÐµÑеиÑполÑзоваÑÑ ÐµÐ³Ð¾ неÑколÑко Ñаз
elem.append(tmpl.content.cloneNode(true));
document.body.append(elem);
// СейÑÐ°Ñ ÑкÑÐ¸Ð¿Ñ Ð¸Ð· <template> вÑполниÑÑÑ
</script>
ÐавайÑе пеÑепиÑем пÑÐ¸Ð¼ÐµÑ Shadow DOM из пÑоÑлой Ð³Ð»Ð°Ð²Ñ ÑÑебника Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ <template>:
<template id="tmpl">
<style> p { font-weight: bold; } </style>
<p id="message"></p>
</template>
<div id="elem">Ðажми на менÑ</div>
<script>
elem.onclick = function() {
elem.attachShadow({mode: 'open'});
elem.shadowRoot.append(tmpl.content.cloneNode(true)); // (*)
elem.shadowRoot.getElementById('message').innerHTML = "ÐÑÐ¸Ð²ÐµÑ Ð¸Ð· Ñеней!";
};
</script>
Ðогда Ð¼Ñ ÐºÐ»Ð¾Ð½Ð¸ÑÑем и вÑÑавлÑем tmpl.content в ÑÑÑоке (*), Ñо, Ñак как ÑÑо DocumentFragment, вмеÑÑо него вÑÑавлÑÑÑÑÑ ÐµÐ³Ð¾ поÑомки (<style>, <p>).
Ðменно они и ÑоÑмиÑÑÑÑ Ñеневой DOM:
<div id="elem">
#shadow-root
<style> p { font-weight: bold; } </style>
<p id="message"></p>
</div>
ÐÑого
Ðодводим иÑоги:
- СодеÑжимÑм
<template>Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð»Ñбой ÑинÑакÑиÑеÑки коÑÑекÑнÑй HTML. - СодеÑжимое
<template>ÑÑиÑаеÑÑÑ Ð½Ð°Ñ Ð¾Ð´ÑÑимÑÑ Â«Ð²Ð½Ðµ докÑменÑа», поÑÑÐ¾Ð¼Ñ Ð¾Ð½Ð¾ ни на ÑÑо не влиÑеÑ. - ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ полÑÑиÑÑ Ð´Ð¾ÑÑÑп к
template.contentиз JavaScript, клониÑоваÑÑ ÐµÐ³Ð¾ и пеÑеиÑполÑзоваÑÑ Ð² новом компоненÑе.
ÐÐ»ÐµÐ¼ÐµÐ½Ñ <template> ÑникалÑнÑй по ÑледÑÑÑим пÑиÑинам:
- ÐÑаÑÐ·ÐµÑ Ð¿ÑовеÑÑÐµÑ Ð¿ÑавилÑноÑÑÑ HTML-ÑинÑакÑиÑа в нÑм (в оÑлиÑие Ð¾Ñ ÑÑÑок в ÑкÑипÑÐ°Ñ ).
- â¦ÐÑи ÑÑом позволÑÐµÑ Ð¸ÑполÑзоваÑÑ Ð»ÑбÑе HTML-Ñеги, даже Ñе, коÑоÑÑе без ÑооÑвеÑÑÑвÑÑÑей обÑÑÑки не иÑполÑзÑÑÑÑÑ (напÑимеÑ
<tr>). - Ðго ÑодеÑжимое Ð¾Ð¶Ð¸Ð²Ð°ÐµÑ (ÑкÑипÑÑ Ð²ÑполнÑÑÑÑÑ,
<video autoplay>пÑоигÑÑваеÑÑÑ Ð¸ Ñ. д.), когда помеÑаеÑÑÑ Ð² докÑменÑ.
ÐÐ»ÐµÐ¼ÐµÐ½Ñ <template> не поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¸ÑеÑаÑиÑ, ÑвÑзÑÐ²Ð°Ð½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
или подÑÑановки пеÑеменнÑÑ
. Ðднако ÑÑи возможноÑÑи можно ÑеализоваÑÑ Ð¿Ð¾Ð²ÐµÑÑ
него.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)