`
erricwang
  • 浏览: 13007 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

javascript模板替换的一些事儿

阅读更多
最近在搞的一个项目,涉及到大量重复内容的填充。前台是静态页面,用js来完成。抽象一下这个问题:
1、大量相似内容。数据库里头的记录、xml(还是别xml了)、json,json最实在。
2、变成html,写到页面中去。
这是问题模型,模板替换呢:
1、获得模板格式:都可以看成一个长长的字符串,里面包含一些特殊的标记,用于被数据集代替。
2、按照特定的规则代替 模板字符串的特殊标记。
3、将替代结束的字符串返回去。js就innerHTML到特定的位置了。
yeshino说他有个模板类,我就毫不犹豫的拿过来用了,经过几个版本的改进确实挺好用的。
模板替换第一条,获取用于替换的字符串,一般就是在html页面内,放置一个特定的dom元素,让它display:none;获取它的innerHTML就行了。yeshino的模板放置很哟意思,放在了一个<textarea>标签里面,好处就是,这个标签里面的内容不会被浏览器解析,进而省去了模板被浏览器解析的时间(否则,模板也会被解析成dom,有意思。另外,好像也可以写在注释里面)。第三步回填也简单,主要就是第二块替换的板块。看代码:
var tpl='xxxxxxxxx{id}xxx{nb}xxx';
var _json={id:'yyy',nb:'ttt'};
var str=tpl.replace(/{(\w+)}/g,function($0,$1){return _json[$1];});

哈哈,搞定了,很简单吧。核心在中间那个正则表达式的替换。
解释:
replace的第一个参数用于匹配字符串中,像'{中间是字母}'单引号之内的形式的子字符串。如:{id},{nb},{bn}等等。
replace第二个参数,可以是字符串,也可以是函数。是函数就默认把匹配到的内容传递过去。用法细节可以http://www.w3school.com.cn/js/jsref_replace.asp猛点看看。。。
解释完了,现在需求来了,比如刚才那个id,现在我有一个图片地址,要通过id经过一定的转换变来。比如:
var tpl='<img id={id} src={url} alt='{nb}'>;
var _json={id:'yyy',nb:'ttt',url:'http://pp.com/yyy.jpg'};
var str=tpl.replace(/{(\w+)}/g,function($0,$1){return _json[$1];});
//注意_json里面的id和url,假设
//var tf=(function(){//不用看这行

//_json中,id和url存在一定的关系。url通过id变过来的。
function url(id){
return 'http://pp.com/'+id+'.jpg';
};

//return {url:url};
//})();



有没有办法,剩去_json中的那项url呢?嘿嘿,肯定是。昨天,听tenf的伟大js分享,说到模板函数这个概念,就是对json中的数据项,做一些处理然后在传回给模板。tenf写出的方法强大无比,确实很强大,细节我就不介绍了,反正很强大。
嘿嘿,回头,根据我小项目的需求,按照这个思路走下去,稍在上面的代码上加些代码,先用着。看代码:

//var tpl='<img id={id} src={url} alt='{nb}'>;
var tpl='<img id={id} src=[_url({id})_] alt='{nb}'>;//注意模板变化

var _json={id:'yyy',nb:'ttt'};

//var str=tpl.replace(/{(\w+)}/g,function($0,$1){return _json[$1];});这是原来的代码
var str=tpl
.replace(/{(\w+)}/g,function($0,$1){return _json[$1];})
.replace(/\[_(\w+)\((\w+)\)_\]/g,function($0,$1,$2){return window[$1]($2);});

//var tf=(function(){//不用看这行

function url(id){
return 'http://pp.com/'+id+'.jpg';
};

//return {url:url};
//})();


嘿嘿,搞定。还是正则表达式,一个替换出来的是函数名称,第二个是函数的参数。搞定这个问题。
对于,很多数据,替换的问题,用两个循环就行了,上面说道的代码是核心。
以上说到的是简单的说明中间有很多要改进的地方,如参数有多个等。调用的函数最好也写成这样
function($0,$1,$2){
return window[$1]?window[$1]($2):$0;
}

如果没有替换函数,返回原来的字段,莫替换了。

好,写到这里了。javaeye上的第一篇技术总结blog搞定。
PS:
上面代码是临时跟着写用来说明的,没测试。:(运行不行,莫郁闷,嘿嘿。
模板这个还要注意下,最好encodeURIComponent下,回头在编回去。
1
0
分享到:
评论
4 楼 erricwang 2009-09-20  
wh8766 写道
看起来不错~
有机会实践~

嗯,正则表达式,很有意思。
3 楼 erricwang 2009-09-20  
yiminghe 写道
建议使用 Ext.template

稍后,看看ext的实现,里面的实现细节,肯定有很多引以为拜读的地方。
框架是个好东西,只是,我这个菜鸟涉及的项目都小,所有js的体积加起来还不够框架本身的体积大。嘿嘿,如果用,着用公司统一部署的框架,大家的项目都用到的,缓存来得快,放到省了流量。
2 楼 yiminghe 2009-09-20  
建议使用 Ext.template
1 楼 wh8766 2009-09-19  
看起来不错~
有机会实践~

相关推荐

    慈善非盈利组织网站模板

    安装和使用模板时,你需要熟悉基本的网页开发工具,如Dreamweaver或文本编辑器,并可能需要将模板内容与自己的组织信息进行定制和替换。 总之,慈善非盈利组织网站模板是一个精心设计的解决方案,旨在帮助这些组织...

    网站前端网页源码模板 (1245).zip

    在使用这个前端网页源码模板时,开发者可以做以下事情: - **自定义内容**:修改index.html中的文本和链接,替换为自己的网站内容。 - **调整样式**:编辑CSS文件,根据品牌需求更改颜色、字体、间距等样式属性。 -...

    js:所有关于 javascript 的事情

    JavaScript,简称JS,是一种广泛应用于Web开发的轻量级、解释型编程语言,以其灵活性和丰富的功能特性在互联网世界中占据着重要的地位。本压缩包文件"js-master"似乎包含了有关JavaScript的深入学习资料,涵盖了从...

    FSharpASPNETMVC:将 C# ASP.NET MVC 5 项目模板移植到 F#

    我复制了 Javascript、CSS 等资产,然后将 C# 代码移植到 F#。 ##地位 事情应该可以正常工作,但并非所有内容都经过全面测试。 有更多的代码需要清理和制作更惯用的代码。 ##执照 GNU GPL v2

    雨滴网站上线倒计时模板

    在构建一个引人注目的网站时,倒计时模板是一个非常有效的...在实际应用中,使用者需要根据自己的需求对模板进行适当的定制,例如调整颜色方案、添加自定义文字或替换图片,以确保模板与网站的整体风格和内容保持一致。

    framework:尝试构建非常适合单元测试和修改的框架,但从一开始就易于使用

    服务器和前端之间的共享模板处理工厂的服务容器单元测试的模拟环境强大的 ORM(可选) 设置配置的简单、灵活的方法#入门虽然单独的框架可以用来编写应用程序,但它并没有比带有一些基本 MVC 实现的微框架(例如 ...

    ndjson-format:使用模板字符串格式化您的 json 对象

    使用 es6 模板字符串格式化您的 json 对象。 您目前需要 iojs 才能运行。 用法 您不需要使用刻度线。 此外,您可能必须使用'而不是" ,因为${}通常也用于外壳替换 echo ' {"greet": "hi"}\n{"greet": "hello"} ' |...

    Web 前端开发网站

    jQuery是一个快速、简洁的JavaScript库,其设计宗旨是“write less, do more”,即用更少的代码做更多的事情。它极大地简化了JavaScript编程,使得操作DOM元素、响应用户事件、执行动画效果等工作变得更加简单高效。...

    mdbars:使用 Handlebars 的 Markdown Express.js 模板引擎插件

    mdbars 使用进行 Markdown 的视图引擎 这是对 2.9.0 版的修改。 所以你可以做所做的所有很酷的事情,但在降价而不是 html 上。...您可以使用相同的布局系统替换 express 生成器结构。 /views layout.hbs i

    react-assignment-manager:一个 React 应用程序,用于一些代码事情

    - **ES6+ 语法**:包括箭头函数、类、模板字符串等现代 JavaScript 特性。 - **React Hooks**:如 useState、useEffect、useRef 等,用于管理组件的状态和副作用。 - **Redux 或 Context API**:可能用于全局状态...

    生日快乐.zip只需改动少许就能自用

    "整活"在网络用语中通常表示做一些有趣的事情或者创新活动。因此,我们可以推测这个压缩包可能是一个HTML生日贺卡或者网页模板,用户可以通过编辑HTML代码来调整页面内容和样式,增加互动元素,让生日祝福更具趣味性...

    Datagrid实现双击行事件

    此外,`Datagrid`还支持自定义模板列,以满足更复杂的展示需求。为了使用户能够与数据进行交互,我们可以设置各种事件,例如`ItemCommand`、`RowCreated`和`RowDataBound`等。 双击行事件的实现通常涉及到`...

    clics1:跨语言共性数据库

    模块化(使代码能够以新数据作为输入并能够自动生成项目,而几乎不需要进行任何调整,而大多数事情都需要借助模板和配置文件来完成) 网站(使用引导程序和其他高级框架,修改当前网站结构以在所有设备上使用) 从...

    reader2:与Google Reader模仿者一起学习angularjs和symfony

    这是我需要做的事情: 使PHP代码遵循一些PSR规则添加针对PHP和Angular的单元测试添加一个不错的Bootstrap或类似CSS模板使用凉亭等替换未完成的RSS解析器(也许分叉吗?) 那是在添加功能之前保存和加载RSS列表证实...

    PHP面试总结面试总结

    在Smarty中,模板文件包含了静态HTML内容和动态变量,这些变量会被替换为实际的数据。 - **缓存机制**: 当首次加载模板时,Smarty会解析模板内容,并将HTML部分与PHP代码部分分离,生成一个新的临时PHP文件。这意味...

    meteor-modular-class:由许多不同的流星包组成的模块化类的概念证明

    Iron:router 最近所做的事情上更好地组织代码......)然后您可以拥有一个“插件”包的数量,当添加到项目中时,能够扩展基类的原型并可能修改/替换/包装模板。 ...碰巧这就是我需要用户帐户来集成高级配置选项和...

    refactored-dollop

    Handlebars是一种轻量级且强大的模板语言,广泛用于JavaScript应用中,特别是与Ember.js框架一起使用。它设计的核心理念是使HTML模板与应用程序逻辑分离,提供了一种声明式的方式来呈现数据。通过这种方式,开发者...

    sa4-cpq:Smartapp4 for CPQ 与 Endeavor 集成

    更改应用程序名称和元数据 1.1 - 更新 smart.project、config.xml 和 bower.json 1.1 - 更改各种模板的名称 1.2 - 在 App.js 中更改名称 1.3 - 在 Controller.js 中更改 将 Firebase URL 替换为您自己的 更新此自述...

    博客网络包

    博客网络包是一个针对博客开发的项目模板,它利用了现代前端构建工具Webpack,旨在帮助开发者快速搭建具有HTML、CSS和JavaScript功能的博客平台。Webpack是一个模块打包器,它能够将各种资源(如JavaScript、CSS、...

Global site tag (gtag.js) - Google Analytics