如何利用模板将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 相关文章推荐
js 动态选中下拉框
Nov 26 Javascript
php跨域调用json的例子
Nov 13 Javascript
解析img图片没找到onerror事件 Stack overflow at line: 0
Dec 23 Javascript
JS下载文件|无刷新下载文件示例代码
Apr 17 Javascript
推荐25个超炫的jQuery网格插件
Nov 28 Javascript
鼠标事件的screenY,pageY,clientY,layerY,offsetY属性详解
Mar 12 Javascript
jQuery实现选中弹出窗口选择框内容后赋值给文本框的方法
Nov 23 Javascript
对象题目的一个坑 理解Javascript对象
Dec 22 Javascript
对jquery的ajax进行二次封装以及ajax缓存代理组件:AjaxCache详解
Apr 11 Javascript
微信小程序 动画的简单实例
Oct 12 Javascript
使用JavaScript生成罗马字符的实例代码
Jun 08 Javascript
JS对日期操作封装代码实例
Nov 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
生成静态页面的PHP类
2006/11/25 PHP
轻松修复Discuz!数据库
2008/05/03 PHP
php删除与复制文件夹及其文件夹下所有文件的实现代码
2013/01/23 PHP
smarty基础之拼接字符串的详解
2013/06/18 PHP
PHP中变量引用与变量销毁机制分析
2014/11/15 PHP
PHP中的正则表达式实例详解
2017/04/25 PHP
jquery中ajax学习笔记3
2011/10/16 Javascript
Extjs中ComboBox加载并赋初值的实现方法
2012/03/22 Javascript
js控制CSS样式属性语法对照表
2012/12/11 Javascript
ajax java 实现自动完成功能
2012/12/19 Javascript
jQuery EasyUI 菜单与按钮之创建简单的菜单和链接按钮
2015/11/18 Javascript
基于javascript代码检测访问网页的浏览器呈现引擎、平台、Windows操作系统、移动设备和游戏系统
2015/12/03 Javascript
jquery分页插件pagination使用教程
2018/10/23 jQuery
跟老齐学Python之用while来循环
2014/10/02 Python
python比较2个xml内容的方法
2015/05/11 Python
使用Python写一个贪吃蛇游戏实例代码
2017/08/21 Python
MySQL适配器PyMySQL详解
2017/09/20 Python
python实现蒙特卡罗方法教程
2019/01/28 Python
python 处理数字,把大于上限的数字置零实现方法
2019/01/28 Python
使用python+whoosh实现全文检索
2019/12/09 Python
django自定义模板标签过程解析
2019/12/14 Python
Python concurrent.futures模块使用实例
2019/12/24 Python
python实现发送带附件的邮件代码分享
2020/09/22 Python
Python为何不支持switch语句原理详解
2020/10/21 Python
你的自行车健身专家:FaFit24
2016/11/16 全球购物
KIKO MILANO荷兰网上商店:意大利专业化妆品品牌
2017/05/12 全球购物
什么是.net
2015/08/03 面试题
暑期培训心得体会
2014/09/02 职场文书
党员对照检查剖析材料
2014/10/13 职场文书
司法局群众路线教育实践活动整改措施思想汇报
2014/10/13 职场文书
2014年餐厅服务员工作总结
2014/11/18 职场文书
遗嘱范文
2015/08/07 职场文书
承诺书应该怎么写?
2019/09/10 职场文书
PHP基本语法
2021/03/31 PHP
粗暴解决CUDA out of memory的问题
2021/05/22 Python
vue/cli 配置动态代理无需重启服务的方法
2022/05/20 Vue.js