Javascript Template
javascript 模板函数分享
/*****
模板字符串,格式为或,或
完全遵循javascript语法,内置输出函数为echo(string);函数
常用调用例子,可以用 如果下方法.
js_template(document.getElementById(‘template_code’).value,{names:[‘tom’,’jerry’,’david’]});
返回模板结合给定数据的结果字符串。
作者:浮山狼
邮箱:fushanlang@gmail.com
若使用中遇到问题,欢迎交流、切磋!
*/
function js_template(template_string, values_container) {
var eval_result = "";
/**模板输出结果**/
//公共的输出函数
var echo = function (output) {
eval_result += output;
}
//产生随机数,为建立唯一临时分隔做铺垫
var randNum = function () {
var rnd = {};
rnd.today = new Date();
rnd.seed = rnd.today.getTime();
rnd.seed = (rnd.seed * 9301 + 49297) % 233280;
return rnd.seed / (233280.0);
}
var split_str = '_{' + randNum() + '}_';
/*唯一分隔标志字符串*/
/*消除换行符*/
var eval_str = template_string.replace(/\n|\r|\t/g, "");
/*匹配第一个标签,并将其转为第二个标签形式*/
eval_str = eval_str.replace(/<\?js(.*?)\?>/g, function ($0, $1) {
return "" + $1 + "<\/js>";
});
eval_str = eval_str.replace(/<js(.*?)\?>/g, function ($0, $1) {
return "" + $1 + "<\/js>";
});
var eval_str_js_array = new Array();
/*匹配第二个标签 ...--并且返回唯一分隔串,并将匹配的js代码放入eval_str_js_array中备用*/
eval_str = eval_str.replace(/(.*?)<\/js>/g, function ($0, $1) {
eval_str_js_array.push($1);
return split_str;
});
/*用唯一分隔标志串分隔得到普通非js串的数组*/
var eval_str_array = eval_str.split(split_str);
eval_str = "";
/**0101010---0为eval_str_array[]元素,1为eval_str_js_array---重新连接为eval_str消除单引号,双引号引起的问题。**/
for (var i = 0; i < eval_str_js_array.length; ++i) {
eval_str += 'echo(eval_str_array[' + i + ']);';
eval_str += eval_str_js_array[i];
}
eval_str += 'echo(eval_str_array[' + eval_str_js_array.length + ']);';
try {
/*遍历模板变量容器,并重新建立变量*/
if (values_container) {
for (var i in values_container) {
eval('var ' + i + ' =values_container[i];');
}
}
/**执行总的js字符串得到处理结果**/
eval(eval_str);
var error_flag = false;
}
catch (error) {
error_flag = true;
} finally {
return eval_result;
}
}
最新评论