關於模板解析的經典實踐

TODO:本週內解析成文,目前草稿狀態(12/5)
例子:

<script>
(function(){
  var cache = {};
  var tag_start='<!--';
  var tag_end='-->';

  this.tmpl = function tmpl(str, data){
  var strTemp = str.replace(/[\r\t\n]/g, " ")
          .split(tag_start).join("\t")
          .replace(new RegExp("((^|"+tag_end+")[^\\t]*)'", "g"), "$1\r")
          .replace(new RegExp("\\t=(.*?)"+tag_end, "g"), "',$1,'")
          .split("\t").join("');")
          .split(tag_end).join("p.push('")
          .split("\r").join("\\'");

    var fn = !/\W/.test(str) ? cache[str] = cache[str] ||
      tmpl(document.getElementById(str).innerHTML) :
      new Function("obj", "var p=[],print=function(){p.push.apply(p,arguments);};" +
        "with(obj){p.push('" + strTemp  + "');}return p.join('');");
    if (data)
       {document.getElementById(str).innerHTML=fn( data )
       }
    else
        {return fn;
        }
  };
})();
</script>

<div id="tpl">
    <br>
<!--for (i=0;i<users.length;++i){-->
Name:<!--=users[i].name-->
    <br>
<!--}-->
</div>

<script>
var data={users:[{name:'name1'},
                 {name:'name2'}
                ]
         };
   tmpl("tpl", data);
</script>





轉述:

(function anonymous(obj) {
    var p = []
      , print = function() {
        p.push.apply(p, arguments);
    };
    with (obj) {
        p.push('  <br> ');
        for (i = 0; i < users.length; ++i) {
            p.push(' Name:', users[i].name, '  <br> ');
        }
        p.push(' ');
    }
    return p.join('');
}
)


文例子出處:JavaScript Micro-Templating

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章