如何利用模板将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 相关文章推荐
Javascript解决常见浏览器兼容问题的12种方法
Jan 04 Javascript
leaflet的开发入门教程
Nov 17 Javascript
浅谈js原生拖放
Nov 21 Javascript
最好用的Bootstrap fileinput.js文件上传组件
Dec 12 Javascript
js实现网页定位导航功能
Mar 07 Javascript
微信小程序商品到详情的实现
Jun 27 Javascript
jquery 键盘事件的使用方法详解
Sep 13 jQuery
JS编写兼容IE6,7,8浏览器无缝自动轮播
Oct 12 Javascript
详解微信小程序scroll-view横向滚动的实践踩坑及隐藏其滚动条的实现
Mar 14 Javascript
JavaScript数组去重的几种方法
Apr 07 Javascript
Vue组件通信$attrs、$listeners实现原理解析
Sep 03 Javascript
vue等两个接口都返回结果再执行下一步的实例
Sep 08 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
新浪新闻小偷
2006/10/09 PHP
php中的filesystem文件系统函数介绍及使用示例
2014/02/13 PHP
PHP命令Command模式用法实例分析
2018/08/08 PHP
Jquery动态改变图片IMG的src地址示例
2013/06/25 Javascript
javascript动态添加、修改、删除对象的属性与方法详解
2014/01/27 Javascript
JS函数this的用法实例分析
2015/02/05 Javascript
jQuery插件开发的五种形态小结
2015/03/04 Javascript
JavaScript创建对象的常用方式总结
2018/08/10 Javascript
详解小程序rich-text对富文本支持方案
2018/11/28 Javascript
JSX在render函数中的应用详解
2019/09/04 Javascript
layui select 禁止点击的实现方法
2019/09/05 Javascript
新手入门js闭包学习过程解析
2019/10/08 Javascript
小程序接口的promise化的实现方法
2019/12/11 Javascript
Vue项目中使用flow做类型检测的方法
2020/03/18 Javascript
400多行Python代码实现了一个FTP服务器
2012/05/10 Python
使用Python搭建虚拟环境的配置方法
2018/02/28 Python
Python 从相对路径下import的方法
2018/12/04 Python
django 自定义过滤器的实现
2019/02/26 Python
python实现电子产品商店
2019/02/26 Python
Python高级特性与几种函数的讲解
2019/03/08 Python
详解PANDAS 数据合并与重塑(join/merge篇)
2019/07/09 Python
python3中numpy函数tile的用法详解
2019/12/04 Python
pytorch绘制并显示loss曲线和acc曲线,LeNet5识别图像准确率
2020/01/02 Python
python判断变量是否为int、字符串、列表、元组、字典的方法详解
2020/02/13 Python
e路東瀛(JAPANiCAN)香港:日本旅游、日本酒店和温泉旅馆预订
2018/11/21 全球购物
JAVA程序设计笔试题面试题一套
2015/07/28 面试题
保安的辞职报告怎么写
2014/01/20 职场文书
报关报检委托书
2014/04/08 职场文书
学校春季防火方案
2014/06/08 职场文书
财政局党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
债务授权委托书范本
2014/10/17 职场文书
2014年创卫工作总结
2014/11/24 职场文书
2014社区健康教育工作总结
2014/12/16 职场文书
2014年会计主管工作总结
2014/12/20 职场文书
2016年领导干部正风肃纪心得体会
2015/10/09 职场文书
Python安装及建立虚拟环境的完整步骤
2022/06/25 Servers