`
katelin
  • 浏览: 30656 次
  • 性别: Icon_minigender_2
  • 来自: 厦门
社区版块
存档分类
最新评论

简单的Template

阅读更多

早上写得1个Template得简单实现。但现在只能实现变量插入,函数调用。想加入if else 判断 for循环,但是正则表达式只是半桶水。没办法做下去。如果能有人补充下去就好了。无比感谢。

 

 <script LANGUAGE="JavaScript">
  <!--	
	
	Date.prototype.format = function(format){
	  var o = {
		"M+" : this.getMonth()+1, //month
		"d+" : this.getDate(),    //day
		"h+" : this.getHours(),   //hour
		"m+" : this.getMinutes(), //minute
		"s+" : this.getSeconds(), //second
		"q+" : Math.floor((this.getMonth()+3)/3),  //quarter
		"S" : this.getMilliseconds() //millisecond
	  }
	  if(/(y+)/.test(format)) {
		format=format.replace(RegExp.$1,(this.getFullYear()+"").substr(4 - RegExp.$1.length));
	  }
	  for(var k in o){
		  if(new RegExp("("+ k +")").test(format)){
			format = format.replace(RegExp.$1,RegExp.$1.length==1 ? o[k] : ("00"+ o[k]).substr((""+ o[k]).length));
		  }
	  }
	  return format;
	};

	function formatDate(date, format){
		var yr = date.substring(0,4);
		var mh = date.substring(4,6);
		var dy = date.substring(6,8);
		var d = new Date();

		d.setYear(yr);
		d.setMonth(mh-1);
		d.setDate(dy);
		
		return d.format(format);
	}

	function formatMoney(prefix, amount){
		return prefix + amount;
	}

	function add(a,b){
		return a+b;
	}

	function multiply(a,b){
		return a*b;
	}
	
	var tplText = [
		' attr1: ${attr1}\n', 
		' attr2.attr21: ${attr2.attr21}\n',
		' test date : #formatDate(${date}, \'yyyy-MM-dd\') \n', 
		' test currency: #formatMoney("Y",1000)\n',
		' test add : #add(${num1},${num2})\n',
		' test multiply : #multiply(#add(30,40), #add(2,3))\n'
	].join();

	var root = {
		attr1 : 'val1',
		attr2 : {
			'attr21' : 'val21'
		},
		date : '20080812',
		num1 : 10,
		num2 : 20
	}

	function Template(tpl){
		this.tpl = tpl;
		this.throwUndefError = false;
	}

	Template.prototype = {
		apply : function(dataModel){
			var _freg = /#[a-zA-Z0-9]+\(([^\(\)]*)\)/g;			
			var _vreg = /\$\{([a-zA-Z0-9\.]+)\}/g;

			var _root = dataModel;
			var fn;
			var _msg = [], _isMsg = this.throwUndefError;

			while(this.tpl.match(_freg)){
				this.tpl = this.tpl.replace(_freg, function(){
					fn = arguments[0];
					fn = fn.replace(_vreg, function(){
						var _value = eval('_root.'+arguments[1]);					
						if(_value){						
							if( 'string' == typeof _value ){
								return '\''+eval('_root.'+arguments[1]) +'\'';
							} else {
								return _value;
							}
						} else if(_isMsg){
							_msg.push(arguments[1]+' unexist!');
						}
					});
					fn = fn.substring(1);
					return eval(fn);
				});
			}
			
			this.tpl = this.tpl.replace(_vreg, function(){ 
				var _value = eval('_root.'+arguments[1]);
				if(_value){
					return eval('_root.'+arguments[1]);
				} else if(_isMsg){
					_msg.push(arguments[1]+' unexist!');
				}
			});

			
			if( 0 != _msg.length){
				alert('Error:\n'+_msg.join('\n'));
			}			
			return this.tpl;
		}
	}
	
	var tpl = new Template(tplText);
	alert(tpl.apply(root));

  //-->
  </script>

 

 

 

分享到:
评论
5 楼 kimmking 2009-03-31  
lzg3267373 写道
请教楼主 貌似你这个不能填充json数据啊

他传的 root  不就是json吗
4 楼 lzg3267373 2009-03-31  
请教楼主 貌似你这个不能填充json数据啊
3 楼 perfect 2009-02-05  
最近也在研究这个 ,希望能够交流
2 楼 achun 2008-08-17  
我也是研究javascript Template的爱好者。
Template 是数据和表现分离的不二法宝.
做BS,javascript Template 是模板的最强法宝。完美的和页面结合了。
我也经历了一些阶段,大致是
1.搜索已有的js Template
最有名的是JST了,其他的都过于简单不够强,或者是够强但是和JST大同小异。
但是JST的代码写的有大问题,
首先是很晦涩(当然是人家水平够高造成的)。
其次是用了太多的正则,这个在大Template了严重的影响了速度,特别是在IE下。
最大的问题是使用的不灵活,受限制,这个就不细说了,因为每个人的用法都有自己的习惯,反正我写程序的习惯适应不了JST.
2.自己摸索阶段
就像楼主现在一样,
函数调用很简单就可以实现
if while for ..语法逐条的去实现,真是繁琐
变量的插入也费了不少力气
特别是Template文法定义费了很大的力气,因为要定义一个安全的,在各种情况下(xhtml,xml,html,浏览器兼容)都能正常工作的文法,真的很麻烦。不细说了,因为已经有了结论
3.终极认识
虽然我在第2阶段也完成了Template的完全设计,不过回头看看代码,
所有的javascript语法都重新包装了一下,太笨拙了,就不能简单些嘛?
于是我就有了现在的jCT 3 的设计。
jCT 就是 javascript common templates 的缩写。经历的过程可以从源码看出
http://jsct.googlecode.com/svn/trunk/jCT/
jct1.js  第1版
jct2.js  第2版
jct.js   第3版 终极版,这个理念真的是到头了。

为什么说是终极?其实一直到第3版完成,我自己也没有认为是终极的感觉。可是有一天我突然发现:
jCT 3的方法和php,asp,jsp嵌入脚本的方法完全一样。
jCT 3完全就是一个嵌入式javascript(废话javascript从某种观点来说就是嵌入html的语言)的前台脚本编译器。

看看下面的相关连接吧.
http://code.google.com/p/jsct/
http://achun.iteye.com/category/33268

要让我自己评价的话,jCT设计的特色有:
1.javascript 前台脚本编译器:应该插入 模板 两个字,javascript 前台模板脚本编译器更严谨,不过读起来不顺
完全把原javascript语法不动的写法融入到模板中。这意味着于javascript可以无缝的结合,所有javascript的语法jCT全部都支持。
2.子模板对象:也就是jCT 2 里说的存储模板了,其实到 jCT 3 的时候存储模板这个词已经不合适了,应该叫子模板对象
3.取值表达式:就是这个符号
+--+
看上去也许怪异,可是几乎在任何时候都不会有二义性,和兼容性问题的。这个我也不细说了,因为我使用的方法太少见了。{}的定义方法直接和我的使用方法有冲突,这也是我最开始为什么下决心要自己写模板的原因。
4.高度可制定:这个还是看实例吧。
1 楼 jindw 2008-08-13  
给个建议:把现在的格式化函数优化一下:
http://hi.baidu.com/jindw/blog/item/76d36f3e693f233871cf6c64.html

相关推荐

    简单的template的js模板

    这里的"简单的template的js模板"就是一个这样的工具,它提供了一种优雅的方式来处理动态数据,比传统的字符串拼接方式更高效、更易读。 模板引擎的基本原理是通过特殊的语法(如Mustache风格的`{{ }}`或者EJS的`...

    artTemplate模板引擎

    总之,ArtTemplate是一款优秀的JavaScript模板引擎,它凭借其出色的性能、安全的渲染方式和简单易用的特性,成为了前端开发者的得力工具。无论是在小型项目还是大型复杂应用中,都能看到ArtTemplate的身影。

    spring-data使用mongodbTemplate对MongoDB进行读写操作

    Spring Data MongoDB是一个强大的Java库,它为开发人员提供了一种简单的方式来访问和操作MongoDB数据库。这个库是Spring Data框架的一部分,旨在简化数据访问层的实现,尤其在使用NoSQL数据库如MongoDB时。MongoDB...

    模板化工具arttemplate

    - **循环语句**:除了简单的`for`循环,还支持`each`循环,如`, index %&gt;`。 - **函数调用**:在`{{ }}`中可以调用自定义函数,处理复杂逻辑。 - **模板继承和部分**:通过`&lt;%- %&gt;`引入其他模板或部分,实现模板...

    template-web.zip

    1. **数据绑定**:`template-web`允许开发者通过简单的语法将JavaScript对象中的数据绑定到HTML模板中,当数据变化时,页面会自动更新,实现了视图和模型的同步。 2. **模板语法**:`template-web.js`文件中包含了...

    lua-resty-template

    而lua-resty-template和大多数模板引擎是类似的,大体内容有: 模板位置:从哪里查找模板; 变量输出/转义:变量值输出...其他:lua-resty-template还提供了不需要解析片段、简单布局、可复用的代码块、宏指令等支持。

    artTemplate

    4. **简单API**: artTemplate 的API设计简洁,包括`template.compile`用于编译模板,`template.render`用于渲染数据,以及`template.helper`用于自定义辅助函数等。 5. **社区支持**: 虽然artTemplate相对较小,但...

    artTemplate小实例.zip

    总结,`artTemplate`作为一款高效的前端模板框架,通过简单的模板语法和预编译机制,降低了前端开发的复杂性,提升了页面性能。结合实例,我们理解了如何编写、预编译和使用`artTemplate`,这有助于我们在实际项目中...

    template.js模板

    在这个例子中,我们创建了一个简单的模板,用于循环显示数据数组`items`的内容。通过`template.compile()`编译模板后,用`data`渲染并将其结果插入到ID为`list`的`&lt;ul&gt;`元素中。 **模板引擎的比较与选择** `...

    运用Jquery插件Json2Template写的简单项目

    在本文中,我们将深入探讨如何使用Jquery插件Json2Template进行项目开发。Json2Template是一款基于jQuery的库,它允许开发者将JSON数据动态渲染为HTML模板,极大地提高了前端界面的数据展示效率。在学习和应用这个...

    vue-admin-template-master-3.8.0.zip

    Vue.js的设计思想是让开发变得更加简单,同时保持了高性能。Vue-admin-template是一个基于Vue.js的后台管理模板,它提供了丰富的功能和组件,便于快速搭建企业级的后台管理系统。 "vue-admin-template-master-3.8.0...

    artTemplate匿名数组each的使用示例

    下面是一个简单的使用ArtTemplate匿名数组`each`的示例: 首先,我们需要引入ArtTemplate库,这里我们用的是`template-web.js`。在HTML文件(如`basic.html`)中,你可以这样引入: ```html &lt;script src="template-...

    模板化工具 -arttemplate

    1. **简洁的语法**:artTemplate的语法设计简单直观,例如`{{变量名}}`用于输出变量,`{{#each 数组}}...{{/each}}`用于遍历数组,`{{if 条件}}...{{else}}...{{/if}}`用于条件判断。 2. **高效的性能**:由于art...

    art_template.rar 模板引擎

    2. **简洁语法**:`art-template`提供了简单直观的模板语法,如`{{ }}`用于数据绑定,`{{#if}}`和`{{#each}}`用于条件和循环控制,使得开发者可以快速编写模板。 3. **分离关注点**:通过使用模板引擎,开发者可以...

    vue-admin-template基础模板的简单使用

    vue-admin-template基础模板的简单使用

    Eclipse Template与模式

    - **特点**:简单易懂,线程安全,但可能会造成资源浪费。 - **模板示例**: ```java private static final ${enclosing_type} m_instance = new ${enclosing_type}(); /** * 私有的默认构造子 */ private $...

    artTemplate4.x自定义函数.zip

    - **示例运行环境**:可能是一个简单的HTML页面,包含了必要的脚本引用和数据绑定。 通过学习这个实例,你可以了解如何在实际项目中使用ArtTemplate4.x自定义函数,提升模板的动态渲染能力。例如,你可以创建一个...

    前端项目-template7.zip

    2. **示例和教程**:可能包括`examples`目录,展示如何使用Template7的简单实例和说明文档。 3. **测试文件**:`tests`目录下的文件用于单元测试,确保模板引擎的功能正确无误。 4. **许可证文件**:`LICENSE`表明...

    artTemplate 模版

    `artTemplate` 的设计理念是提供一种简单、高效的模板编译方式,使得在客户端或者服务器端都能流畅地使用。 `artTemplate` 的核心功能包括: 1. **模板语法**:`artTemplate` 使用`&lt;% %&gt;`作为模板的起始和结束标识...

    artTemplate的两个js文件(原生+简洁)

    例如,一个简单的原生语法模板可能如下所示: ```html &lt;script id="template" type="text/html"&gt; {{each users}} &lt;li&gt;{{name}} - {{age}} {{/each}} ``` **三、简洁语法** 简洁语法是为了方便开发,对...

Global site tag (gtag.js) - Google Analytics