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 生态圈里的模板引擎实在太多了,但那么多却实在找不出一个接近完美的,所谓完美的概念就 ...
随机推荐
- MyBatis的一系列问题的处理(遍历Map集合和智能标签和属性和字段不一样的解决办法 和sql片段)(三)
一.字段名与属性名(数据库的名字)不一样怎么办? 方案一:在小配置中配置一个resultMapper <!--方案一:resultMapper 字段名与属性名不一致 --> <res ...
- 设计模式之单例模式的简单demo
/* * 设计模式之单例模式的简单demo */ class Single { /* * 创建一个本类对象. * 和get/set方法思想一样,类不能直接调用对象 * 所以用private限制权限 * ...
- LightGallery.js – 功能齐全的 Javascript Lightbox
Lightgallery是一个轻量级的模块化.响应式的灯箱画廊,它允许您创建美丽的图像和视频画廊.借助缩略图插件的帮助,Lightgallery 允许您创建缩略图画廊.它支持触摸屏设备上滑动导航以及桌 ...
- jQ图片列表光标移动动画
本效果使用jQuery和CSS实现了图片列表,当鼠标移入时图片向左微动,移出则复原. 效果展示: http://hovertree.com/texiao/jquery/88/ 效果图如下: 其中的jQ ...
- react-echarts之折线图的显示
react中想要实现折线图和饼图的功能,需要引入react-echarts包,然后再实现折线图的功能.我这里引用的版本是:0.1.1.其他的写法参echarts官网即可.下面详细讲解的是我在react ...
- SharePoint 2010/2013/2016内容数据库与网站集的关系
总得来说,内容数据库和网站集的关系是: 一个内容数据库里可以有多个网站集,但是一个网站集只能存在于一个内容数据库. 那么问题来了 问题1:我能否在创建网站集时指定内容数据库呢?或者说我能在指定的内容数 ...
- Android中使用Notification实现普通通知栏(Notification示例一)
Notification是在你的应用常规界面之外展示的消息.当app让系统发送一个消息的时候,消息首先以图表的形式显示在通知栏.要查看消息的详情需要进入通知抽屉(notificationdrawer) ...
- webservice入门实例,CXF方式
1.下载CXF,及先关jar包. CXF 下载地址:http://cxf.apache.org/download.html,选择"File"列中的zip格式下载.解压后可以看到一些 ...
- 让你少走弯路的搭建树莓派的Net与NodeJS运行环境
树莓派是当前最火的嵌入计算平台没有之一,树莓派可以给我们无数的想象,树莓派的高性能.低功耗.低成本.可扩展性(最新的树莓派原生支持WIFI和蓝牙,这功能太赞了)深受大家的喜爱.虽然树莓派到目前为止 ...
- eclipse调试(debug)的时候,出现Source not found,Edit Source Lookup Path,一闪而过
问题描述 使用Eclipse调试代码的时候,打了断点,经常出现Source not found,网上找了半天,大部分提示点击Edit Source Lookup Path,添加被调试的工程,然而往往没 ...