Javascript最简单的模板引擎
非常简单,性能估计一般,方法最原始。
//第一代模板引擎
//只支持{{key}}的替换,不支持语句
//支持Object和Array对象
function template_setdata(template, data) {
try {
if (!!data && '[object Array]' == Object.prototype.toString.call(data)) {//数组
var out = '';
for (var obj in data) {
var tempout = template;
for (var key in data[obj]) {
tempout = tempout.replace(/\{\{(\S+)\}\}/g,
function (m, i, j) {
return (data[obj])[i];
});
}
out += tempout;
}
return out;
}
else if(!!data && '[object Object]' == Object.prototype.toString.call(data)){//对象
for (var key in data) {
template = template.replace(/\{\{(\S+)\}\}/g,
function (m, i, j) {
return data[i];
});
}
return template;
}
else{//不做处理
return template;
}
} catch (e) {
console.log(e);
return template;
}
}
//使用方法:
/*
html页面的模板:
<script type="text/template" id="template_info_content">
<section class="m_article m_list_item m_list_article clearfix">
<a href="{{url}}">
<div class="m_article_img">
<img src="{{img}}" onerror="$(this).attr('src',$ViewBag.ThemeContent+'img/article/article_img1.jpg');">
</div>
<div class="m_article_info">
<div class="m_article_title">
<span>{{title}}</span>
</div>
<div class="m_article_desc clearfix">
<div class="m_article_desc_l">
<span class="m_article_channel">{{classname}}</span>
<span class="m_article_time">{{time}}</span>
</div>
<div class="m_article_desc_r">
<div class="left_hands_desc">
<span class="read_icon"></span>{{pv}}
</div>
</div>
</div>
</div>
</a>
</section>
</script>
替换语句:
var setdata = {
img: '图片',
url: '地址',
title: '标题',
classname: '类别名',
time: '时间',
pv: '点击数'
};
var outhtml = template_setdata($('#template_info_content').html(),setdata);
console.log('单对象'+outhtml);
var setdatas =[{
img: '图片1',
url: '地址1',
title: '标题1',
classname: '类别名1',
time: '时间1',
pv: '点击数1'
},{
img: '图片2',
url: '地址2',
title: '标题2',
classname: '类别名2',
time: '时间2',
pv: '点击数2'
}];
var outhtml2 = template_setdata($('#template_info_content').html(),setdatas);
console.log('数组'+outhtml2);
第二代模板引擎,支持语法
参考:
http://ejohn.org/blog/javascript-micro-templating/
http://www.cnblogs.com/dolphinX/p/3489269.html
实现如下:
//第二代模板引擎
//支持语句,不支持key的替换,全部采用对象进行赋值
function template2_setdata(template, data) {
var html=template;
/*
<#=xxx#> => ');p.push(xxx);p.push('
<# => ');
#> => p.push('
* */
var result="var p=[];with(obj){ p.push('"
+html.replace(/[\r\n\t]/g," ")//换行去掉
.replace(/<#=(.*?)#>/g,"');p.push($1);p.push('")//<#=xxx#> => ');p.push(xxx);p.push('
.replace(/<#/g,"');")//<# => ');
.replace(/#>/g,"p.push('")//#> => p.push('
+" ');}return p.join('');";
var func = new Function('obj',result);
return func(setdatas);
}
/*
使用方法:
html页面模板:
<script type="text/template" id="template2_info_content">
<ul>
<# for ( var i = 0; i < setdatas.length; i++ ) { #>
<li><a href="<#=setdatas[i].url#>"><#=setdatas[i].title#></a></li>
<# } #>
</ul>
</script>
替换语句:
var setdatas =[{
img: '图片1',
url: '地址1',
title: '标题1',
classname: '类别名1',
time: '时间1',
pv: '点击数1'
},{
img: '图片2',
url: '地址2',
title: '标题2',
classname: '类别名2',
time: '时间2',
pv: '点击数2'
}];
var outhtml3 = template2_setdata($('#template2_info_content').html(),setdatas);
console.log(outhtml3);
* */
源码:https://github.com/easonjim/JavascriptTemplateEngine
bug提交:https://github.com/easonjim/JavascriptTemplateEngine/issues
Javascript最简单的模板引擎的更多相关文章
- Javascript:自己写模板引擎
背景 因为JS没有提供“字符串插入”和“多行字符串”特性,传统的拼凑字符串容易出错.性能不高和不容易理解代码,为了应对这些问题,很多个人和团队开发了模板引擎,现在主流的JS框架几乎都提供此类功能了. ...
- 自定义简单的模板引擎-JS模板引擎
http://www.cnblogs.com/52fhy/p/5393673.html
- JavaScript模板引擎实例应用
在之前的一篇名为<移动端基于HTML模板和JSON数据的JavaScript交互>的文章中,我向大家说明了为什么要使用JavaScript模板以及如何使用,文末还提到了laytpl.art ...
- JavaScript模板引擎
JavaScript模板引擎实例应用 在之前的一篇名为<移动端基于HTML模板和JSON数据的JavaScript交互>的文章中,我向大家说明了为什么要使用JavaScript模板以及 ...
- 10 个强大的JavaScript / jQuery 模板引擎推荐
模板引擎是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档.由于在开发过程中,网站或应用程序的界面与数据实现分离,大大提升了开发效率,良好的设计也使得代码重用变得更加容易. 本文 ...
- JavaScript模板引擎实例应用(转)
本文将举实例向大家讲解几个常用模板引擎的简单使用. 演示地址:模板引擎示例http://demo.52fhy.com/jstemp/ 准备工作 演示数据:blog.json结构: { "li ...
- Javascript模板引擎插件收集
为什么要用JS的模板引擎,打个比方,如果你要通过接口绑定数据,最终要加进去DOM中,我们普遍的做法就是不断的+,最终append进去,但是这样的做法就是后续人员压根就没法维护.所以这时模板引擎出来了. ...
- php实现简单视图模板(视图引擎)
视图 视图,你所看见的部分. <?php echo 'hello, world'; 从简单开始理解 这就是个视图文件中的代码,没错就这么简单.视图,实际上是在 MVC 这种架构上提出的.MVC ...
- Node.js模板引擎的深入探讨
每次当我想用 node.js 来写一个 web 相关项目的时候.我总是会陷入无比的纠结.原因是 JavaScript 生态圈里的模板引擎实在太多了,但那么多却实在找不出一个接近完美的,所谓完美的概念就 ...
随机推荐
- 阶段一:用Handler和Message实现计时效果及其中一些疑问
“阶段一”是指我第一次系统地学习Android开发.这主要是对我的学习过程作个记录. 本来是打算继续做天气预报的优化的,但因为某些原因,我要先把之前做的小应用优化一下.所以今天就插播一下用Handle ...
- iOS - GitHub干货分享(APP引导页的高度集成 - DHGuidePageHUD - ②)
距上一篇博客"APP引导页的高度集成 - DHGuidePageHUD - ①"的发布有一段时间了, 后来又在SDK中补充了一些新的内容进去但是一直没来得及跟大家分享, 今天来跟大 ...
- IOS开发基础知识碎片-导航
1:IOS开发基础知识--碎片1 a:NSString与NSInteger的互换 b:Objective-c中集合里面不能存放基础类型,比如int string float等,只能把它们转化成对象才可 ...
- IOS开发基础知识--碎片49
1:iOS项目配置文件info.plist文件解析 Localization native development region本地化 Executable file可执行文件路径 Bundle id ...
- 如何禁止内部viewPager滑动
众所周知,viewPager是能够滑动的,但有时候我们需要禁止它的滑动(微笑地面对*----*). 情况是这样的: activity中有一个viewPager,viewPager中加入3个Fragme ...
- iOS---关于UIWebView
1.加载的web界面可以自由收缩 webView.scalesPageToFit = YES;
- swift学习笔记3——类、结构体、枚举
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- RemodelanyWhere11.0.2673版本下载
百度云盘链接:http://pan.baidu.com/s/1geL5lez 密码:hisq 原文转载至:http://blog.sun0816.com/13623.html
- css实现网页表格
一. 准备工作 1. 点击此下载 相关文件 二. 在浏览器中运行 table.html 文件,即可看到效果 三. 效果图
- linux的七大运行级别及级别修改
运行级别 级别说明 0 所有进程将被终止,机器将有序的停止,关机时系统处于这个运行级别 1 单用户模式,用于系统维护,只有少数进程运行,同时所有服务也不 ...