早上写得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>
简易模板引擎实现

被折叠的 条评论
为什么被折叠?



