【简介】 template.js 一款 JavaScript模板引擎,简单,好用。提供一套模板语法,用户可以写一个模板区块,每次根据传入的数据,生成对应数据产生的HTML片段,渲染不同的效果。 分为原生语法和简洁语法,本文主要是讲简洁语法。 【语法】 1.使用 引用简洁语法的引擎版本,例如: <script src="dist/template.js"></script> 2. 表达式 {{ 与 }} 符号包裹起来的语句则为模板的逻辑表达式。 3. 输出表达式 对内容编码输出: {{content}} 不编码输出: {{#content}} 编码可以防止数据中含有 HTML 字符串,避免引起 XSS 攻击。 示例 [JavaScript] 纯文本查看 复制代码 <div id="demo"></div>
<script type="text/html" id="demo_tmpl">
{{content}}
</script>
<script src="./js/template.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
var obj = {
content: "<h1>哈哈</h1>"
};
document.getElementById("demo").innerHTML = template("demo_tmpl", obj);
</script> 效果 如果上面的模板修改为 [JavaScript] 纯文本查看 复制代码 <script type="text/html" id="demo_tmpl">
{{#content}}
</script> 则效果为: 4. 条件表达式 [JavaScript] 纯文本查看 复制代码 {{if admin}}
<p>admin</p>
{{else if code > 0}}
<p>master</p>
{{else}}
<p>error!</p>
{{/if}} 5. 遍历表达式 无论数组或者对象都可以用 each 进行遍历。 [JavaScript] 纯文本查看 复制代码 {{each list as value index}}
<li>{{index}} - {{value.user}}</li>
{{/each}}
亦可以被简写:
{{each list}}
<li>{{$index}} - {{$value.user}}</li>
{{/each}} 6. 辅助方法 使用template.helper(name,callback)注册公用辅助方法: template.helper('dateFormat', function(date, format) { //.. return value; }); 模板中使用的方式: {{time | dateFormat:'yyyy-MM-dd hh:mm:ss'}} 支持传入参数与嵌套使用: {{time | say:'cd' | ubb | link}} 【示例一】 常规的遍历数组 [HTML] 纯文本查看 复制代码 <!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>basic-demo</title>
<script src="../dist/template.js"></script>
</head>
<body>
<div id="content"></div>
<script id="test" type="text/html">
{{if isAdmin}}
<h1>{{title}}</h1>
<ul>
{{each list as value i}}
<li>索引 {{i + 1}} :{{value}}</li>
{{/each}}
</ul>
{{/if}}
</script>
<script>
var data = {
title: '基本例子',
isAdmin: true,
list: ['文艺', '博客', '摄影', '电影', '民谣', '旅行', '吉他']
};
var html = template('test', data);
document.getElementById('content').innerHTML = html;
</script>
</body>
</html> 【效果一】 【效果二】 使用子模板 [HTML] 纯文本查看 复制代码 <!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>include-demo</title>
<script src="../dist/template.js"></script>
</head>
<body>
<div id="content"></div>
<script id="test" type="text/html">
<h1>{{title}}</h1>
{{include 'list'}}
</script>
<script id="list" type="text/html">
<ul>
{{each list as value i}}
<li>索引 {{i + 1}} :{{value}}</li>
{{/each}}
</ul>
</script>
<script>
var data = {
title: '嵌入子模板',
list: ['文艺', '博客', '摄影', '电影', '民谣', '旅行', '吉他']
};
var html = template('test', data);
document.getElementById('content').innerHTML = html;
</script>
</body>
</html> 【效果二】 【示例三】 template.helper的使用 [HTML] 纯文本查看 复制代码 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>template.helper</title>
</head>
<body>
<!--数据容器-->
<div id="content"></div>
<script id="test" type="text/html">
{{time | dateFormat:'yyyy年 MM月 dd日 hh:mm:ss'}}
</script>
<script src="./js/template.js"></script>
<script>
template.helper('dateFormat', function (date, format) {
date = new Date(date); //新建日期对象
/*日期字典*/
var map = {
"M": date.getMonth() + 1, //月份
"d": date.getDate(), //日
"h": date.getHours(), //小时
"m": date.getMinutes(), //分
"s": date.getSeconds(), //秒
"q": Math.floor((date.getMonth() + 3) / 3), //季度
"S": date.getMilliseconds() //毫秒
};
/*正则替换*/
format = format.replace(/([yMdhmsqS])+/g, function(all, t){
var v = map[t];
if(v !== undefined){
if(all.length > 1){
v = '0' + v;
v = v.substr(v.length-2);
}
return v;
}
else if(t === 'y'){
return (date.getFullYear() + '').substr(4 - all.length);
}
return all;
});
/*返回自身*/
return format;
});
/*数据*/
var data = {
time: (new Date).toString(),
};
/*渲染*/
var html = template('test', data);
/*绑定*/
document.getElementById('content').innerHTML = html;
</script>
</body>
</html> 【效果三】
|