如何利用模板将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 对象中的类数组操作
Apr 27 Javascript
javascript中parentNode,childNodes,children的应用详解
Dec 17 Javascript
Javascript中拼接大量字符串的方法
Feb 05 Javascript
javascript省市区三级联动下拉框菜单实例演示
Nov 29 Javascript
jquery实现input框获取焦点的方法
Feb 06 Javascript
使用Node.js实现简易MVC框架的方法
Aug 07 Javascript
浅谈vue的踩坑路
Aug 31 Javascript
Angular5中状态管理的实现
Sep 03 Javascript
详解如何在Node.js的httpServer中接收前端发送的arraybuffer数据
Nov 11 Javascript
ionic3双击返回退出应用的方法
Sep 17 Javascript
JS使用for in有序获取对象数据
May 19 Javascript
JavaScript实现随机点名小程序
Oct 29 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
世界咖啡生产者论坛呼吁:需要立即就咖啡价格采取认真行动
2021/03/06 咖啡文化
深入分析使用mysql_fetch_object()以对象的形式返回查询结果
2013/06/05 PHP
php数组转成json格式的方法
2015/03/09 PHP
PHP实现图的邻接矩阵表示及几种简单遍历算法分析
2017/11/24 PHP
jQuery不间断滚动效果(模拟百度新闻支持文字/图片/垂直滚动)
2013/02/05 Javascript
JS JSON对象转为字符串的简单实现方法
2013/11/18 Javascript
JQuery拖动表头边框线调整表格列宽效果代码
2014/09/10 Javascript
使用javascript实现判断当前浏览器
2015/04/14 Javascript
Bootstrap布局方式详解
2016/05/27 Javascript
AngularJs directive详解及示例代码
2016/09/01 Javascript
Angular JS 生成动态二维码的方法
2017/02/23 Javascript
JavaScript订单操作小程序完整版
2017/06/23 Javascript
微信小程序 swiper组件构建轮播图的实例
2017/09/20 Javascript
简单的Vue异步组件实例Demo
2017/12/27 Javascript
jQuery实现获取及设置CSS样式操作详解
2018/09/05 jQuery
手淘flexible.js框架使用和源代码讲解小结
2018/10/15 Javascript
Vue组件化开发之通用型弹出框的实现
2020/02/28 Javascript
在vue项目中引用Antv G2,以饼图为例讲解
2020/10/28 Javascript
Python中使用item()方法遍历字典的例子
2014/08/26 Python
Python中使用Beautiful Soup库的超详细教程
2015/04/30 Python
Python正则表达式实现截取成对括号的方法
2017/01/06 Python
Pycharm在创建py文件时,自动添加文件头注释的实例
2018/05/07 Python
python安装pywin32clipboard的操作方法
2019/01/24 Python
Python 实现域名解析为ip的方法
2019/02/14 Python
python pandas写入excel文件的方法示例
2019/06/25 Python
解决jupyter notebook 前面书写后面内容消失的问题
2020/04/13 Python
Python3 webservice接口测试代码详解
2020/06/23 Python
浅谈css3新单位vw、vh、vmin、vmax的使用详解
2017/12/01 HTML / CSS
台湾租车首选品牌:IWS艾维士租车
2019/05/03 全球购物
光盘行动倡议书
2014/02/02 职场文书
大学生党员自我批评
2014/02/14 职场文书
学校招生宣传广告词
2014/03/19 职场文书
我的未来不是梦演讲稿
2014/09/02 职场文书
群众路线对照检查材料
2014/09/22 职场文书
MySQL创建索引需要了解的
2021/04/08 MySQL
win server2012 r2服务器共享文件夹如何设置
2022/06/21 Servers