利用模板将HTML从JavaScript中抽离
利用模板将HTML从JavaScript中抽离
一、当需要注入大段的HTML标签到页面中时,应该使用服务器渲染(从服务器加载HTML标签)
该方法将模板放置于服务器中使用XMLHttpRequest对象来获取外部标签(如多页应用)
function loadDialog(name, oncomplete) {
var xhr = new XMLHttpRequest();
xhr.open('get', '/js/dialog/'+name, true);
xhr.onreadystatechange = function () {
if(xhr.readyState == 4 && xhr.status == 200){
var div = document.getElementById('dlg-holder');
div.innerHTML = xhr.responseText;
oncomplete();
}else {
//错误处理代码
}
};
xhr.send(null);
}
//使用YUI的API
function loadDialog(name, oncomplete) {
Y.one('#dlg-holder').log('/js/dialog/'+name,oncomplete);
}
//使用JQuery的API
function loadDialog(name, oncomplete) {
$('#dlg-holder').load('/js/dialog/'+name, oncomplete);
}
二、客户端模板
对于少量的标签段,应该考虑采用客户端模板。
客户端模板是一些带‘插槽’(占位符)的标签片段,这些占位符会被JavaScript程序(模板引擎)替换为数据,然后把该替换好的标签片段插入到页面中。
JavaScript程序(模板引擎)
自定义模板文本处理程序
function sprintf(text){
var i=1,args=arguments;
return text.replace(/%s/g, function(){
return (i<args.length) ? args[i++] : '';
});
}
模板文本存放位置
1.存放于HTML注释中
<ul id = 'mylist'><!--<li id='item%s'><a href='%s'>%s</a></li>-->
...
</ul>
因为注释也是一个DOM节点,因此可以通过JS将其提取出来:
//格式化并插入DOM的方法定义
function addItem(url,text){
var mylist = document.getElementById('mylist');
var templateText = mylist.firstChild.nodeValue; //提取模板文本
var result = sprintf(templateText,url,text);
div.innerHTML = result;
mylist.insertAdjacentHTML('beforeend', result);
}
//调用方法
addItem('/item/4', 'First item');
addItem('/item/4', 'Second item');
2.存放于自定义type属性的script标签内
<script type='text/x-my-template' id='list-item'>
<li><a href='%s'>%s</a></li>
</script>
function addItem(url,text){
var mylist = document.getElementById('mylist');
var script = document.getElementById('list-item');
var templateText = script.text; //提取模板文本
var result = sprintf(templateText,url,text);
var div = document.createElement('div');
div.innerHTML = result.replace(/^\s*/,''); //去除模板文本的前导空格(因为它是在<script>标签的下一行)
mylist.appendChild(div.firstChild);
}
使用第三方的模板系统(如:artTemplate-3.0、Jade、Handlebars、doT.js)
以Handlebars为例:
Handlebars建议将模板存放于script标签内
<script type='text/x-handlebars-template' id='list-item'>
{{#if items}}
<ul id='mylist'>
{{#each items}}
<li><a href='{{url}}'>{{text}}</a></li>
{{/each}}
</ul>
{{/if}}
</script>
funtion addItem(url,text){
var mylist = document.getElementById('mylist'),
script = document.getElementById('list-item'),
template = Handlebars.compile(script.text), //提取模板文本,返回格式化方法
div = document.createElement('div'),
result;
result = template({text:text,url:url});
div.innerHTML = result;
mylist.appendChild(div.firstChild);
}
//调用
addItem('/item/4,'First item');
利用模板将HTML从JavaScript中抽离的更多相关文章
- opengl学习-利用模板测试勾画物体轮廓中出现的一个问题
我在学习OpenGL模板测试勾画物体轮廓的时候,出现了这个问题: 这个出现的原因就是,改变摄像机的时候,每次绘制,上次绘制中模板缓冲区的数据没有清除的原因.也就是在while循环开始的时候,glCle ...
- JavaScript中利用Ajax 实现客户端与服务器端通信(九)
一:Ajax (Asynchronous JavaScript and XML)不是一个新的技术,事实上,它是一些旧有的成熟的技术以一种全新的更加强大的方式整合在一起 Ajax的关键技术: 1.使用X ...
- JavaScript中作用域回顾(避免使用全局变量)(瀑布流的实现)(scroll事件)以及Django自定义模板函数回顾
页面显示照片样式为瀑布流: 上面的div个数可以按照自己安排进行划分.img的分布可以使用模板标签以及自定义模板函数进行排布: 自定义模板函数实现可以看,最后几列:python---django中模板 ...
- 如何在Javascript中利用封装这个特性
对于熟悉C#和Java的兄弟们,面向对象的三大思想(封装,继承,多态)肯定是了解的,那么如何在Javascript中利用封装这个特性呢? 我们会把现实中的一些事物抽象成一个Class并且把事物的属性( ...
- think PHP5中,模板、控制器、JavaScript的url跳转重定向方法
php控制器中的跳转: 1, header()函数是PHP中进行页面跳转的一种十分简单的方法.主要功能是将HTTP协议标头(header)输出到浏览器. header("Location: ...
- javaScript中利用ActiveXObject来创建FileSystemObject操作文件
注:如果用javascript读本地文件,遇到安全问题. 需在浏览器中进行设置,如下: 工具—> Internet选项->安全->自定义级别->启用“没有标识为安全的A ...
- 利用arguments对象在javaScript中实现重载(overload)
一些概念: 重载(overload): 什么是: 相同函数名,不同参数列表的多个函数,在调用时,可根据传入参数的不同,自动选择对应的函数调用! 为什么: 减轻调用者的负担,一个函数名,可执行多种操作 ...
- JavaScript中常见的十五种设计模式
在程序设计中有很多实用的设计模式,而其中大部分语言的实现都是基于“类”. 在JavaScript中并没有类这种概念,JS中的函数属于一等对象,在JS中定义一个对象非常简单(var obj = {}), ...
- 简单分析JavaScript中的面向对象
初学JavaScript的时候有人会认为JavaScript不是一门面向对象的语言,因为JS是没有类的概念的,但是这并不代表JavaScript没有对象的存在,而且JavaScript也提供了其它的方 ...
随机推荐
- 一步步开发自己的博客 .NET版(1、基本显示)
前言 我们每个猿都有一个搭建自己独立博客的梦,我也不例外.以前想 现在想 以后也想.之所以一直迟迟没有着手,是因为难以跨出第一步.每次心里想着,等我以后技术好了再说,然后就没有然后了.以前用过word ...
- .NET面试题系列[5] - 垃圾回收:概念与策略
面试出现频率:经常出现,但通常不会问的十分深入.通常来说,看完我这篇文章就足够应付面试了.面试时主要考察垃圾回收的基本概念,标记-压缩算法,以及对于微软的垃圾回收模板的理解.知道什么时候需要继承IDi ...
- Go语言实战 - 网站性能优化第一弹“七牛云存储”
由于用户纷纷反应山坡网的打开速度比较慢,所以两天前我们决定把服务器从linode迁移到阿里云. 整个迁移过程非常平滑,基本上一个小时就完成了.而且阿里云的配套设施提供的也很不错,运行状态监控什么的都有 ...
- Java在DOS命令下的运行及其API文档制作过程
该文档主要描述java程序在DOS命令下的运行,以及一些常用的命令 常用DOS命令: d: 回车 盘符切换 dir(directory):列出当前目录下的文件以及文件夹 md (make direct ...
- ABP源码分析十二:本地化
本文逐个分析ABP中涉及到locaization的接口和类,以及相互之间的关系.本地化主要涉及两个方面:一个是语言(Language)的管理,这部分相对简单.另一个是语言对应得本地化资源(Locali ...
- Eclipse安装SVN教程
第1种安装方法 下载SVN安装包.地址:subclipse.tigris.org/servlets/ProjectDocumentList?folderID=2240. 根据Eclipse版本进行下载 ...
- Code First Migrations
在MVC开发当中难免会对类进行修改,修改后再次运行就会出现异常,提示上下文的模型已在数据库创建后发生改变. 支持“AppContext”上下文的模型已在数据库创建后发生更改.请考虑使用 Code Fi ...
- 揭开SQL注入的神秘面纱PPT分享
SQL注入是一个老生常谈但又经常会出现的问题.该课程是我在公司内部培训的课程,现在分享出来,希望对大家有帮助. 点击这里下载.
- PhoneGap/cordvoa如何添加Media插件
phonegap由2.7升级到3.7之前,只要引入一个cordova.js,就可以了.现在由于所用的插件,都需要用模块的形式进行按需加载,自然就没有以前那么安逸了. 例如,如果要在安卓平台添加一个音频 ...
- u-boot-2015.04 在tq2440上的移植(使用spl引导u-boot)
本次移植跟以往的不同之处是采用了spl来引导u-boot,参考了博客http://blog.csdn.net/fulinus/article/details/42738641 下载链接:http:// ...