利用模板将HTML从JavaScript中抽离

一、当需要注入大段的HTML标签到页面中时,应该使用服务器渲染(从服务器加载HTML标签)

该方法将模板放置于服务器中使用XMLHttpRequest对象来获取外部标签(如多页应用)

  1. function loadDialog(name, oncomplete) {
  2. var xhr = new XMLHttpRequest();
  3. xhr.open('get', '/js/dialog/'+name, true);
  4. xhr.onreadystatechange = function () {
  5. if(xhr.readyState == 4 && xhr.status == 200){
  6. var div = document.getElementById('dlg-holder');
  7. div.innerHTML = xhr.responseText;
  8. oncomplete();
  9. }else {
  10. //错误处理代码
  11. }
  12. };
  13. xhr.send(null);
  14. }
  15. //使用YUI的API
  16. function loadDialog(name, oncomplete) {
  17. Y.one('#dlg-holder').log('/js/dialog/'+name,oncomplete);
  18. }
  19. //使用JQuery的API
  20. function loadDialog(name, oncomplete) {
  21. $('#dlg-holder').load('/js/dialog/'+name, oncomplete);
  22. }

二、客户端模板

对于少量的标签段,应该考虑采用客户端模板。

客户端模板是一些带‘插槽’(占位符)的标签片段,这些占位符会被JavaScript程序(模板引擎)替换为数据,然后把该替换好的标签片段插入到页面中。

JavaScript程序(模板引擎)

自定义模板文本处理程序

  1. function sprintf(text){
  2. var i=1,args=arguments;
  3. return text.replace(/%s/g, function(){
  4. return (i<args.length) ? args[i++] : '';
  5. });
  6. }

模板文本存放位置

1.存放于HTML注释中

  1. <ul id = 'mylist'><!--<li id='item%s'><a href='%s'>%s</a></li>-->
  2. ...
  3. </ul>

因为注释也是一个DOM节点,因此可以通过JS将其提取出来:

  1. //格式化并插入DOM的方法定义
  2. function addItem(url,text){
  3. var mylist = document.getElementById('mylist');
  4. var templateText = mylist.firstChild.nodeValue; //提取模板文本
  5. var result = sprintf(templateText,url,text);
  6. div.innerHTML = result;
  7. mylist.insertAdjacentHTML('beforeend', result);
  8. }
  9. //调用方法
  10. addItem('/item/4', 'First item');
  11. addItem('/item/4', 'Second item');

2.存放于自定义type属性的script标签内

  1. <script type='text/x-my-template' id='list-item'>
  2. <li><a href='%s'>%s</a></li>
  3. </script>
  1. function addItem(url,text){
  2. var mylist = document.getElementById('mylist');
  3. var script = document.getElementById('list-item');
  4. var templateText = script.text; //提取模板文本
  5. var result = sprintf(templateText,url,text);
  6. var div = document.createElement('div');
  7. div.innerHTML = result.replace(/^\s*/,''); //去除模板文本的前导空格(因为它是在<script>标签的下一行)
  8. mylist.appendChild(div.firstChild);
  9. }

使用第三方的模板系统(如:artTemplate-3.0、Jade、Handlebars、doT.js)

以Handlebars为例:

