如何利用模板将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 Bar Indicator 插件实现进度条展示效果
Sep 30 Javascript
js如何实现淡入淡出效果
Nov 18 Javascript
angular ngClick阻止冒泡使用默认行为的方法
Nov 03 Javascript
Javascript中字符串相关常用的使用方法总结
Mar 13 Javascript
详解刷新页面vuex数据不消失和不跳转页面的解决
Jan 30 Javascript
vue短信验证性能优化如何写入localstorage中
Apr 25 Javascript
Bootstrap4 gulp 配置详解
Jan 06 Javascript
详解vue中axios请求的封装
Apr 08 Javascript
详解Vuex下Store的模块化拆分实践
Jul 31 Javascript
vue中组件通信的八种方式(值得收藏!)
Aug 09 Javascript
javascript实现函数柯里化与反柯里化过程解析
Oct 08 Javascript
vue组件开发之slider组件使用详解
Aug 21 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实现今天是星期几的几种写法
2013/09/26 PHP
php使用codebase生成随机数
2014/03/25 PHP
PHP采用get获取url汉字出现乱码的解决方法
2014/11/13 PHP
php判断当前操作系统类型
2015/10/28 PHP
PHP数组游标实现对数组的各种操作详解
2016/01/26 PHP
php与c 实现按行读取文件实例代码
2017/01/03 PHP
PHP进阶学习之依赖注入与Ioc容器详解
2019/06/19 PHP
jQuery checkbox全选/取消全选实现代码
2009/11/14 Javascript
三级下拉菜单的js实现代码
2011/05/23 Javascript
修改jQuery Validation里默认的验证方法
2012/02/14 Javascript
treepanel动态加载数据实现代码
2012/12/15 Javascript
类似天猫商品详情随浏览器移动的示例代码
2014/02/27 Javascript
jQuery对于显示和隐藏等常用状态的判断方法
2014/12/13 Javascript
javascript断点调试心得分享
2016/04/23 Javascript
jquery.serialize() 函数语法及简单实例
2016/07/08 Javascript
js实现彩色条纹滚动条效果
2017/03/15 Javascript
浅谈angular2路由预加载策略
2017/10/04 Javascript
vue 实现 ios 原生picker 效果及实现思路解析
2017/12/06 Javascript
详解ES6中的Map与Set集合
2019/03/22 Javascript
详解a标签添加onclick事件的几种方式
2019/03/29 Javascript
使用vue自定义指令开发表单验证插件validate.js
2019/05/23 Javascript
关于微信小程序map组件z-index的层级问题分析
2019/07/09 Javascript
微信小程序连接服务器展示MQTT数据信息的实现
2020/07/14 Javascript
JavaScript构造函数原理及实现流程解析
2020/11/19 Javascript
[48:24]完美世界DOTA2联赛PWL S3 Forest vs INK ICE 第一场 12.09
2020/12/12 DOTA
python实现360的字符显示界面
2014/02/21 Python
python实现简单的计时器功能函数
2015/03/14 Python
Python管理Windows服务小脚本
2018/03/12 Python
ubuntu系统下使用pm2设置nodejs开机自启动的方法
2018/05/12 NodeJs
Pytorch加载部分预训练模型的参数实例
2019/08/18 Python
美国女孩服装购物网站:Justice
2017/03/04 全球购物
台湾旅游网站:雄狮旅游网
2017/08/16 全球购物
如何开启linux的ssh服务
2015/02/14 面试题
爷爷追悼会答谢词
2014/01/24 职场文书
珠宝的促销活动方案
2014/08/31 职场文书
2015年教师节贺卡寄语
2015/03/24 职场文书