記事一覧はこちら

Custom ElementsとHtml TemplateとShadow DOMとHTML Importsを全部使ったページ例

html5で追加Custom ElementsとHtml TemplateとShadow DOMとHTML Importsにめっちゃ期待してるけど複雑怪奇なので全部使ったページを作ってみた。はよIE対応はよはよはよ。chrome最新版で動作確認。 chsh-index HTML Importsがあるから2つのファイルに分かれている。たぶんこれで全部の機能が理解できます。shadowRootのインスタンスをどこに保存するか、どうやって取得するのかで若干悩んだ。多分もっとスマートな書き方あるはず。 Custom Elements→document.registerElement('x-test',{prototype:proto}); Html Template→chsh-template.htmlDefault <template id="cells-to-repeat"> Shadow DOM→var shadowRoot=this.createShadowRoot(); HTML Imports→<link rel="import" href="chsh-template.html" id="linkNode1"> ソースはこんな感じ。

<template id="cells-to-repeat">
    <style>
        label{
            background-color:cyan;
        }
    </style>
    <label><button id="push">ボタン押して数が増える→</button><span id="count">000</span></label>
</template>
<link rel="import" href="chsh-template.html" id="linkNode1">
<script>
br=function(){return document.createElement("br");};
nodes=[];
window.addEventListener("DOMContentLoaded", function(){
    document.querySelector("#total").addEventListener("click",getAllNumber);
    xtest=(function(){
        var proto=Object.create(HTMLElement.prototype, {
            createdCallback: {
                value: function() {
                    var tempNode = document.querySelector('#linkNode1').import;
                    var t = tempNode.querySelector('template');
                    var clone = document.importNode(t.content, true);
                    var shadowRoot=this.createShadowRoot();
                    shadowRoot.appendChild(clone);
                    this.doc=shadowRoot;
                    this.number=0;
                }
            },
            attachedCallback : {
                value: function(){
                    //buttonにイベントをセットする
                    var base=this;
                    this.shadowRoot.querySelector("#push").addEventListener("click",function(){
                        base.number++;
                        base.doc.querySelector("#count").innerText=base.number;
                    });
                }
            },
            attributeChangedCallback : {
                value: function(attrName, oldVal, newVal){
                }
            },
            detachedCallback : {
                value: function(){
                }
            },
        });
        return document.registerElement('x-test',{prototype:proto});
    })();
    newCreate();
    newCreate();
    newCreate();
}, false);
function newCreate(){
    var addNew=new xtest();
    nodes.push(addNew);
    document.body.appendChild(addNew);
    document.body.appendChild(br());
}
function getAllNumber(){
    var total=0;
    for(var i=0;i<nodes.length;i++){
        total+=nodes[i].number;
    }
    alert(total);
}
</script>
<button id="total">合計数</button>
<hr>