严格来讲不能说是MVC,应为模版里不能写逻辑语句。

灵感来源于我的上篇文字:《封装JSON数据转自定义HTML方法parseHTML》

这里再封装一个简单方法,在保持原来的方便改变不大的前提下,简单地根据数据长度,循环地翻译模版,再插入指定节点里;

只是觉得我的开发过程中很多时候要拼接字符串,拼接起来的字符串又难维护;

这个方法主要是为了提高以后编码的效率,开发过程中减少手工拼接字符串的重复劳动。

不是为了MVC而MVC;

来看看QQ网购首页的部分源码:

 <script type="text/html" id="floorMidCommTpl">
<%for(var i=0,j=arr.length;i<j;i++){%>
<li>
<a href="<%=arr[i].clickUrl%>" title="<%=arr[i].itemFullName%>" class="img_wrap" target="_blank"><img init_src="<%=arr[i].uploadPicUrl1%>" width="120" height="120" alt="<%=arr[i].itemFullName%>"/></a>
<div class="img_detail">
<p class="price_now">&yen;<%=(arr[i].activePrice/100).toFixed(2)%></p>
<p class="name"><a href="<%=arr[i].clickUrl%>" target="_blank"><%=arr[i].itemFullName%></a></p>
</div>
</li>
<%}%>
</script>

提供了丰富的语法支持,惊叹不已!!!

官方说其模版引擎压缩版才2kb,《高性能JavaScript模板引擎原理解析》

看了全篇文章,只能感叹作者的厉害,超出我的能力范围。

以后会继续反复看,不知道什么时候才能深入得理解!

看看我的方法吧:

1.模版例子,没有语法支持,也不打算以后支持。继续往下看,会对这个问题提供解决方法。

 <ul id="DemoTarget"></ul>
<script type="text/html" id="DemoTpl">
<li>姓名:{name}</li>
<li>性别:{sex}</li>
</script>
<ul id="DemoTarget"></ul>

这里需要加个结果插入节点,之前考虑直接用script.appendBefore()方式插入,

但是考虑在同一个位置可以反复插入数据,同时清除之前的结构,就多加一个条件。

2.数据例子:

var DemoJSON = [{
name: '蜡笔小新',
sex: 0
}, {
name: '小丸子',
sex: 1
}, {
name: '凹凸曼',
sex: -1
}];

3.调用方式

minTemplate.pro({
temp: 'DemoTpl',
target: 'DemoTarget',
json: DemoJSON,
filter: function (key, val) {
//如果是{sex}对应的数值返回相应的文字
if (key == 'sex') {
return ['保密', '男', '女'][val + 1];
}
return val;
}
});

filter回调函数,使得数据显示更加灵活, 一定意义上弥补了模版不支持逻辑的语句的缺点。

4.就这么简单,返回的结果是:

<ul id="DemoTarget">
<li>姓名:蜡笔小新</li>
<li>性别:男</li> <li>姓名:小丸子</li>
<li>性别:女</li> <li>姓名:凹凸曼</li>
<li>性别:保密</li>
</ul>

5.minTempate源码:

var minTemplate = {
temp:{},
target: {},
flag: false,
/**
* JSON数据转自定义HTML.
* @param {String} template 模版参数模版的变量名要与JSON的key值对应,
* 且模版的变量名要用"{}"包住。
* @param {Object} json JSON数据,只接收类似[{},{}...]格式的JOSN。
* @param {String} result 开头默认的字符串,也被内部递归利用。
* @param {Function} fn 回调函数前面两个参数分别对应json的,key 和 value
* @return {String} 返回转义的HTML。
*/
base: function (template, json, fn, result) {
result = result || '';
json = !this.flag ? json.slice(0) : json;//第一次递归前,克隆一个json
this.flag = true;
if (Object.prototype.toString.call(json) === '[object Array]') {
var first = json.shift();
result += template.replace(/\{([^{}]+)\}/g, function (match, key) {
return fn === undefined ? first[key] : fn(key, first[key]);
});
if(json.length !== 0){
return this.base(template, json, fn, result); //递归
}
this.flag = false;
return result;
} else {
alert('只接收数组形式的JSON数据!');
}
},
/**
* JSON数据转自定义HTML.
* @param {Object} config 配置具体参数如下:
* @config {String} temp 模版节点ID
* @config {String} traget 插入结果的节点ID
* @config {Object} json 需要转换的JSON数据,只接收类似[{},{}...]格式的JOSN。
* @config {Function} filter 结果筛选,函数前面两个参数分别对应json的,key 和 value
*/
pro: function (config) {
this.temp[config.temp] = this.temp[config.temp] || document.getElementById(config.temp)
this.target[config.target] = this.target[config.target] || document.getElementById(config.target);
this.target[config.target].innerHTML = this.base(this.temp[config.temp].innerHTML, config.json, config.filter);
}
};

