Os elementos personalizados permitem que os desenvolvedores da web definam novos tipos de elementos HTML com funcionalidade personalizada.
<b> Definindo novos elementos DOM </b>
Registre um novo elemento html com document.registerElement
var myApp = {};
myApp.XFoo = document.registerElement('x-foo', {
prototype: Object.create(HTMLElement.prototype)
});
defina seu elemento na marcação como faria com outro elemento html
<x-foo></x-foo>
<b> Estenda de outros elementos </b>
herdar de um elemento de botão
myApp.XButton = document.registerElement('x-button', {
prototype: Object.create(HTMLButtonElement.prototype),
extends: 'button'
});
marcação para novo elemento do botão x
<button is="x-button">
herdar do elemento x foo
// inherit from xFoo
myApp.XFooExtended = document.registerElement('x-foo-extended', {
prototype: myApp.XFoo,
extends: 'x-foo'
});
<b> Adicione propriedades e métodos para fornecer funcionalidade para um elemento </b>
adicione métodos e propriedades ao seu elemento x-foo personalizado
// method
myApp.XFooProto.hello = function() {
console.log('hello() called');
};
// writable property
Object.defineProperty(XFooProto, 'bar', {
value: 20,
writable : true
});
<b> Criando elementos do Shadow DOM com um modelo </b>
crie um modelo para definir a marcação para seu novo elemento
<template id="foo-template">
<p>I'm in Shadow DOM...</p>
</template>
adicione o elemento ao ShadowDOM do elemento assim que o elemento for criado
myApp.XFooProto = Object.create(HTMLElement.prototype);
// element created callback
XFooProto.createdCallback = function() {
var shadow = this.createShadowRoot();
var template = document.querySelector('#foo-template');
var cloneTemplate = document.importNode(template.content, true);
this.createShadowRoot().appendChild(cloneTemplate);
};
myApp.XFoo = document.registerElement('x-foo-shadow', {prototype: XFooProto});
<b> Suporte para navegador </b>
O Chrome 31 é o primeiro a ter verdadeiro suporte para as especificações atualizadas do Custom Element.
<b> Polyfills </b>
<b> Mais informações </b>