Lâélément intégré <template> sert de stockage pour les modèles de balisage HTML. Le navigateur ignore son contenu et vérifie uniquement la validité de la syntaxe, mais nous pouvons y accéder et lâutiliser dans JavaScript, pour créer dâautres éléments.
En théorie, nous pourrions créer nâimporte quel élément invisible quelque part dans le code HTML à des fins de stockage de balises HTML. Quelle est la particularité de <template> ?
Tout dâabord, son contenu peut être nâimporte quel HTML valide, même sâil nécessite normalement une balise dâentourage appropriée.
Par exemple, nous pouvons y placer une ligne de tableau <tr> :
<template>
<tr>
<td>Contents</td>
</tr>
</template>
Habituellement, si nous essayons de mettre <tr> à lâintérieur, disons, dâun <div>, le navigateur détecte la structure DOM invalide et la âcorrigeâ, en ajoutant <table> autour. Ce nâest pas ce que nous voulons. Dâun autre côté, <template> conserve exactement ce que nous y plaçons.
Nous pouvons également placer des styles et des scripts dans <template> :
<template>
<style>
p { font-weight: bold; }
</style>
<script>
alert("Hello");
</script>
</template>
Le navigateur considère que le contenu <template> est âhors du documentâ : les styles ne sont pas appliqués, les scripts ne sont pas exécutés, <video autoplay> nâest pas lancée, etc.
Le contenu devient actif (les styles sâappliquent, les scripts sâexécutent, etc.) lorsque nous lâinsérons dans le document.
Insertion dâun modèle
Le contenu du modèle est disponible dans sa propriété content comme un DocumentFragment â un type spécial de noeud DOM.
Nous pouvons le traiter comme nâimporte quel autre noeud DOM, à lâexception dâune propriété spéciale : lorsque nous lâinsérons quelque part, ses enfants sont insérés à la place.
Par exemple :
<template id="tmpl">
<script>
alert("Hello");
</script>
<div class="message">Hello, world!</div>
</template>
<script>
let elem = document.createElement('div');
// Cloner le contenu du modèle pour le réutiliser plusieurs fois
elem.append(tmpl.content.cloneNode(true));
document.body.append(elem);
// Maintenant le script de <template> s'exécute
</script>
Réécrivons un exemple de Shadow DOM du chapitre précédent en utilisant <template> :
<template id="tmpl">
<style> p { font-weight: bold; } </style>
<p id="message"></p>
</template>
<div id="elem">Click me</div>
<script>
elem.onclick = function() {
elem.attachShadow({mode: 'open'});
elem.shadowRoot.append(tmpl.content.cloneNode(true)); // (*)
elem.shadowRoot.getElementById('message').innerHTML = "Hello from the shadows!";
};
</script>
Dans la ligne (*), lorsque nous clonons et insérons tmpl.content, comme son DocumentFragment, ses enfants (<style>, <p>) sont insérés à la place.
Ils forment le shadow DOM :
<div id="elem">
#shadow-root
<style> p { font-weight: bold; } </style>
<p id="message"></p>
</div>
Résumé
Pour résumer :
- Le contenu de
<template>peut être nâimporte quel HTML syntaxiquement correct. - Le contenu de
<template>est considéré comme âhors du documentâ, donc il nâaffecte rien. - Nous pouvons accéder Ã
template.contentdepuis JavaScript, le cloner pour le réutiliser dans un nouveau composant.
La balise <template> est assez unique, car :
- Le navigateur vérifie la syntaxe HTML à lâintérieur de celle-ci (par opposition à lâutilisation dâune chaîne de modèle à lâintérieur dâun script).
- â¦Mais il permet toujours lâutilisation de nâimporte quelle balise HTML de niveau supérieur, même celles qui nâont pas de sens sans les wrappers appropriées (par exemple,
<tr>). - Le contenu devient interactif : les scripts sâexécutent, la vidéo se joue en autoplay, etc.
Lâélément <template> ne comporte aucun mécanisme dâitération, de liaison de données ou de substitution de variables, mais nous pouvons les mettre en Åuvre par-dessus.
Commentaires
<code>, pour plusieurs lignes â enveloppez-les avec la balise<pre>, pour plus de 10 lignes - utilisez une sandbox (plnkr, jsbin, codepenâ¦)