原生JS不到30行,实现类似javascript MVC的功能-minTemplate的更多相关文章

  1. 30行代码实现Javascript中的MVC

    从09年左右开始,MVC逐渐在前端领域大放异彩,并终于在刚刚过去的2015年随着React Native的推出而迎来大爆发:AngularJS.EmberJS.Backbone.ReactJS.Rio ...

  2. js 小工具-- 原生 js 去除空格

    // 原生js 去除字符串空格 <script type="text/javascript"> String.prototype.trim = function (){ ...

  3. 原生JS实现下拉列表

    1 <div class="list"> 2 <ul> 3 <li> 4 <a href="#">Web部< ...

  4. 不到30行JS代码实现的Excel表格

    不到30行JS代码实现的Excel表格,jQuery并非不可替代 某国外程序员展示了一个由原生JS写成不依赖第三方库的,Excel表格应用,有以下特性: 由不足30行的原生JavaScript代码实现 ...

  5. 类似jQuery的原生JS封装的ajax方法

    一,前言: 前文,我们介绍了ajax的原理和核心内容,主要讲的是ajax从前端到后端的数据传递的整个过程. Ajax工作原理和原生JS的ajax封装 真正的核心就是这段代码: var xhr = ne ...

  6. 利用原生JS实现类似浏览器查找高亮功能(转载)

    利用原生JS实现类似浏览器查找高亮功能 在完成 Navify 时,增加一个类似浏览器ctrl+f查找并该高亮的功能,在此进行一点总结: 需求 在.content中有许多.box,需要在.box中找出搜 ...

  7. 用原生 JS 实现双向绑定及应用实例

    写在前面: 所谓的双向绑定,无非是从界面的操作能实时反映到数据,数据的变更也能实时展现到界面.angular封装了双向绑定的方法,使双向绑定变得十分简单.但是在有些场景下(比如下面那个场景),不能使用 ...

  8. 前端跨域问题相关知识详解(原生js和jquery两种方法实现jsonp跨域)

    1.同源策略 同源策略(Same origin policy),它是由Netscape提出的一个著名的安全策略.同源策略是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正 ...

  9. C#保留2位小数几种场景总结 游标遍历所有数据库循环执行修改数据库的sql命令 原生js轮盘抽奖实例分析(幸运大转盘抽奖) javascript中的typeof和类型判断

    C#保留2位小数几种场景总结   场景1: C#保留2位小数,.ToString("f2")确实可以,但是如果这个数字本来就小数点后面三位比如1.253,那么转化之后就会变成1.2 ...

随机推荐

  1. jmeter学习(1)基础支持+安装部署

    1. Apache jmeter 是100%的java桌面应用程序 支持的协议有:WEB-HTTP/HTTPS   , SOAP,   FTP,  JDBC,  LDAP, MAIL, MongoDB ...

  2. 20181023-3 每周例行报告(添加PSP)

    此作业要求:[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2100] 一.本周PSP表格 类型 任务 开始时间 结束时间 中断时间 净时 ...

  3. 20135202闫佳歆--week4 两种方式使用同一个系统调用--实验及总结

    实验四 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 在这里我选择的是第20号系统调用,getpid. 1.使用库函数API: 代码如下: /* getpid.c */ #incl ...

  4. Locality Sensitive Hashing,LSH

    1. 基本思想 局部敏感(Locality Senstitive):即空间中距离较近的点映射后发生冲突的概率高,空间中距离较远的点映射后发生冲突的概率低. 局部敏感哈希的基本思想类似于一种空间域转换思 ...

  5. ElasticSearch 2 (3) - Breaking Changes

    ElasticSearch 2.1.1 (3) - Breaking Changes Search Changes search_type = scan Deprecated GET /my_ind ...

  6. An ''all'' model group must appear in a particle with...问题解决记录

    场景: 最近在一个新项目的依赖包调整过程中,引入包之后,发现项目启动报错,一直启动不成功,经过查询和排查,发现是包对xml解析冲突的问题: 报错信息: [WARNING] Nested in org. ...

  7. Installing OpenSSH from the Settings UI on Windows Server 2019 or Windows 10 1809

    Installing OpenSSH from the Settings UI on Windows Server 2019 or Windows 10 1809 OpenSSH client and ...

  8. [转帖] k8s kubectl 命令行技巧

    https://jimmysong.io/posts/kubectl-cheatsheet/ Kubectl Cheatsheet kubectl命令技巧大全Posted on November 3, ...

  9. SpringBoot(十四)_springboot使用内置定时任务Scheduled的使用(一)

    为什么使用定时? 日常工作中,经常会用到定时任务,比如各种统计,并不要求实时性.此时可以通过提前设置定时任务先把数据跑出来,后续处理起来更方便. 本篇文章主要介绍 springboot内置定时任务. ...

  10. C# 多线程之Thread类

    使用System.Threading.Thread类可以创建和控制线程. 常用的构造函数有:   // 摘要: // 初始化 System.Threading.Thread 类的新实例,指定允许对象在 ...