工作中使用前端模板引擎,如 artTemplate、jsRender,来替代拼接字符串。

可是直接把模板写在页面上会带来页面臃肿,模板无法重用,与 ASP.NET等后端语言语法冲突等问题。

所以将多个模板集成到一个静态文件就很有必要,同时还能利用静态文件的缓存特性。

最好还能实现按需加载,不执行渲染的话就不载入模板文件。

虽然有对应的工具可以将模板转为 javascript 代码存在 .js 文件中,但是 js 下的模板代码可读性太差,不考虑。

于是根据以上需求写了一个jQuery 插件 $.loadTemplates

(function (window, $) {
var tplCache = {},
ENG_JSRENDER = 'jsRender',
ENG_ARTTEMPLATE = 'artTemplate',
//判定使用的是哪个模板引擎
//暂时支持jsRender 和 artTemplate
tplEngine = ($.views && $.views.jsviews) ? ENG_JSRENDER : window.template ? ENG_ARTTEMPLATE : '', Template = function (tplFile, templateTag) {
var loaded = false, callbacks = $.Callbacks(), _templates = {}; $.ajax(tplFile).done(function (data) {
var scripts = $(data).filter(templateTag || 'script'); scripts.each(function () {
var id = this.id;
if (!id) return;
//预编译并缓存编译后的模板
//编译的时候要给定 id ,这样才能支持子模板嵌套
switch (tplEngine) {
case ENG_JSRENDER:
{
_templates[id] = $.templates(id, this.innerHTML).render[id];
break;
}
case ENG_ARTTEMPLATE:
{
_templates[id] = template.compile(id, this.innerHTML);
break;
}
}
}); loaded = true; //触发在文件载入完成前挂上的渲染事件
callbacks.fire();
}); this.render = function (tplId, json, helper) {
var def = $.Deferred(),
_render = function () {
var html;
switch (tplEngine) {
case ENG_JSRENDER:
{
html = $.render[tplId](json, helper);
break;
}
case ENG_ARTTEMPLATE:
{
if (helper) template.helper(helper);
html = _templates[tplId](json);
break;
}
}
def.resolve(html);
}; loaded ? _render() : callbacks.add(_render); return def.promise();
}; tplCache[tplCache] = this;
}; $.extend({loadTemplates: function (tplFile, templateTag) { return tplCache[tplFile] || new Template(tplFile, templateTag);
}});
})(window, jQuery);

$.loadTemplates 源码

var tpl = $.loadTemplates('template.html');
var json = {str:'this is test'};
var templateId = 'temp1';
tpl.render(templateId, json)
.done(function(html){
$('body').html(html);
});

使用例子

存在的问题:

1. 由于使用了$.ajax 加载,所以模板文件的缓存在开发过程中可能会带来困扰。

2. 对于 'template.html' 和 './template.html' 无法识别为同一个静态文件。(前端 url 的同一性判断谁能给解下惑)

