/**
* 模板解析器
* @param html
* @param options
* @returns
*/
function templateEngine(html, options) {
var re = /<!([^!>]+)?!>/g,
reExp = /(^( )?(if|for|else|switch|case|formatDate|break|{|}))(.*)?/g,
code = 'var r=[];\n',
cursor = 0;
var add = function(line, js) {
js ? (code += line.match(reExp) ? line + '\n' : 'r.push(' + line + ');\n') :
(code += line != '' ? 'r.push("' + line.replace(/"/g, '\\"') + '");\n' : '');
return add;
}
while (match = re.exec(html)) {
add(html.slice(cursor, match.index))(match[1], true);
cursor = match.index + match[0].length;
}
add(html.substr(cursor, html.length - cursor));
code += 'return r.join("");';
return new Function(code.replace(/[\r\t\n]/g, '')).apply(options);
}
-
使用示例
- 把需要渲染的dom提出来做模板
<script type="text/template" id="organ"> <! for (index in this){ !> <div class='contimgtext' data-systemid='<! this[index].systemId !>' data-organid='<! this[index].organId !>' onclick='func.selectApp("<!this[index].systemId!>","<!this[index].organId!>")'> <img src='static/img/doc.png' /> <span class='conttext'><! this[index].organName !></span> </div> <! } !> </script>
- 重新绘制dom
$('.cont').html(templateEngine($("#organ").html(), 数据项));