如何利用模板将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中Eval函数的使用说明
Oct 11 Javascript
javascript得到XML某节点的子节点个数的脚本
Oct 11 Javascript
D3.js 从P元素的创建开始(显示可加载数据)
Oct 30 Javascript
JavaScript实现的一个倒计时的类
Mar 12 Javascript
JavaScript DOM基础
Apr 13 Javascript
用JavaScript实现页面重定向功能的教程
Jun 04 Javascript
javascript实现简易计算器的代码
May 31 Javascript
BootStrapTable服务器分页实例解析
Dec 20 Javascript
JavaScript解析JSON格式数据的方法示例
Jan 24 Javascript
C#实现将一个字符转换为整数
Dec 12 Javascript
vue.js实现的绑定class操作示例
Jul 06 Javascript
Vue项目中使用flow做类型检测的方法
Mar 18 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/01 无线电
php Undefined index和Undefined variable的解决方法
2008/03/27 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十五)
2014/06/30 PHP
PHP curl伪造IP地址和header信息代码实例
2015/04/27 PHP
PHP使用array_merge重新排列数组下标的方法
2015/07/22 PHP
浅谈php中curl、fsockopen的应用
2016/12/10 PHP
Thinkphp5结合layer弹窗定制操作结果页面
2017/07/07 PHP
jquery插件 autoComboBox 下拉框
2010/12/22 Javascript
实现变速回到顶部的JavaScript代码
2011/05/09 Javascript
改变文件域的样式实现思路同时兼容ie、firefox
2013/10/23 Javascript
window.open打开页面居中显示的示例代码
2013/12/27 Javascript
Javascript动态引用CSS文件的2种方法介绍
2014/06/06 Javascript
JavaScript中利用各种循环进行遍历的方式总结
2015/11/10 Javascript
全面解析Bootstrap表单使用方法(表单控件状态)
2015/11/24 Javascript
jQuery+json实现的简易Ajax调用实例
2015/12/14 Javascript
[js高手之路]寄生组合式继承的优势详解
2017/08/28 Javascript
微信小程序实现YDUI的ScrollTab组件
2018/02/02 Javascript
少女风vue组件库的制作全过程
2019/05/15 Javascript
关于微信小程序map组件z-index的层级问题分析
2019/07/09 Javascript
Element-UI+Vue模式使用总结
2020/01/02 Javascript
详解Vue的ref特性的使用
2020/01/24 Javascript
浅析Python中的赋值和深浅拷贝
2017/08/15 Python
使用Python的SymPy库解决数学运算问题的方法
2019/03/27 Python
django创建超级用户过程解析
2019/09/18 Python
python3 tkinter实现添加图片和文本
2019/11/26 Python
python中os包的用法
2020/06/01 Python
Python趣味实例,实现一个简单的抽奖刮刮卡
2020/07/18 Python
python openssl模块安装及用法
2020/12/06 Python
美国最大的电子宠物训练产品制造商:PetSafe
2018/10/12 全球购物
物流专业求职计划书
2014/01/10 职场文书
优秀党支部事迹材料
2014/01/14 职场文书
自主招生推荐信格式模板
2015/03/24 职场文书
员工升职自荐信
2015/03/27 职场文书
Django migrate报错的解决方案
2021/05/20 Python
Python+Tkinter打造签名设计工具
2022/04/01 Python
Vue Mint UI mt-swipe的使用方式
2022/06/05 Vue.js