放弃用你的InnerHTML来输出HTML吧 jQuery Tmpl不详细讲解


Posted in Javascript onApril 20, 2013

在Ajax横道的今天,我们在页面交互上有了更高的要求,动态生成HTML毫无疑问是其中的一种。动态生成HTML的方式多种多样,其核心不外乎在前段(JS)或者后端(C#/PHP…)将数据组装成我们想要的模版,最终通过一定的方法输出给用户(innerHTML、documentWrite等方式)。

缺点

1)拼接字符串的过程容易出错,常常忘了'/”>等匹配的符号。
2)修改前台模版的同时容易遗忘同步更改动态生成的模版。
3)拼接字符串不直观和美观,不利于查找错误,例如:数据中如果存在HTML内容,会导致种种麻烦。
4)不能满足较高的业务逻辑需求,处理判断较为麻烦,例如:当A情况生成X模版,B情况生成Y模版。
5)复用性低,较为相似的模版难以公用。

需求

1)简单,直观的模版
2)易于维护(方便查找错误,有代码着色等)
3)模版的可复用性
4)处理一定的逻辑判断

解决方案

基于以上的缺点,jQuery Tmpl这个插件能够很好的满足了我们的需求。使用这种新型的模版技术仅仅需要引入jQuery Tmpl这个插件而已。该插件十分小巧(5.97KB),对于性能的影响并不大。而且据闻这个插件是Microsoft开发的,对于ASP.NET MVC的友好度是大大的。 点击这里进去项目地址

 

放弃用你的InnerHTML来输出HTML吧 jQuery Tmpl不详细讲解

通过图片我们能够很直观的看到Tmpl的工作原理,我们仅仅需要提供数据和模版。数据我们能够通过后台的Json方法直接传到前台,而模版则是接下来要讲的东西了。

1)模版代码写在哪里?

<script type="text/x-jquery-tmpl" id="testTemplate">
    /*模版代码*/
</script>

我们可以看到其实模版代码的容器就是我们的<script>标签,不过type类型是'text/x-jquery-tmpl'而不是我们平常用的'text/javascript'而已,type类型难记?没关系,在Visual Studio2012中已经有了这个类型的智能提示了(没有验证过2010)。

2)模版的语法

我把jQuery Tmpl的语法分为三大类:

1.显示类:

{{html }} / {{= }} / ${ },这三个标签都能够将数据输出到模版中,但是{{html}}不会对数据进行编码,用于输出数据中的HTML代码段的,而{{=}}和${}则会对数据进行编码,防止数据对于模版结构的破坏。

模版代码:
数据及JS代码:
页面效果:

当我们把data里面的name的值换成一段HTML'<a href="http://www.google.com">点击有好玩的东西哟!</a>'就可以看到{{html }} / {{= }} / ${ }的区别了。

页面效果:

由此我们可以见得使用{{html}}来输出模版里面的内容是带有一定的风险的(XSS攻击),所以在非确定数据的安全性下最好还是使用${}来输出内容既简单又简洁。当然直接输出内容远远不能满足我们的要求,如果能够调用函数来处理一下输出结果就更棒啦!

模版代码:
函数代码:
页面效果:
2.条件判断及循环:

{{if}} / {{else}} / {{/if}} / {{each}} 请注意是没有for / while / switch的,相对于来说jQuery Tmpl只支持较为简单的逻辑判断,当然如果你感觉这些满足不了你的需求的话,可以自己写函数然后再调用。给一个简单的例子来说明一下:

模版代码:
数据及JS代码:
页面输出:

在代码中我们可以注意到{{each}}是有两种写法的,如果不在each后面加(i, v)时在{{each}}代码块中使用$value特指当前项的值,而你需要项的序号则可以使用{{each(i, v) }}其中i代表当前项的次序、v代表当前项的值。如果你的条件判断比较复杂则可以使用函数来判断(完全和JS一样)

例如:放弃用你的InnerHTML来输出HTML吧 jQuery Tmpl不详细讲解放弃用你的InnerHTML来输出HTML吧 jQuery Tmpl不详细讲解效果是和上面的完全一样。

3.复用类

{{temp}}  当分支模版过长(写在一个模版中较为混乱)或者使用已经写好的通用模版,{{temp}}的作用就是调用指定ID模版来显示数据。

模版代码:

这个模版的最终效果和之前的完全一样,不过分别区分独立开来。提高了代码的可阅读性和复用性。在这里只是一次性调用其他模版,如果想循环调用呢?例如在例子当中输出兴趣爱好那样。让我们来看看代码应该如何写。

模版代码:

其中在eachTemplate模版中用$data来特指传进来的遍历项的值。怎么样感觉还是相当方便的吧^_^。

{{wrap}}使用于指定模版来包含当前模版,类似于指定母版页当前模版则属于子页面。

模版代码:
页面效果:

我们可以看出'wrapTemplate'的功效就是作为公共部分,在模版中用{{html $item.html}}来输出子页面的HTML内容。
其中$item.html还具备一定的筛选功能。

模版代码:
页面效果:

可以看到在这里只输出了第二个P。$item.html方法还有一个选项$item.html( filter, textOnly ),textOnly为bool值如果为true则只会输出元素的文字而忽略它原有的元素标签。