前端模板文件化jQuery插件 $.loadTemplates的更多相关文章

  1. ASP.NET Core 2.1以上 Bootstrap 4前端模板文件,开发环境与发布环境前端模板 environment的使用

    笔者的前端文件如下 笔者增加Bootstrap 4 和 FontAwersome(字体图标),因为Bootsrap 4已经不再包含图标了. ASp.Net Core 中,通常在 _Layout.csh ...

  2. 设计一种前端数据延迟加载的jQuery插件(2)

    背景 最近看到很多网站都运用到了一种前端数据延迟加载技术,包括淘宝,新浪网等等,这样做的目的可以使得一些未显示的图片随 着滚动条的滚动进行延迟显示. 好处显而易见,可以减少前端对于图片的Http请求, ...

  3. 后端渲染html、前端模板渲染html,jquery的html

    作者:赵魏璇链接:https://www.zhihu.com/question/28725977/answer/116177149来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  4. Handlebars的基本用法 Handlebars.js使用介绍 http://handlebarsjs.com/ Handlebars.js 模板引擎 javascript/jquery模板引擎——Handlebars初体验 handlebars.js 入门(1) 作为一名前端的你,必须掌握的模板引擎:Handlebars 前端数据模板handlebars与jquery整

    Handlebars的基本用法 使用Handlebars,你可以轻松创建语义化模板,Mustache模板和Handlebars是兼容的,所以你可以将Mustache导入Handlebars以使用 Ha ...

  5. 个人博客制作如何选择前端模板 thinkcmf后台加载新模板 CSS js文件

    我们的博客后台已经搭建好了,接下来我就要选择一个合适的模板做自己的博客,首先要定位你的博客是做什么用的,是属于什么行业,根据自己博客的定位选择适合的模板. 如果你是设计师,又会前端设计开发,那就可以自 ...

  6. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_10-freemarker静态化测试-基于模板文件静态化

    把resource拷贝到test目录下 只保留文件夹结构和test1.ftl这个模板文件就可以了. 新建一个包 编写测试类 使用freemaker提供的方法生成静态文件 Configuration是i ...

  7. 上传数据、下载模板文件解决方案(前端:antd;后端:.Net Core WebAPI)

    一.Excel 模板下载 通过静态文件下载. 将模板文件放在根目录的 public 文件夹下备用. 下载事件方法如下:(通过临时生成一个 a 标签,触发后再移除) downLoadExcelModel ...

  8. 网站开发中很实用的 HTML5 & jQuery 插件

    这篇文章挑选了15款在网站开发中很实用的 HTML5 & jQuery 插件,如果你正在寻找能优化网站,使其更具创造力和视觉冲击,那么本文正是你需要的.这些优秀的 jQuery 插件能为你的网 ...

  9. 前端模板artTemplate,handlerbars的使用心得

    写前端页面肯定离不开模板渲染,就近期项目中用的两个前端模板做一些使用总结,顺便复习一下,也方便后面温故. 1,artTemplate 优点: 1,一般web端用得较多,执行速度通常是 Mustache ...

随机推荐

  1. CImg 读取jpg, png ,tif 等格式失败解决方案

    CImg homepage :http://cimg.sourceforge.net CImg 给出的一个简单的示例:http://cimg.sourceforge.net/reference/gro ...

  2. 二:java语法基础:

    1,关键字:其实就是某种语言赋予了特殊含义的单词. 保留字:其实就是还没有赋予特殊含义,但是准备日后要使用过的单词. 2,标示符:其实就是在程序中自定义的名词.比如类名,变量名,函数名.包含 0-9. ...

  3. ACM1997_汉诺栽塔VII

    #include <stdio.h> #include <iostream> #include <queue> #include <stdlib.h> ...

  4. 深入hibernate的三种状态【转载】

    这篇文章写得很好,举了很多例子. http://www.cnblogs.com/xiaoluo501395377/p/3380270.html

  5. jsp文件中的alert等等

    <script type="text/javascript"> alert("aa: ${message}") </script>

  6. 每天一道算法_6_I Think I Need a Houseboat

    今天的题目是I Think I Need a Houseboat 如下: Description Fred Mapper is considering purchasing some land in ...

  7. http://c7sky.com/works/css3slides/#1

    http://c7sky.com/works/css3slides/#1 css3 学习

  8. 移动开发框架,第【二】弹:Hammer.js 移动设备触摸手势js库

    hammer.js是一个多点触摸手势库,能够为网页加入Tap.Double Tap.Swipe.Hold.Pinch.Drag等多点触摸事件,免去自己监听底层touchstart.touchmove. ...

  9. 工厂模式 - 程序实现(java)

    09年5月CSDN一网友提出如下问题: 设计一个用于管理银行客户的类BankCustomer: 仅描述客户的几个重要方面: 帐号.身份证号.姓名.联系方式.密码.账户余额. 所有的成员变量均用priv ...

  10. Project Server 2013两个权限模型介绍

    Project Server 2013中无法使用“新建用户”功能? 当我们的Project Server 2013刚刚安装好时,在PWA的服务器设置中找不到新建用户的选项,是什么原因造成的呢? 原来是 ...