JavaScript Repeatテンプレートコントロール

5945 ワード

機能が強いテンプレートエンジンは、テンプレートを文法的に解析する必要が多く、性能に問題があります.大きなテンプレートエンジンをレンダリングニーズに応じて複数の相互独立型テンプレートコントロールに分離することで、処理の複雑さを低減して処理性能を提供することができ、これらのテンプレートコントロールを必要に応じて柔軟に組み合わせてカスタマイズできるテンプレート機能ライブラリを得ることができる.
テンプレートコントロールは、テンプレートシンタックスとjs appiを規定しています.これはrepeatコントロールのJS実装です.
<!DOCTYPE html>

<html>

<head>

<meta charset="gb2312" />

<title>JavaScript Repeater  </title>

</head>



<body>

<div id="crossRate">

    <!-- PlaceHolder {-->

    <table width="815" class="table-data">

    <tr>

      <th>  </th>

      <th>  </th>

      <th>   </th>

      <th>   </th>

      <th>   </th>

      <th>  </th>

      <th>  </th>

      <th>  </th>

      <th>  </th>

    </tr>

    </table>

    <!-- PlaceHolder }-->

    

	<script type="text/template" id="crossRateHeader">

        <table width="815" class="table-data">

        <tr>

          <th>  </th>

          <th>  </th>

          <th>   </th>

          <th>   </th>

          <th>   </th>

          <th>  </th>

          <th>  </th>

          <th>  </th>

          <th>  </th>

        </tr>

    </script>

	<script type="text/template" id="crossRateItem">

    <tr>

      <td>{$dataRow[1]}</td>

      <td>{$dataRow[2]}</td>

      <td>{$dataRow[5]}</td>

      <td>{$dataRow[17]}</td>

      <td>{$dataRow[18]}</td>

      <td>{$dataRow[4]}</td>

      <td>{$dataRow[6]}</td>

      <td>{$dataRow[7]}</td>

      <td>{$dataRow[3]}</td>

    </tr>

    </script>

	<script type="text/template" id="crossRateFooter">

    </table>

    </script>

</div>

<script>





//View

(function(ns){



	function init(){

		var container = document.getElementById("crossRate");

		container.setAttribute("data-headertemplate", document.getElementById("crossRateHeader").text);

		container.setAttribute("data-itemtemplate", document.getElementById("crossRateItem").text);

		container.setAttribute("data-footertemplate", document.getElementById("crossRateFooter").text);

	}

	

	function render(dt){

		var container = document.getElementById("crossRate"),

			headerhtml = container.getAttribute("data-headertemplate"),

			rowhtml = container.getAttribute("data-itemtemplate"),

			footerhtml = container.getAttribute("data-footertemplate");

			

		var repater = new Repater(headerhtml,rowhtml,footerhtml);

		var dataRow = [];

		for(var i=0,n=dt.length; i<n; i++){

			dataRow = dt[i].split(",");

			repater.set("dataRow",dataRow);

			repater.parse();

		}

		container.innerHTML = repater.toHTML();

	}

	

	ns.crossRate = {

		init: init, 

		render: render, 

		fill: function(data){ 

			render(data);

		}

	};

	ns.crossRate.init();

}(window));





//          data

var datas = ["USDEUR0,USDEUR,    ,0.7731,0.7732,0.7723,0.7734,0.7717,0,22913,0.0000,0,0,0.7731,0.0000,0,0,-0.0008,-0.10%,0.0000,1,3848,0,-1,1,0.0000,0.0000,2012-05-10 13:49:53,3","USDHKD0,USDHKD,    ,7.7625,7.7633,7.7621,7.7634,7.7617,0,14208,0.0000,0,0,7.7625,0.0000,0,0,-0.0004,-0.01%,0.0000,2,2062,0,-1,0,0.0000,0.0000,2012-05-10 13:49:49,3","USDJPY0,USDJPY,    ,79.71,79.73,79.62,79.77,79.57,0,25489,0.00,0,0,79.71,0.00,0,0,-0.09,-0.11%,0.00,1,4307,0,-1,-1,0.00,0.00,2012-05-10 13:50:13,3","USDCHF0,USDCHF,    ,0.9285,0.9287,0.9276,0.9289,0.9266,0,29637,0.0000,0,0,0.9285,0.0000,0,0,-0.0009,-0.10%,0.0000,1,4960,0,-1,1,0.0000,0.0000,2012-05-10 13:50:02,3","GBPUSD0,GBPUSD,    ,1.6134,1.6136,1.6138,1.6144,1.6121,0,20808,0.0000,0,0,1.6134,0.0000,0,0,0.0004,0.02%,0.0000,2,5381,0,-1,0,0.0000,0.0000,2012-05-10 13:50:04,3"];



//     view

crossRate.fill(datas);





//Repater    

function Repater(headerhtml,rowhtml,footerhtml) {

    var _this = this;

    var n = 0;

    _this.cache = [];

	_this.dic = {};

    _this.header = headerhtml;

    _this.row = rowhtml;

    _this.footer = '</table>';

    if (headerhtml) _this.header = headerhtml;

    if (rowhtml) _this.row = rowhtml;

    if (footerhtml) _this.footer = footerhtml;

    _this.set = function(tag, val) {

        this.dic[tag] = val;

    };



    _this.parse = function(dic) {

        var row = this.row,

                dic = dic || this.dic,

                re = /\{\$(\w+)(?:\[(\d+)\])?(?:\|(\w+))?\}/g,

                html;

        html = row.replace(re, function(a, b, c, d) {

            var val;

            if (typeof dic[b] == "undefined"){

                return b;

            }

            if (dic[b].constructor == Array) {

                val = dic[b][c];

            } else {

                val = dic[b];

            }

            if (Repater[d] || window[d]) {//   

                val = (Repater[d] || window[d])(val);

            }

            return val;

        });

        _this.cache[n++] = html;

        return html;

    };



    _this.toHTML = function(args) {

        var cache = _this.cache,

            result;

        _this.cache = [];

        n = 0;

        result = _this.header + cache.join("") + _this.footer;

        for (i in args) {

            if (args.hasOwnProperty(i)) {

                result = result.replace("{$"+i+"}", args[i]);

            }

        }

        return result;

    };

}



</script>

</body>

</html>