`
jj7jj7jj
  • 浏览: 50329 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

javascript 视图模板

 
阅读更多
任务原因,下周要实现一个模块,为了能提高效率,我做了一个通用工具类,其实也是在原基础上改的

以前的版本支持${..}这种样子的替换 比如
<div style="display:${display}">...
替换为
<div style="display:none">...

有些比如时间格式化和判断之类就必须在代码处理好了之后在将值传给模板,但格式化和判断逻辑基本都是一致的,于是我想这些直接通过视图模板就处理好些问题

$date:时间格式化
<span>$date{day,YY MM DD}</span>
替换为
<span>11 11 11</span>

$pick:三目运算
<span>$pick{age,25,好年轻,好老啊}</span>
替换为(age = 24)
<span>好年轻</span>

模板如果想处理更灵活,需要对嵌套的情况做下处理 比如:

<span>$pick{age,${age2},${msg1},${msg2}}</span>
替换为(age = 24,age2 = 25 , msg1 = 好年轻 ,msg2 = 好老啊)
<span>好年轻</span>

有时候模板需要过滤掉${..},可能真正输出就是这种格式,怎么办?加上"\\"
<span>$pick{age,${age2},\\${msg1},${msg2}}</span>
替换为(age = 24,age2 = 25 , msg1 = 好年轻 ,msg2 = 好老啊)
<span>${msg1}</span>


function extends(objOld,objNew){
    for(var n in objNew){
        if(objNew.hasOwnProperty(n)){
            objOld[n] = objNew[n];
        }
    }
}

Template = function(){
	this.initialize(arguments[0]);
};
Template.prototype = {
	initialize: function (template,opt) {
		this.template = template + '';
		//对\\进行过滤
		this.filter = "\\\\";
		//format:arguments[3],arguments[4]
		//pic:arguments[5],arguments[6],arguments[7],arguments[8]
		//defalut:arguments[9]
        //获取参数 
		this.regPattern = /(^|[\s\S])(\$date\{([^,]*?),([^}]*?)\}|\$pick\{([^,]*?),([^,]*?),([^,]*?),([^}]*?)\}|\$\{([^}]*?)\})/g;
        //是否嵌套
		this.isNesting = /(?:^|[\s\S])\$[^{]*?\{[^}]*?(?=\$[^{]*?\{[^}]*?\})/g;
        extends(this,opt);
	},
	evaluate: function (obj) {
		var _template = "";
		if (typeof obj == "object") {
			var _this = this;

			_template = this.template.replace(this.regPattern, function (s, v1, v2) {
				if(_this.isNesting.test(s)){
					for(var i = arguments.callee.length ;  i < arguments.length - 2 ;i ++){
						if(arguments[i]){
							arguments[i] = arguments[i].replace(_this.regPattern, arguments.callee);
						}
					}
				}

				if(new RegExp("^" + _this.filter,"").test(v1)){
					return v1 + v2;
				}else{
					if(/^\$\{/.test(v2)){
						return v1 + (obj[arguments[9]] || "");
					}
					if(/^\$date\{/.test(v2)){
						//2011-08-26 16:10:06
						return v1 + (obj[arguments[3]] ? _this._date_format(obj[arguments[3]],arguments[4]) : "");
					}
					if(/^\$pick\{/.test(v2)){
						return v1 + (obj[arguments[5]] ? (obj[arguments[5]] == arguments[6] ? arguments[7] : arguments[8]) : "");
					}
				}
			});
		}
		return _template;
	},
	//YY/YYYY MM DD hh mm ss
	_date_format : function(datestr,reg){
		var tmp = datestr.split(" ");
		var ymd = tmp[0];
		var hms = tmp[1];
		tmp = ymd.split("-");
		var Y = tmp[0];
		var M = tmp[1];
		var D = tmp[2];
		tmp = hms.split(":");
		var h = tmp[0];
		var m = tmp[1];
		var s = tmp[2];

		reg = reg || "hh:mm:ss";
	
		/\bss\b/.test(reg) && (reg = reg.replace(/\bss\b/,s));
		/\bmm\b/.test(reg) && (reg = reg.replace(/\bmm\b/,m));
		/\bhh\b/.test(reg) && (reg = reg.replace(/\bhh\b/,h));
		/\bMM\b/.test(reg) && (reg = reg.replace(/\bMM\b/,M));
		/\bDD\b/.test(reg) && (reg = reg.replace(/\bDD\b/,D));
		/\bYYYY\b/.test(reg) && (reg = reg.replace(/\bYYYY\b/,Y));
		/\bYY\b/.test(reg) && (reg = reg.replace(/\bYYYY\b/,Y.substring(2)));
		
		return reg;
	}
};

var str2 = '$date{ddd,mm:ss}asdfjakjsdlkfjkl<<><{}werwesdf$ {} sdfer $${display} $pick{vid,${vid},11,22}';


var t = new Template(str2);
var respance = t.evaluate({vid:"123123123",ddd:"2011-08-26 16:10:06",display:"true"});
alert(respance);

//更改前:
//$date{ddd,mm:ss}asdfjakjsdlkfjkl<<><{}werwesdf$ {} sdfer $${display} $pick{vid,${vid},11,22}
//更改后:
//10:06asdfjakjsdlkfjkl<<><{}werwesdf$ {} sdfer $true 11



需要修改过滤字符new Template(str2,{filter:"$"})

this.regPattern可以分为三段来看
\$\{([^}]*?)\}
    处理最普通的情况${...}
\$pick\{([^,]*?),([^,]*?),([^,]*?),([^}]*?)\}
    处理三目运算,里面获取4个参数
\$date\{([^,]*?),([^}]*?)\}
    处理时间格式化,获取里面2个参数
(^|[\s\S])
    [\s\S] 匹配任意字符,包含\r,\t ,还包括开头

这正则干了这么两件事:
     1)获取$前面的一个字符,如果是开头则不取,用来判断是否过滤
     2)获取普通,时间格式化,三目运算的参数

扩展:
     添加对应正则,添加对应的处理策略


2
2
分享到:
评论
4 楼 jj7jj7jj 2011-09-05  
achun 写道
jj7jj7jj 写道
achun 写道
推荐博主看下我写的jCT,专题地址
http://achun.iteye.com/category/33268
关键是推荐jCT的思路,既然是js模版
为了减省成本和条提高通用性,首先采用原生js语法。
为了实现原生js语法的模版,参考了服务器端脚本php的方法,
也就是完成html和js混合的支持文法。通过简单的解析转换,
把这种混合文法转换成js文件就完成了js模版的设计。
jCT里面除了实现了这个想法,还做了写代码逻辑上的处理。这使得jCT代码的复杂度提高了。
如果只是要实现一个简单的js模版,强烈建议博主采用html和原生js混合的方案,实现起来非常简单。


achun你好,JCT对我的项目可能暂时还用不上,因为模板只是我们里面的一个小工具类,只需要将获取json对象替换掉模板上标记的元素就行了,还有一句话不太明白“采用html和原生js混合的方案”是指在模板里面直接支持写SCRIPT脚本吗?

jCT关键的地方就是模仿了php的脚本方式,php天生就是个脚本,可以随时嵌入其他文本,比如html,jCT这样模仿也是经历了一个过程,最后醒悟,这就是所谓的“采用html和原生js混合的方案”了。jCT仅仅是对此进行了翻译和做了些逻辑上的支持而已。这样就全部都是原生的了,原生的好处是:没有附加的学习成本。比如:$date{day,YY MM DD}这样的定义,首先你要不停的升级你的模版,然后用的人还要不停的看文档,如果是
<span><? date('YMD'); ?></span>,那这都是原生的js,成本就不同了。



呵呵 可能我跟阁下接触的脚本不一样,我最开始是使用的jsp里面的jstl,当时用挺爽的,这模板实际是为了项目需求定制化的一个,您上次和我说的内容,给了我不少灵感,万分感谢,jct等我忙了,我会仔细拜读~~
3 楼 achun 2011-09-05  
jj7jj7jj 写道
achun 写道
推荐博主看下我写的jCT,专题地址
http://achun.iteye.com/category/33268
关键是推荐jCT的思路,既然是js模版
为了减省成本和条提高通用性,首先采用原生js语法。
为了实现原生js语法的模版,参考了服务器端脚本php的方法,
也就是完成html和js混合的支持文法。通过简单的解析转换,
把这种混合文法转换成js文件就完成了js模版的设计。
jCT里面除了实现了这个想法,还做了写代码逻辑上的处理。这使得jCT代码的复杂度提高了。
如果只是要实现一个简单的js模版,强烈建议博主采用html和原生js混合的方案,实现起来非常简单。


achun你好,JCT对我的项目可能暂时还用不上,因为模板只是我们里面的一个小工具类,只需要将获取json对象替换掉模板上标记的元素就行了,还有一句话不太明白“采用html和原生js混合的方案”是指在模板里面直接支持写SCRIPT脚本吗?

jCT关键的地方就是模仿了php的脚本方式,php天生就是个脚本,可以随时嵌入其他文本,比如html,jCT这样模仿也是经历了一个过程,最后醒悟,这就是所谓的“采用html和原生js混合的方案”了。jCT仅仅是对此进行了翻译和做了些逻辑上的支持而已。这样就全部都是原生的了,原生的好处是:没有附加的学习成本。比如:$date{day,YY MM DD}这样的定义,首先你要不停的升级你的模版,然后用的人还要不停的看文档,如果是
<span><? date('YMD'); ?></span>,那这都是原生的js,成本就不同了。
2 楼 jj7jj7jj 2011-08-29  
achun 写道
推荐博主看下我写的jCT,专题地址
http://achun.iteye.com/category/33268
关键是推荐jCT的思路,既然是js模版
为了减省成本和条提高通用性,首先采用原生js语法。
为了实现原生js语法的模版,参考了服务器端脚本php的方法,
也就是完成html和js混合的支持文法。通过简单的解析转换,
把这种混合文法转换成js文件就完成了js模版的设计。
jCT里面除了实现了这个想法,还做了写代码逻辑上的处理。这使得jCT代码的复杂度提高了。
如果只是要实现一个简单的js模版,强烈建议博主采用html和原生js混合的方案,实现起来非常简单。


achun你好,JCT对我的项目可能暂时还用不上,因为模板只是我们里面的一个小工具类,只需要将获取json对象替换掉模板上标记的元素就行了,还有一句话不太明白“采用html和原生js混合的方案”是指在模板里面直接支持写SCRIPT脚本吗?
1 楼 achun 2011-08-28  
推荐博主看下我写的jCT,专题地址
http://achun.iteye.com/category/33268
关键是推荐jCT的思路,既然是js模版
为了减省成本和条提高通用性,首先采用原生js语法。
为了实现原生js语法的模版,参考了服务器端脚本php的方法,
也就是完成html和js混合的支持文法。通过简单的解析转换,
把这种混合文法转换成js文件就完成了js模版的设计。
jCT里面除了实现了这个想法,还做了写代码逻辑上的处理。这使得jCT代码的复杂度提高了。
如果只是要实现一个简单的js模版,强烈建议博主采用html和原生js混合的方案,实现起来非常简单。

相关推荐

    javascript 视图模板 2.0

    总的来说,JavaScript视图模板2.0致力于提供更高效、更易用的模板解决方案,以帮助开发者更好地构建动态的、数据驱动的Web界面。通过合理利用模板引擎,可以极大地提高前端开发效率,同时保持代码的整洁和可维护性。

    简单JS页面视图模板

    在这个"简单JS页面视图模板"中,我们可以看到一个基本的JavaScript页面视图的实现,它结合了HTML、CSS和JavaScript来创建动态的用户体验。这篇博客文章通过一个实例展示了如何使用JavaScript来构建页面模板,尤其...

    服务器端渲染JavaScript视图Hypernova.zip

    在服务器上自己的首选模板库中和 JavaScript 中编写两次相同的代码可能很乏味,并且难以维护。Hypernova 允许你在一个地方编写所有的视图代码,而不必牺牲用户的体验。工作原理: 标签:Hypernova

    JavaScript应用模板

    JavaScript应用模板是开发Web应用程序时常用的一种工具,它可以帮助开发者快速构建复杂的前端项目,提高代码复用性,减少重复劳动,提升开发效率。本篇将深入探讨JavaScript应用模板的原理、常见框架以及如何使用。 ...

    基于JavaScript的模板引擎

    在JavaScript的世界里,有许多流行的模板引擎,如ejs、Handlebars、Mustache、Underscore.js的_.template等。这些模板引擎各有特点,但基本原理相似:解析模板字符串,编译成JavaScript函数,然后在运行时调用这个...

    轻量的javascript视图层框架

    总的来说,Pocket作为一款轻量级的JavaScript视图层框架,以其简洁的API和强大的模板系统,为开发者提供了一个快速构建前端应用的工具。尽管它在功能上可能不如一些大型框架全面,但其灵活性和易学性使得它成为小...

    Jquery 视图插件,模板插件,日期插件 案例

    在这个“Jquery 视图插件,模板插件,日期插件 案例”中,我们将深入探讨jQuery如何通过扩展增强其在用户界面呈现和管理上的能力。以下是关于这些主题的详细讨论: 1. **jQuery 视图插件**: jQuery视图插件通常...

    基于JavaScript的微信小程序前端模板

    在这个“基于JavaScript的微信小程序前端模板”中,我们将会探讨JavaScript在微信小程序开发中的核心作用,以及如何利用ECMAScript特性构建高效的前端模板。 1. **JavaScript基础**:JavaScript是微信小程序开发的...

    JavaScript驱动Android视图交互方案.zip

    **JavaScript驱动Android视图交互方案资源概述** 随着Web技术的不断发展,JavaScript已成为前端开发中不可或缺的一部分。而在跨平台应用开发中,JavaScript的灵活性和强大的生态系统为开发者提供了新的可能性,特别...

    Hoganjs来自Twitter的JavaScript模板引擎

    在前端开发中,Hogan.js允许开发者将数据与视图模板分离,从而更好地管理代码,提高可维护性和复用性。 Mustache模板是一种无逻辑的模板语言,它遵循“逻辑less”的原则,即模板中不包含任何业务逻辑或条件判断。...

    ECharts扩展示例自定义视图(Html模板、大数据模板、大屏echarts模板).zip

    在本压缩包“ECharts扩展示例自定义视图(Html模板、大数据模板、大屏echarts模板).zip”中,包含了一系列关于ECharts自定义视图的实例,帮助开发者更好地理解和运用ECharts的各种高级特性。 首先,我们来看...

    实例讲解JavaScript的Backbone.js框架中的View视图

    在学习JavaScript前端开发框架时,Backbone.js是一个不可忽视...Backbone.js的View视图是单页面应用开发中不可或缺的一部分,它通过模板、事件监听和DOM更新的机制,给开发者提供了一个强大而灵活的用户界面管理方式。

    JavaScript模板引擎 - Elapse

    JavaScript模板引擎Elapse是Web开发中的一个重要工具,它主要用于生成动态HTML内容,使得开发者能够将数据和视图逻辑分离,提高代码的可读性和可维护性。模板引擎的工作原理是通过解析预先定义好的模板语法,然后...

    PowJS基于DOMTree的JavaScript模板引擎

    模板引擎是前端开发中的一个重要工具,它允许开发者将数据与视图逻辑分离,提高代码的可读性和可维护性。 在JavaScript开发中,模板引擎通过将数据绑定到预先定义好的模板结构,能够自动生成HTML代码,这种技术在...

    Tempos高效的Javascript模板引擎

    在Web开发中,模板引擎扮演着至关重要的角色,它允许开发者将数据和视图逻辑分离,使得代码更加模块化,更易于维护。Tempos正是这样的工具,它通过简洁的语法和高效执行性能,提升了JavaScript在生成动态HTML内容时...

    laytpl是一款非常轻量的JavaScript模板引擎

    laytpl是一款专为JavaScript设计的轻量级模板引擎,它以简洁、高效的特性深受开发者喜爱。这款引擎的主要目标是提供一种简单易用的方案来处理数据与HTML的绑定,使得在前端开发中能够快速地将动态数据渲染成视图。 ...

    基于JavaScript和html的开发模板引擎

    ECMAScript是JavaScript的标准,每个新版本(如ES6、ES7等)都会引入新的语法特性,如箭头函数、Promise、模板字符串等,这些都在模板引擎中扮演重要角色。 二、HTML与动态渲染 HTML(超文本标记语言)是构建网页...

    基于JavaScript和html的高性能模板引擎

    模板引擎通常会使用JavaScript来解析模板、操作数据并更新视图。ECMAScript是JavaScript的标准化规格,理解其新特性如箭头函数、模板字符串、Promise等,对于编写高效模板引擎至关重要。 2. HTML模板:在HTML中嵌入...

    后台管理系统模板

    4. **Echart统计**:Echart 是一个基于 JavaScript 的开源可视化库,支持多种图表类型,并且可以与后端数据源无缝对接,实现实时数据更新。 5. **信箱**:后台系统通常需要处理用户的反馈或内部通信,内置的信箱...

    NodeJS框架Express的模板视图机制分析

    嵌入JavaScript模板EJS 基于CoffeeScript的模板引擎CoffeeKup 的NodeJS版本jQuery模板引擎 视图渲染(view randering) 视图的文件名默认需遵循“&lt;name&gt;.”的形式,这里是要被加载的模块的名字。比如视图layout.ejs...

Global site tag (gtag.js) - Google Analytics