テンプレート

javascriptでテンプレート的なことをやる方法は?
http://tdiary.ishinao.net/20050225.html#p06
Javascriptでテンプレート的な…
http://www.akatsukinishisu.net/itazuragaki/js/like_template.html

なんとなく,自分なりに作り直してみた

<script type="text/javascript" language="JavaScript">
<!--
  function append(contents, clone) {
    clone.id += contents.childNodes.length;
    for(var i = 0; i < clone.childNodes.length; ++i) {
      if(!clone.childNodes[i].id) continue;
      clone.childNodes[i].id += contents.childNodes.length;
    }
    contents.appendChild(clone);
  }
  function add() {
    document.getElementById('title').innerHTML = '<h1>タイトル</h1>';
    document.getElementById('number').innerHTML = (Math.random() * 100).toString();

    var clone = document.getElementById('template').cloneNode(true);
    var contents = document.getElementById('contents');
    clone.style.display = "block";
    append(contents, clone);
  }
// -->
</script>


<a onClick="add()">add</a>

<div id="template" style="display: none;">
  <span id="title"></span>
  <span id="number"></span>
</div>

<div id="contents">
</div>

どうやら,firefoxはidの扱いがほかと違う気がする.cloneNodeとかで同じidを複数もつやつが現れると,idを最後に上書きしたelementが,そのidを所有するみたい.

だから,一番手っ取り早い解決方法はcontentsをtemplateの前にもってくれば,ほかと一緒の挙動になるみたい.ただ,場所によって挙動が変わるから,コピーしたもののidを書き換えるほうが汎用性は高いかな.

operaとかIEだと,一番初めに初期化されたもので,書き換えないのかなと思ったけどそうじゃないみたい.contentsとtemplateの場所入れ替えても挙動変わらなかったし.idの所有権というかはどう処理してるのだろ.動的に生成されたelementのidは無視してるのかも