js之:模板引擎
//引擎js文件
(function(){ var r = { open: "{{", close: "}}" }, c = { exp: function(e) { return new RegExp(e, "g") }, query: function(e, c, t) { var o = ["#([\\s\\S])+?", "([^{#}])*?"][e || 0]; return n((c || "") + r.open + o + r.close + (t || "")) }, escape: function(e) { return String(e || "").replace(/&(?!#?[a-zA-Z0-9]+;)/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/'/g, "'").replace(/"/g, """) }, error: function(e, r) { var c = "Laytpl Error:"; return "object" == typeof console && console.error(c + e + "\n" + (r || "")), c + e } }, n = c.exp, tpl = function(e) { this.tpl = e }; tpl.pt = tpl.prototype, window.errors = 0, tpl.pt.parse = function(e, t) { var o = this, p = e, a = n("^" + r.open + "#", ""), l = n(r.close + "$", ""); e = e.replace(/\s+|\r|\t|\n/g, " ").replace(n(r.open + "#"), r.open + "# ").replace(n(r.close + "}"), "} " + r.close).replace(/\\/g, "\\\\").replace(n(r.open + "!(.+?)!" + r.close), function(e) { return e = e.replace(n("^" + r.open + "!"), "").replace(n("!" + r.close), "").replace(n(r.open + "|" + r.close), function(e) { return e.replace(/(.)/g, "\\$1") }) }).replace(/(?="|')/g, "\\").replace(c.query(), function(e) { return e = e.replace(a, "").replace(l, ""), '";' + e.replace(/\\/g, "") + ';view+="' }).replace(c.query(1), function(e) { var c = '"+('; return e.replace(/\s/g, "") === r.open + r.close ? "" : (e = e.replace(n(r.open + "|" + r.close), ""), /^=/.test(e) && (e = e.replace(/^=/, ""), c = '"+_escape_('), c + e.replace(/\\/g, "") + ')+"') }), e = '"use strict";var view = "' + e + '";return view;'; try { return this.cache = e = new Function("d, _escape_", e), e(t, c.escape) } catch (u) { return delete this.cache, c.error(u, p) } }, tpl.pt.render = function(e, r) { var n; return e ? (n = this.cache ? this.cache(e, c.escape) : this.parse(this.tpl, e), r ? void r(n) : n) : c.error("no data") }; var o = function(e) { return "string" != typeof e ? c.error("Template not found") : new tpl(e) }; o.config = function(e) { e = e || {}; for (var c in e) r[c] = e[c] } tplEngine = o }())
//页面调用方法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> <script type="text/javascript" src="tpls.js"></script> </head> <body> <script type="text/html" id="demo"> <h3>{{ d[0].title }}</h3> <ul> {{# for(var i=0,item;item=d[0].list[i];i++){ }} <li> <span>{{ item.modname }}</span> <span>{{ item.alias }}:</span> <span>{{ item.site || '' }}</span> </li> {{# }; }} {{# if(d[0].list.length === 0){ }} 无数据 {{# } }} </ul> <div> {{# for(var i=0,item;item=d[1][i];i++){ }} <div>{{item}}</div> {{# } }} </div> </script> <div id="view"></div> <script type="text/javascript"> var data = { //数据 "title":"常用模块" ,"list":[{"modname":"弹层","alias":"21321321","site":"www.baidu.com"},{"modname":"表单","alias":"form"}] } var test = [1,2,3]; var getTpl = demo.innerHTML ,view = document.getElementById('view'); tplEngine(getTpl).render([data,test], function(html){ view.innerHTML = html; }); </script> </body> </html>