Handlebars建议将模板存放于script标签内

  1. <script type='text/x-handlebars-template' id='list-item'>
  2. {{#if items}}
  3. <ul id='mylist'>
  4. {{#each items}}
  5. <li><a href='{{url}}'>{{text}}</a></li>
  6. {{/each}}
  7. </ul>
  8. {{/if}}
  9. </script>
  1. funtion addItem(url,text){
  2. var mylist = document.getElementById('mylist'),
  3. script = document.getElementById('list-item'),
  4. template = Handlebars.compile(script.text), //提取模板文本,返回格式化方法
  5. div = document.createElement('div'),
  6. result;
  7. result = template({text:text,url:url});
  8. div.innerHTML = result;
  9. mylist.appendChild(div.firstChild);
  10. }
  11. //调用
  12. addItem('/item/4,'First item');

利用模板将HTML从JavaScript中抽离的更多相关文章

  1. opengl学习-利用模板测试勾画物体轮廓中出现的一个问题

    我在学习OpenGL模板测试勾画物体轮廓的时候,出现了这个问题: 这个出现的原因就是,改变摄像机的时候,每次绘制,上次绘制中模板缓冲区的数据没有清除的原因.也就是在while循环开始的时候,glCle ...

  2. JavaScript中利用Ajax 实现客户端与服务器端通信(九)

    一:Ajax (Asynchronous JavaScript and XML)不是一个新的技术,事实上,它是一些旧有的成熟的技术以一种全新的更加强大的方式整合在一起 Ajax的关键技术: 1.使用X ...

  3. JavaScript中作用域回顾(避免使用全局变量)(瀑布流的实现)(scroll事件)以及Django自定义模板函数回顾

    页面显示照片样式为瀑布流: 上面的div个数可以按照自己安排进行划分.img的分布可以使用模板标签以及自定义模板函数进行排布: 自定义模板函数实现可以看,最后几列:python---django中模板 ...

  4. 如何在Javascript中利用封装这个特性

    对于熟悉C#和Java的兄弟们,面向对象的三大思想(封装,继承,多态)肯定是了解的,那么如何在Javascript中利用封装这个特性呢? 我们会把现实中的一些事物抽象成一个Class并且把事物的属性( ...

  5. think PHP5中,模板、控制器、JavaScript的url跳转重定向方法

    php控制器中的跳转: 1, header()函数是PHP中进行页面跳转的一种十分简单的方法.主要功能是将HTTP协议标头(header)输出到浏览器. header("Location: ...

  6. javaScript中利用ActiveXObject来创建FileSystemObject操作文件

    注:如果用javascript读本地文件,遇到安全问题. 需在浏览器中进行设置,如下:     工具—> Internet选项->安全->自定义级别->启用“没有标识为安全的A ...

  7. 利用arguments对象在javaScript中实现重载(overload)

    一些概念: 重载(overload): 什么是: 相同函数名,不同参数列表的多个函数,在调用时,可根据传入参数的不同,自动选择对应的函数调用! 为什么: 减轻调用者的负担,一个函数名,可执行多种操作 ...

  8. JavaScript中常见的十五种设计模式

    在程序设计中有很多实用的设计模式,而其中大部分语言的实现都是基于“类”. 在JavaScript中并没有类这种概念,JS中的函数属于一等对象,在JS中定义一个对象非常简单(var obj = {}), ...

  9. 简单分析JavaScript中的面向对象

    初学JavaScript的时候有人会认为JavaScript不是一门面向对象的语言,因为JS是没有类的概念的,但是这并不代表JavaScript没有对象的存在,而且JavaScript也提供了其它的方 ...

随机推荐

  1. 在centos7(EL7.3 即 kernel-3.10.0-514.X )上安装BCM4312无线网卡驱动要注意的问题

    我新装的centos7主机无法使用里面自带的网卡,查询后发现网卡型号为BCM4312.我在看资料安装的过程中遇到了些问题,纠结了好久,现在分享下要注意的点,为后来的遇到同样问题的人提供点帮助.现在开始 ...

  2. .NET Web开发技术简单整理

    在最初学习一些编程语言.一些编程技术的时候,做的更多的是如何使用该技术,如何更好的使用该技术解决问题,而没有去关注它的相关性.关注它的理论支持,这种学习技术的方式是短平快.其实工作中有时候也是这样,公 ...

  3. SQL Server 服务器磁盘测试之SQLIO篇(二)

    上次放出了一篇文章,针对磁盘卷簇大小默认4KB和自定义64KB进行了测试,测试内容为随机和顺序读写,大小为8KB和64KB,有人觉得这并没有照顾到SQL Server所有的IO使用情景.这篇测试文章, ...

  4. ABP源码分析十五:ABP中的实用扩展方法

    类名 扩展的类型 方法名 参数 作用 XmlNodeExtensions XmlNode GetAttributeValueOrNull attributeName Gets an   attribu ...

  5. 计算机人物系列-Mauchly,Eckert,Goldstine

    关键词:莫尔学院(Moore School),阿伯丁试验场(Aberdeen Proving Ground), 雷明顿兰德公司(Remington Rand Corporation), IBM院士(I ...

  6. 设计模式之迪米特原则(LOD)(最少知识原则)

    来源:迪米特法则(LoD)最初是用来作为面向对象的系统设计风格的一种法则,是很多著名系统,如火星登陆软件系统.木星的欧罗巴卫星轨道飞船的软件系统的指导设计原则. 迪米特法则(LoD)又可分为两种:狭义 ...

  7. .Net中的RealProxy实现AOP

    序言 这个AOP要从我们公司的一个事故说起,前段时间公司的系统突然在乌云中出现,数据被泄露的一览无余,乌云上显示是SQL注入攻击.呵,多么贴近生活的一个露洞,可谓是人尽皆知啊.然而却华丽丽的给拉我们一 ...

  8. C++服务器开发之基于对象的编程风格

    Thread.h #ifndef _THREAD_H_ #define _THREAD_H_ #include <pthread.h> #include <boost/functio ...

  9. 从接口、抽象类到工厂模式再到JVM来总结一些问题

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习! 涉及到的知识点总结如下: 为什么使用接口? 接口和抽象类的区别 简单工厂模式总结 Java中new和newInstance的区别 J ...

  10. 从N个元素的集合中随机取m个元素的算法实现

    最近有一个需求,比较简单,就是如标题所说的,从N个元素中随机取m个元素,当然这m个元素是不能存在重复的.本以为这么简单的需求,应该有现成的工具类来实现,但是几次查找居然没找到(有知道的可以推荐下哈^_ ...