早上写得1个Template得简单实现。但现在只能实现变量插入,函数调用。想加入if else 判断 for循环,但是正则表达式只是半桶水。没办法做下去。如果能有人补充下去就好了。无比感谢。
<script LANGUAGE="JavaScript"> <!-- Date.prototype.format = function(format){ var o = { "M+" : this.getMonth()+1, //month "d+" : this.getDate(), //day "h+" : this.getHours(), //hour "m+" : this.getMinutes(), //minute "s+" : this.getSeconds(), //second "q+" : Math.floor((this.getMonth()+3)/3), //quarter "S" : this.getMilliseconds() //millisecond } if(/(y+)/.test(format)) { format=format.replace(RegExp.$1,(this.getFullYear()+"").substr(4 - RegExp.$1.length)); } for(var k in o){ if(new RegExp("("+ k +")").test(format)){ format = format.replace(RegExp.$1,RegExp.$1.length==1 ? o[k] : ("00"+ o[k]).substr((""+ o[k]).length)); } } return format; }; function formatDate(date, format){ var yr = date.substring(0,4); var mh = date.substring(4,6); var dy = date.substring(6,8); var d = new Date(); d.setYear(yr); d.setMonth(mh-1); d.setDate(dy); return d.format(format); } function formatMoney(prefix, amount){ return prefix + amount; } function add(a,b){ return a+b; } function multiply(a,b){ return a*b; } var tplText = [ ' attr1: ${attr1}\n', ' attr2.attr21: ${attr2.attr21}\n', ' test date : #formatDate(${date}, \'yyyy-MM-dd\') \n', ' test currency: #formatMoney("Y",1000)\n', ' test add : #add(${num1},${num2})\n', ' test multiply : #multiply(#add(30,40), #add(2,3))\n' ].join(); var root = { attr1 : 'val1', attr2 : { 'attr21' : 'val21' }, date : '20080812', num1 : 10, num2 : 20 } function Template(tpl){ this.tpl = tpl; this.throwUndefError = false; } Template.prototype = { apply : function(dataModel){ var _freg = /#[a-zA-Z0-9]+\(([^\(\)]*)\)/g; var _vreg = /\$\{([a-zA-Z0-9\.]+)\}/g; var _root = dataModel; var fn; var _msg = [], _isMsg = this.throwUndefError; while(this.tpl.match(_freg)){ this.tpl = this.tpl.replace(_freg, function(){ fn = arguments[0]; fn = fn.replace(_vreg, function(){ var _value = eval('_root.'+arguments[1]); if(_value){ if( 'string' == typeof _value ){ return '\''+eval('_root.'+arguments[1]) +'\''; } else { return _value; } } else if(_isMsg){ _msg.push(arguments[1]+' unexist!'); } }); fn = fn.substring(1); return eval(fn); }); } this.tpl = this.tpl.replace(_vreg, function(){ var _value = eval('_root.'+arguments[1]); if(_value){ return eval('_root.'+arguments[1]); } else if(_isMsg){ _msg.push(arguments[1]+' unexist!'); } }); if( 0 != _msg.length){ alert('Error:\n'+_msg.join('\n')); } return this.tpl; } } var tpl = new Template(tplText); alert(tpl.apply(root)); //--> </script>