<multitrack src="Bass">
<tr> <td class="trackBox" style="height : 75px"> <progress class="pisteProgress" id="progress0" value="3" max="3" style="width : 75px"> </progress> Bass <div style="float : right;"> <button class="mute" id="mute0" onclick="muteUnmuteTrack(0);" disabled="disabled"> <span class="glyphicon glyphicon-volume-up"></span> </button> <button class="solo" id="solo0" onclick="soloNosoloTrack(0);" disabled="disabled"> <img src="../img/earphones.png"> </button> </div> <span id="volspan"> <input type="range" class="volumeSlider" id="volume0" min="0" max="100" value="100" onchange="setVolumeOfTrackDependingOnSliderValue(0);"> </span> </td> </tr>
Comment ont-ils créé l'élément <video>
?
Ce sont des parties de code HTML (incluant scripts et styles) qui peuvent être réutilisés,
Ces parties de code sont inertes (les règles CSS ne seront pas appliquées, le JS non executé, les images non chargées, les vidéos non jouées, etc) until the template is used.
<template id="mytemplate"> <img src="" alt="great image"> <div class="comment"></div> </template>On peut laisser l'attribut
src
vide ici... nous l'initialiserons plus tard... var t = document.querySelector('#mytemplate'); // Populate the src at runtime. t.content.querySelector('img').src = 'http://webcomponents.github.io/img/logo.svg'; var clone = document.importNode(t.content, true); document.body.appendChild(clone);JS Bin
Actuellement : tous les browsers (including mobile ones) à part IE/Safari
A venir : support pour les substitutions de variables JavaScript avec {{...}} comme dans les moteurs de templates JS populaires (mustache, etc)
Fournis des outils d'encapsulation du DOM : cacher ce qui n'est pas nécessaire !
Déja utilisé par les développeurs de browsers pour les éléments
<audio>
ou <video>
etc.
Les trois règles du Shadow DOM:
<button>Hello, world (not rendered)!</button> <script> var host = document.querySelector('button'); var root = host.createShadowRoot(); root.textContent = 'the shadow root node is rendered'; </script>Démonstration!
On mélanhge templates et shadow DOM ! Démonstration!
<template id="mytemplate"> <style> h1 {color:white; background:red} </style> <h1>This is a shadowed H1</h1> </template>
// Instanciate the template var t = document.querySelector('#mytemplate'); var clone = document.importNode(t.content, true); // Create a root node under our H1 title var host = document.querySelector('h1'); var root = host.createShadowRoot(); // Put template content in the root node root.appendChild(document.importNode(t.content, true));
root.applyAuthorStyles = true; // false by defaultCSS reset des styles internes : (Démonstration!)
root.resetStyleInheritance = true; // false by default
<template id="mytemplate"> <h1 part="heading">This is a shadowed H1</h1> <p part="paragraph">Paragraph part</p> </template> <body> <div id="myWidget"></div> </body>
#myWidget::part(heading) { color:red; }
<template id="mytemplate"> <h1 part='heading'>This is a shadowed H1</h1> <p part="paragraph"> <content></content> </p> </template> <body> <H1 class="myWidget">Injected content</h1> </body>
La valeur de cet attribut est un sélecteur CSS : Démonstration!
<template id="mytemplate"> <h1 part='heading'><content select="#titleToInject"></content></h1> <p part="paragraph"> <content select="#partToInject"></content> </p> </template> <body> <div class="myWidget"> <span id="titleToInject">Title injected</span> <span id="partToInject">Paragraph injected</span> </div> </body>
Ce sont des éléments HTML custom qui seront reconnus par le navigateur, en plus des éléments standards de HTML5.
Utilisation typique :
document.registerElement('tag-name', { prototype: proto })
Le nom du nouvel élément doit avoir un tiret (dash, en anglais) !
Le prototype doit hériter de HTMLElement.
// Instanciate the template var t = document.querySelector('#mytemplate'); var clone = document.importNode(t.content, true); var widgetProto = Object.create(HTMLElement.prototype); widgetProto.createdCallback = function() { car root = this.createShadowRoot(); root.appendChild(clone); } var Widget = document.registerElement("my-widget", { prototype : widgetProto })
Le nouvel élément peut dorénavant être inséré dans la page: Démonstration!
<body> <my-widget> <span id="titleToInject">Title injected</span> <span id="partToInject">Paragraph injected</span> </my-widget> </body>
Utilisation similaire à l'insertion d'un fichier CSS dans une page !
On package ses composans dans une page HTML (qui utilise CSS, JS, etc) et on l'importe !
Aussi simple que :
<head> <link rel="imports" href="components/myComponents.html"> </head> <body> <my-widget> <span id="titleToInject">Title injected</span> <span id="partToInject">Paragraph injected</span> </my-widget> </body>