如何利用模板将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使用ColorBox弹出图片组浏览层实例演示
Mar 14 Javascript
js控制input框只读实现示例
Jan 20 Javascript
TinyMCE提交AjaxForm获取不到数据的解决方法
Mar 05 Javascript
ReactJs设置css样式的方法
Jun 08 Javascript
vue axios 在页面切换时中断请求方法 ajax
Mar 05 Javascript
jQuery常见的遍历DOM操作详解
Sep 05 jQuery
vue实现添加与删除图书功能
Oct 07 Javascript
Nuxt升级2.0.0时出现的问题(小结)
Oct 08 Javascript
小程序封装路由文件和路由方法(5种全解析)
May 26 Javascript
django js 实现表格动态标序号的实例代码
Jul 12 Javascript
Vue-cli3项目引入Typescript的实现方法
Oct 18 Javascript
详解vue路由
Aug 05 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
图解上海144收音机
2021/03/02 无线电
Apache2 httpd.conf 中文版
2006/11/17 PHP
PHP编程过程中需要了解的this,self,parent的区别
2009/12/30 PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
2016/02/15 PHP
javaScript 判断字符串是否为数字的简单方法
2009/07/25 Javascript
js 自动播放的实例代码
2013/11/19 Javascript
解析JavaScript中的不可见数据类型
2013/12/02 Javascript
JS与C#编码解码
2013/12/03 Javascript
IE与FireFox的JavaScript兼容问题解决办法
2013/12/31 Javascript
javascript的解析执行顺序在各个浏览器中的不同
2014/03/17 Javascript
选择复选框按钮置灰否则按钮可用
2014/05/22 Javascript
form.submit()不能提交表单的错误原因及解决方法
2014/10/13 Javascript
JQuery插入DOM节点的方法
2015/06/11 Javascript
nodejs实现获取当前url地址及url各种参数值
2015/06/25 NodeJs
Nodejs学习item【入门手上】
2016/05/05 NodeJs
利用Angularjs和Bootstrap前端开发案例实战
2016/08/27 Javascript
ros::spin() 和 ros::spinOnce()函数的区别及详解
2016/10/01 Javascript
Bootstrap基本组件学习笔记之面板(14)
2016/12/08 Javascript
Vue-resource拦截器判断token失效跳转的实例
2017/10/27 Javascript
javascript实现小型区块链功能
2019/04/03 Javascript
详解JavaScript实现动态的轮播图效果
2019/04/29 Javascript
js实现图片推拉门效果代码实例
2019/05/18 Javascript
微信小程序scroll-view点击项自动居中效果的实现
2020/03/25 Javascript
[03:01]2014DOTA2国际邀请赛 DC:我是核弹粉,为Burning和国土祝福
2014/07/13 DOTA
MySQL最常见的操作语句小结
2015/05/07 Python
python绘制多个曲线的折线图
2020/03/23 Python
python爬虫之urllib库常用方法用法总结大全
2018/11/14 Python
python按照多个条件排序的方法
2019/02/08 Python
python代码 FTP备份交换机配置脚本实例解析
2019/08/01 Python
Python OpenCV视频截取并保存实现代码
2019/11/30 Python
用HTML5中的Canvas结合公式绘制粒子运动的教程
2015/05/08 HTML / CSS
html5清空画布方法(三种)
2017/10/16 HTML / CSS
公司门卫的岗位职责
2014/02/19 职场文书
2014年党的群众路线学习心得体会
2014/11/05 职场文书
入党自荐书范文
2015/03/05 职场文书
一文读懂navicat for mysql基础知识
2021/05/31 MySQL