模版代码:
页面效果:

可以看到strong元素没有了加粗效果只有文字。

总结

其实在使用过程当中并不会经常运用到模版的一些高级功能,本文章也仅仅是介绍了一些关于jQuery Tmpl的基础性的东西。使用这个插件能够给我们带来的好处实在不少,之前我在动态输出HTML代码段的时候(在JS文件中拼接字符串)经常修改了前台页面而忘记修改JS中的拼接字符串,导致经常出些莫名其妙的错误,而且在多个分支判断下拼接字符串的劣处体现的更加明显,现在的话我会把Tmpl模版的代码就放在前台页面要生成代码的地方,这样就大大减少了错误的发生啦!

以上的内容并没有涉及到与ASP.NET的交互,以及更多的一些高级应用技巧,如果大家反映良好就会专门写一篇结合ASP.NET MVC的应用文章啦~^_^

Javascript 相关文章推荐
THREE.JS入门教程(3)着色器-下
Jan 24 Javascript
node.js中的events.emitter.removeAllListeners方法使用说明
Dec 10 Javascript
实例讲解jquery与json的结合
Jan 07 Javascript
实例讲解javascript注册事件处理函数
Jan 09 Javascript
jq源码解析之绑在$,jQuery上面的方法(实例讲解)
Oct 13 jQuery
jQuery niceScroll滚动条错位问题的解决方法
Feb 03 jQuery
关于Vue在ie10下空白页的debug小结
May 02 Javascript
JS学习笔记之贪吃蛇小游戏demo实例详解
May 29 Javascript
node.JS的crypto加密模块使用方法详解(MD5,AES,Hmac,Diffie-Hellman加密)
Feb 06 Javascript
Vue this.$router.push(参数)实现页面跳转操作
Sep 09 Javascript
nuxt 自定义 auth 中间件实现令牌的持久化操作
Nov 05 Javascript
vue mvvm数据响应实现
Nov 11 Javascript
对jQuery的事件绑定的一些思考(补充)
Apr 20 #Javascript
A标签中通过href和onclick传递的this对象实现思路
Apr 19 #Javascript
javascript中onclick(this)用法介绍
Apr 19 #Javascript
jQuery使用一个按钮控制图片的伸缩实现思路
Apr 19 #Javascript
使用jQuery同时控制四张图片的伸缩实现代码
Apr 19 #Javascript
使用jQuery实现的网页版的个人简历(可换肤)
Apr 19 #Javascript
兼容IE和Firefox火狐的上下、左右循环无间断滚动JS代码
Apr 19 #Javascript
You might like
PHP+MySQL 制作简单的留言本
2009/11/02 PHP
Javascript 解疑
2009/11/11 Javascript
JavaScript在多浏览器下for循环的使用方法
2012/11/07 Javascript
JavaScript中数组对象的那些自带方法介绍
2013/03/12 Javascript
jquery中插件实现自动添加用户的具体代码
2013/11/15 Javascript
ExtJs纵坐标值重复问题的解决方法
2014/02/27 Javascript
js中for in语句的用法讲解
2015/04/24 Javascript
浅谈JavaScript函数的四种存在形态
2016/06/08 Javascript
BOM系列第三篇之定时器应用(时钟、倒计时、秒表和闹钟)
2016/08/17 Javascript
Vue-Cli中自定义过滤器的实现代码
2017/08/12 Javascript
D3.js实现拓扑图的示例代码
2018/06/30 Javascript
jQuery pagination分页示例详解
2018/10/23 jQuery
基于游标的分页接口实现代码示例
2018/11/12 Javascript
express中static中间件的具体使用方法
2019/10/17 Javascript
jQuery轮播图功能制作方法详解
2019/12/03 jQuery
Vue分页效果与购物车功能
2019/12/13 Javascript
JS面向对象编程——ES6 中class的继承用法详解
2020/03/03 Javascript
使用vant的地域控件追加全部选项
2020/11/03 Javascript
[02:04]2020年夜魇暗潮预告片
2020/10/30 DOTA
Python解析最简单的验证码
2016/01/07 Python
详谈Python3 操作系统与路径 模块(os / os.path / pathlib)
2018/04/26 Python
python实现单链表中删除倒数第K个节点的方法
2018/09/28 Python
Python高级编程之消息队列(Queue)与进程池(Pool)实例详解
2019/11/01 Python
Jupyter Notebook的连接密码 token查询方式
2020/04/21 Python
英国当代时尚和街头服饰店:18montrose
2018/12/15 全球购物
俄罗斯美容和健康网上商店:Созвездие Красоты
2019/07/23 全球购物
戴森香港官方网站:Dyson香港
2021/02/11 全球购物
璀璨的珍珠、密钉和个性化珠宝:Lily & Roo
2021/01/21 全球购物
高一生物教学反思
2014/01/17 职场文书
数学检讨书1000字
2014/02/24 职场文书
投标承诺书怎么写
2014/05/24 职场文书
关于读书的演讲稿600字
2014/08/27 职场文书
企业党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
乌镇导游词
2015/02/02 职场文书
Android使用EventBus发送消息,Fragment中接收消息的方法会执行多次
2022/04/24 Java/Android
python神经网络学习 使用Keras进行简单分类
2022/05/04 Python