Grégory Paul, Valtech
var XFoo = document.registerElement('x-foo');
<x-foo></x-foo>
document.body.appendChild(document.createElement('x-foo'));
document.body.appendChild(new XFoo());
var XFoo = document.registerElement('x-foo', {
prototype: Object.create(HTMLElement.prototype)
});
document.body.appendChild(new XFoo());
var XFoo = document.registerElement('x-foo', {
prototype: Object.create(HTMLElement.prototype, {
bar: {
get: function() { return 5; }
},
foo: {
value: function() {
alert('foo() called');
}
}
})
});
var MegaButton = document.registerElement('mega-button', {
prototype: Object.create(HTMLButtonElement.prototype),
extends: 'button'
});
var megabtn = document.createElement('button', 'mega-button');
megabtn.innerText = "Mega button";
document.body.appendChild(megabtn);
nom du callback | appelé quand |
---|---|
createdCallback | une instance est créée |
attachedCallback | une instance est attachée au DOM |
detachedCallback | une instance est supprimée du DOM |
attributeChangedCallback (name, oldVal, newVal) |
un attribut est ajouté, modifié ou supprimé |
var proto = Object.create(HTMLElement.prototype);
proto.createdCallback = alert.bind(window, 'instance créée');
proto.attachedCallback = alert.bind(window, 'attachée au DOM');
var XFoo = document.registerElement('x-foo', {
prototype: proto
});
var xfoo = new XFoo();
document.body.appendChild(xfoo);
var proto = Object.create(HTMLElement.prototype);
proto.createdCallback = function() {
this.innerHTML = 'Je suis x-foo !';
};
var XFoo = document.registerElement('x-foo', {
prototype: proto
});
var xfoo = new XFoo();
document.body.appendChild(xfoo);
<div id="mytemplate" class="hidden">
<strong></strong><br>
<img src="http://upload.wikimedia.org/wikipedia/meta/0/08/Wikipedia-logo-v2_1x.png">
</div>
<script id="mytemplate" type="text/x-handlebars-template">
<strong></strong><br>
<img src="http://upload.wikimedia.org/wikipedia/meta/0/08/Wikipedia-logo-v2_1x.png">
</script>
.innerHTML
), vulnérable aux attaques XSS.
Parsé (DOM) mais pas rendu (<script> pas lancé, <img> pas chargées, etc)<template id="mytemplate">
<strong></strong><br>
<img src="http://upload.wikimedia.org/wikipedia/meta/0/08/Wikipedia-logo-v2_1x.png">
</template>
var t = document.querySelector('#mytemplate');
t.content.querySelector('strong').textContent = 'Hello, I am';
t.content.querySelector('img').src = 'http://www.valtech.fr/sites/all/themes/valtech/logo.png';
document.body.appendChild(t.content.cloneNode(true));
var docfrag = document.createDocumentFragment();
["IE", "FF", "Chrome"].forEach(function(browser) {
var li = document.createElement("li");
li.textContent = browser;
docfrag.appendChild(li);
});
var ul = document.createElement("ul");
ul.appendChild(docfrag);
document.body.appendChild(ul);
<article />
var host = document.querySelector('article');
var root = host.createShadowRoot();
var title = document.createElement('h2');
title.textContent = 'Titre';
root.appendChild(title);
<article>Hello, world!</article>
var host = document.querySelector('article');
var root = host.createShadowRoot();
root.textContent = 'Bonjour !';
document.querySelector('article').textContent;
<article>
<span>Grégory</span>
</article>
<template>
<h2>Bonjour <content /></h2>
</template>
var root = document.querySelector('article').createShadowRoot();
root.appendChild(document.querySelector('template').content);
<article>
<span class="firstname">Grégory</span>
<span class="company">Valtech</span>
</article>
<template>
<h2>Bonjour <content select=".firstname" /></h2>
<h3><content select=".company" /></h3>
</template>
var root = document.querySelector('article').createShadowRoot();
root.appendChild(document.querySelector('template').content);
<h3>Hello</h3>
var h3 = document.createElement('h3');
document.body.appendChild(h3);
var root = h3.createShadowRoot();
root.innerHTML = '<style>h3 { color: red; }</style>' +
'<h3>Shadow DOM</h3>';
<button>Hello World</button>
var button = document.querySelector('button');
var root = button.createShadowRoot();
root.innerHTML = '<style>'+
':host { text-transform: uppercase; }' +
':host(:hover) { font-weight: bold; }' +
'</style>' +
'<content></content>';
<p class="main">
<button>Hello World</button>
</p>
var button = document.querySelector('button');
var root = button.createShadowRoot();
root.innerHTML = '<style>'+
':host-context(.main) { text-transform: uppercase; }' +
'</style>' +
'<content></content>';
<p>
<button>Hello World</button>
</p>
var button = document.querySelector('button');
var root = button.createShadowRoot();
root.innerHTML = '<style>'+
':host-context(.main) { text-transform: uppercase; }' +
'</style>' +
'<content></content>';
<button><span>Hello </span></button>
var button = document.querySelector('button');
var root = button.createShadowRoot();
root.innerHTML = '<content></content><span>Shadow DOM<span>';
<style>
button::shadow span {
color: red;
}
</style>
<button></button>
var button = document.querySelector('button');
var root = button.createShadowRoot();
root.innerHTML = '<span>Shadow DOM<span>';
var span = document.querySelector('button::shadow span');
span.textContent
<head>
<link rel="import" href="/elements/x-foo.html">
</head>
<link rel="import" href="http://otherdomain.com/x-foo.html">
Access-Control-Allow-Origin: http://domain.com
![]() | ![]() | ![]() | ![]() | ![]() | |
---|---|---|---|---|---|
Templates | |||||
HTML Imports | |||||
Custom Elements | |||||
Shadow DOM |
![]() | ![]() | ![]() | ![]() | ![]() | |
---|---|---|---|---|---|
Templates | |||||
HTML Imports | |||||
Custom Elements | |||||
Shadow DOM |
enfin, en théorie...
Démos : <mappy-element>, <x-video>
Démos : <mappy-element>, <x-mario>
Démos et sources (<mappy-element>)