如何利用模板将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 相关文章推荐
jQuery 研究心得 取得属性的值
Nov 30 Javascript
js动画(animate)简单引擎代码示例
Dec 04 Javascript
javascript当中的代码嗅探扩展原生对象和原型(prototype)
Jan 11 Javascript
js将json格式内容转换成对象的方法
Nov 01 Javascript
JavaScript中Number.MIN_VALUE属性的使用示例
Jun 04 Javascript
jQuery实现的多滑动门,多选项卡效果代码
Mar 28 Javascript
JavaScript中从setTimeout与setInterval到AJAX异步
Feb 13 Javascript
JS中原始值和引用值的储存方式示例详解
Mar 23 Javascript
JS实现将二维数组转为json格式字符串操作示例
Jul 12 Javascript
深入理解JavaScript 箭头函数
May 30 Javascript
浅谈对于“不用setInterval,用setTimeout”的理解
Aug 28 Javascript
element-ui 本地化使用教程详解
Oct 28 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生成zip压缩文件的方法详解
2013/06/09 PHP
JavaScript 事件查询综合
2009/07/13 Javascript
javascript面向对象编程(一) 实例代码
2010/06/25 Javascript
JavaScript实现页面实时显示当前时间的简单实例
2013/07/20 Javascript
jQuery使用fadein方法实现渐出效果实例
2015/03/27 Javascript
Javascript 普通函数和构造函数的区别
2016/11/05 Javascript
JS常用加密编码与算法实例总结
2016/12/22 Javascript
js 输入框 正则表达式(菜鸟必看教程)
2017/02/19 Javascript
jQuery实现点击DIV同时点击CheckBox,并为DIV上背景色的实例
2017/12/18 jQuery
NodeJS简单实现WebSocket功能示例
2018/02/10 NodeJs
JS中获取 DOM 元素的绝对位置实例详解
2018/04/23 Javascript
jQuery中常用动画效果函数知识点整理
2018/08/19 jQuery
vue-cli监听组件加载完成的方法
2018/09/07 Javascript
vue-awesome-swiper 基于vue实现h5滑动翻页效果【推荐】
2018/11/08 Javascript
jQuery实现上下滚动公告栏详细代码
2018/11/21 jQuery
vue实现百度语音合成的实例讲解
2019/10/14 Javascript
npm qs模块使用详解
2020/02/07 Javascript
原生JS封装拖动验证滑块的实现代码示例
2020/06/01 Javascript
VUE 实现element upload上传图片到阿里云
2020/08/12 Javascript
浅析python 内置字符串处理函数的使用方法
2014/06/11 Python
分析Python读取文件时的路径问题
2018/02/11 Python
对python中array.sum(axis=?)的用法介绍
2018/06/28 Python
Python实现针对json中某个关键字段进行排序操作示例
2018/12/25 Python
Python实现定时执行任务的三种方式简单示例
2019/03/30 Python
python变量的作用域是什么
2020/05/26 Python
Python子进程subpocess原理及用法解析
2020/07/16 Python
新加坡时尚网上购物:Zalora新加坡
2016/07/26 全球购物
日本亚马逊官方网站:Amazon.co.jp
2020/04/14 全球购物
《满井游记》教学反思
2014/02/26 职场文书
竞选生活委员演讲稿
2014/04/28 职场文书
企业党的群众路线教育实践活动学习心得体会
2014/10/31 职场文书
会计岗位职责范本
2015/04/02 职场文书
项目技术负责人岗位职责
2015/04/13 职场文书
2015年新农村建设工作总结
2015/05/22 职场文书
Pyqt5将多个类组合在一个界面显示的完整示例
2021/09/04 Python
CSS 一行代码实现头像与国旗的融合
2021/10/24 HTML / CSS