如何利用模板将HTML从JavaScript中抽离


Posted in Javascript onOctober 08, 2016

一、当需要注入大段的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');

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
关于document.cookie的使用javascript
Apr 11 Javascript
JavaScript 计算图片加载数量的代码
Jan 01 Javascript
解读JavaScript代码 var ie = !-[1,] 最短的IE判定代码
May 28 Javascript
固定背景实现的背景滚动特效示例分享
May 19 Javascript
Extjs407 getValue()和getRawValue()区别介绍
May 21 Javascript
深入理解JS中的变量及作用域、undefined与null
Mar 04 Javascript
javascript 数组操作详解
Jan 29 Javascript
JavaScript实现文字跟随鼠标特效
Aug 06 Javascript
jQuery实现边框动态效果的实例代码
Sep 23 Javascript
详解webpack 如何集成第三方js库
Jun 29 Javascript
深入理解Vue.js源码之事件机制
Sep 27 Javascript
基于Vue 服务端Cookies删除的问题
Sep 21 Javascript
Vue.js 2.0 和 React、Augular等其他前端框架大比拼
Oct 08 #Javascript
bootstrap下拉列表与输入框组结合的样式调整
Oct 08 #Javascript
Bootstrap字体图标无法正常显示的解决方法
Oct 08 #Javascript
Javascript中常用的检测方法小结
Oct 08 #Javascript
微信小程序 前端源码逻辑和工作流详解
Oct 08 #Javascript
AngularJS 2.0入门权威指南
Oct 08 #Javascript
省市区三级联动jquery实现代码
Apr 15 #Javascript
You might like
PHP+.htaccess实现全站静态HTML文件GZIP压缩传输(一)
2007/02/15 PHP
php上传功能集后缀名判断和随机命名(强力推荐)
2015/09/10 PHP
php微信开发之上传临时素材
2016/06/24 PHP
关于php中的json_encode()和json_decode()函数的一些说明
2016/11/20 PHP
JS getMonth()日期函数的值域是0-11
2010/02/15 Javascript
Js sort排序使用方法
2011/10/17 Javascript
JQuery给元素添加/删除节点比如select
2013/04/02 Javascript
JS增加行复制行删除行的实现代码
2013/11/09 Javascript
JS delegate与live浅析
2013/12/21 Javascript
javascript实现动态侧边栏代码
2014/02/19 Javascript
JavaScript File API实现文件上传预览
2016/02/02 Javascript
jQuery技巧之让任何组件都支持类似DOM的事件管理
2016/04/05 Javascript
nodejs基础应用
2017/02/03 NodeJs
深入理解Vue-cli搭建项目后的目录结构探秘
2017/07/13 Javascript
详谈Node.js之操作文件系统
2017/08/29 Javascript
es6中的解构赋值、扩展运算符和rest参数使用详解
2017/09/28 Javascript
微信小程序之选项卡的实现方法
2017/09/29 Javascript
Vue 2.5 Level E 发布了: 新功能特性一览
2017/10/24 Javascript
使用socket.io制做简易WEB聊天室
2018/01/02 Javascript
Node.js中读取TXT文件内容fs.readFile()用法
2018/10/10 Javascript
在微信小程序中使用图表的方法示例
2019/04/25 Javascript
原生js实现二级联动菜单
2019/11/27 Javascript
jQuery+ajax实现用户登录验证
2020/09/13 jQuery
Javascript中window.name属性详解
2020/11/19 Javascript
JavaScript实现切换多张图片
2021/01/27 Javascript
Python常用时间操作总结【取得当前时间、时间函数、应用等】
2017/05/11 Python
Python产生一个数值范围内的不重复的随机数的实现方法
2019/08/21 Python
python 单线程和异步协程工作方式解析
2019/09/28 Python
英国网上香水店:Fragrance Direct
2016/07/20 全球购物
全球领先的鞋类零售商:The Walking Company
2016/07/21 全球购物
机械系大学毕业生推荐信
2013/11/27 职场文书
社区五一劳动节活动总结
2015/02/09 职场文书
青岛海底世界导游词
2015/02/11 职场文书
导游词之徐州云龙湖
2019/11/19 职场文书
js实现模拟购物商城案例
2021/05/18 Javascript
python使用shell脚本创建kafka连接器
2022/04/29 Python