简易js模板引擎

前阵子参考别人的文章自己理解了一下模板引擎的实现,虽然是照着敲了一边,但是自己也加深了理解吧。

原文链接

自己的代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>表达式</title>
</head>
<body><div id="app"><% if(this.age>34) {%><p>我的年龄是<% this.age %></p><% } %><div><% name %></div><% for(var m=0;m< this.list.length;m++){ %><p><% this.list[m] %></p><% } %><ul><% for(var pro=0;pro< this.skills.length; pro++){ %><li style="font-size:<% this.age%>px;"><% for(var cit=0;cit< this.skills[pro].city.length;cit++){ %><span><% cit+1 %>:<%  this.skills[pro].city[cit] %></span><% } %></li><% } %></ul>
</div>
<script>/*src:http://www.jb51.net/article/52491.htm* 一个字符串是由n个字符组成的。在每个字符之前和之后,都有一个空字符。这样,一个由n个字符组成的字符串就有n+1个空字符串。我们来看一下“ABhedeCD”这个字符串:* 所有的e编号的位置都是空字符。表达式(?!hede).会往前查找,看看前面是不是没有“hede”字串,如果没有(是其它字符),那么.(点号)就会匹配这些其它字符。这种正则表* 达式的“查找”也叫做“zero-width-assertions”(零宽度断言),因为它不会捕获任何的字符,只是判断。在上面的例子里,每个空字符都会检查其前面的字符串是否不是‘hede',* 如果不是,这.(点号)就是匹配捕捉这个字符。表达式(?!hede).只执行一次,所以,我们将这个表达式用括号包裹成组(group),然后用*(星号)修饰——匹配0次或多次:* */let str = `I'm singing while you're dancing.`;let reg = /\b\w+(?=ing)/g;function render(tpl, data) {tpl = tpl.replace(/>/g, '>').replace(/</g, '<');tpl = tpl.replace(/(\n*)/g, '');var reg = /<%([^%>]+)?%>/g;var reg=/<%([^%>]|((?!%>).)*)%>/gvar code = 'var r=[];\n',cursor = 0,match;var reg2 = /(for|{|}|if|else|break|switch|case).*/;var add = function (line, js) {if (!js) {var mm = line.replace(/"/g, '\\"');code += 'r.push("' + mm + '");\n';// 把匹配的第一个标签放进数组如<p>,以字符串的形式} else {if (reg2.test(line)) {code += line + '\n';} else {code += 'r.push(' + line + ');\n';}// 例如tpl=<p><%name%></p>// match[0]为<%name%>,cursor=0,match.index=3,下一次是11 也就是从</p>的< 开始}}while (match = reg.exec(tpl)) {// match[1]匹配的变量名字add(tpl.slice(cursor, match.index))add(match[1], true);cursor = match.index + match[0].length;console.log(tpl.slice(cursor, match.index))}code += 'r.push("' + tpl.substr(cursor, tpl.length - cursor) + '");\n';code += 'return r.join("")';console.log(code)var result = new Function(code.replace(/[\r\t\n]/g, '')).apply(data);return result;}let data = {name: 'zxf',age: 35,list: ['1', '2', '3'],showSkills: true,skills: [{name:'河南',city:['郑州','洛阳','新乡']},{name:'广州',city:['深圳','东莞','揭阳']}],}document.querySelector('#app').innerHTML = render(  document.querySelector('#app').innerHTML, data)
</script>
</body>
</html>

  

转载于:https://www.cnblogs.com/fantasy-zxf/p/8144475.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/267832.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

五款常用邮件管理系统评测

以邮件为主要沟通媒介的外贸企业&#xff0c;对邮件的依赖性可以说已经达到不能或缺的地步。软件厂商们深谙这一定律&#xff0c;为外贸企业提供了种类庞大的软件系统以供选择。以下笔者抽出其中五款使用较为普遍的邮件管理系统&#xff0c;根据其性能、系统稳定性、性价比等方…

for each java_Java 实例 - for 和 foreach循环使用

Java 实例 - for 和 foreach循环使用for 语句比较简单&#xff0c;用于循环数据。for循环执行的次数是在执行前就确定的。语法格式如下&#xff1a;for(初始化; 布尔表达式; 更新) {//代码语句}foreach语句是java5的新特征之一&#xff0c;在遍历数组、集合方面&#xff0c;for…

EditPlus 注册码在线生成

虽然editplus现在不常用&#xff0c;但是它轻便&#xff0c;我还是很喜欢的&#xff0c;推荐一个注册码生成器&#xff0c;真是好好用 http://www.jb51.net/tools/editplus/ 点击链接输入自己想要的用户名&#xff0c;就能自动生成了&#xff0c;相当方便。转载于:https://www.…

如何启用 Ubuntu 中的 root 帐号

执行下面的操作&#xff1a; sudo passwd root 此命令将会重新设置 root 的密码&#xff0c;按照提示输入新的密码&#xff0c;并加以确认。 之后&#xff0c;重启系统时&#xff0c;就可以用 root 登录了。 如果你想要禁用 root 帐号&#xff0c;则执行下列命令&#xff1a; …

java代码块的定义_Java几种代码块的定义与常见问题

Java几种代码块的定义与常见问题代码块&#xff0c;通俗的说就是用一对“{}”括起来的一段代码&#xff0c;代码块可以根据位置分为以下几类&#xff1a;局部代码块&#xff1a;局部代码块就是指直接在方法或是语句中定义的代码块&#xff0c;请看如下范例&#xff1a;package …

gradle各版本下载地址

gradle各版本下载地址 原创 2016年08月16日 11:17:25标签&#xff1a;gradle更新 /android studio59713gradle各版本下载地址&#xff1a;http://services.gradle.org/distributions 以前都是手动下载gradle的文件&#xff0c;然后修改的&#xff0c;今天想从一些博客网站上下载…

SUSE中LVM的使用心得

一、服务器分区规划(按100个商务群规划&#xff0c;可扩展) myvg卷组容量&#xff0d;&#xff0d;700G(硬盘空间的80%左右) /boot 100M 用于系统启用需要的空间 / 20G 用于放置一些系统用户文件 /usr 150G    用于tomcat&#xff1a;发布程序…

thinkphp 5数据库操作

1、原生sql $optionsDb::table(__MALL_POST__) ->alias(m) ->join(__MALL_CATEGORY_VALUE__ v,m.id v.itemid) ->join(__MALL_CATEGORY_OPTION__ o,v.oid o.oid) ->where(m.id,$articleId) ->select(); 参见 &#xff1a;https://www.kancloud.cn/manual/thin…

使用CRT调试内存分配堆来找出未释放的内存空间

忘记释放已经分配的内存是一种常见的编程错误&#xff0c;当然我指的是在C编程当中&#xff0c;例如下面的代码里面就存在一个忘记释放内存的编程错误。我个人觉得忘记释放内存的编程错误是不可避免的&#xff0c;毕竟程序员都是人&#xff0c;困了&#xff0c;心情不好了&…

java bean工厂_从零构建轻量级Java Web框架

Bean工厂回顾下前面的知识&#xff0c;通过加载配置文件获取应用基础包名&#xff0c;加载基础包名下所有的类&#xff0c;获取Controller,Service类。到目前为止&#xff0c;我们只是加载了类&#xff0c;但是无法通过获取的类来实例化对象。因此需要一个反射工具&#xff0c;…

生活

爱上旁白&#xff0c;爱上娓娓道来&#xff0c;爱上有故事的声音。无需任何背景音乐&#xff0c;只想细细体验独有的味道转载于:https://www.cnblogs.com/Fsiswo/p/8167756.html

int指令01 - 零基础入门学习汇编语言64

第十三章&#xff1a;int指令01 让编程改变世界 Change the world by program 引言 在第12章中&#xff0c;我们讲解了中断过程和两种内中断的处理。 这一章中&#xff0c;我们讲解另一种重要的内中断&#xff0c;由int指令引发的中断。 万众瞩目&#xff0c;是什么呢&am…

JAVA中常用的逻辑运算符_Java中的常见运算符以及使用

Java中的运算符有算术运算符、关系运算符、逻辑运算符、赋值运算符、字符串连接运算符、三目运算符等。下面介绍一下这几种。1、算术运算符包括&#xff1a;加()、减(-)、乘(*)、除(/)、取余(%)、自加()、自减(--)。<1>使用乘法时&#xff0c;需注意乘积结果是否会出现溢…

【2016计概A期末】照亮房间

你需要放置一盏灯来照亮房间的每个角落&#xff0c;问这是否能办到&#xff1f; 输入包含多组数据。 每组数据第一行是正整数n(4<n<100)&#xff0c;表示房间轮廓所形成的多边形的顶点个数。 接下来n行&#xff0c;每行表示房间的一个顶点。 顶点按顺时针的顺序给出&…

Ext智能提示 - Spket(Eclipse插件)

Eclipse的Ext 2.0.2智能提示.它提供了非常准确的Ext API提示 最近在搞java的项目&#xff0c;哇哇&#xff0c;js如果没有插件的话&#xff0c;那写的真的叫痛苦&#xff0c;所以上网搜搜了&#xff0c;找到了一个插件&#xff0c;还不错&#xff0c;蛮好用的 首先下一个插…

JAVA fileupload怎么用_jquery.fileupload使用例子java

jsp页面信息如下&#xff0c;整个页面信息pageEncoding"utf-8" import"java.io.*"%>String path request.getContextPath();String basePath request.getScheme() "://" request.getServerName() ":" request.getServerPort()…

清高是有代价的

朋友C哥&#xff0c;才高八斗。虽然是记者出身&#xff0c;做过报社社长&#xff0c;但是老刘认为C哥之才&#xff0c;最重要的并非文章学问&#xff0c;而是做事之才、经营之才、管理之才。由报社社长至投资公司总裁&#xff0c;并完成某公司香港上市&#xff0c;被人誉为干了…

Java中常用的测试工具JUnit

使用步骤 1.新建一个test源文件夹&#xff08;SourceFolder&#xff09;&#xff0c;避免和业务代码的src混在一起 2.在test下新建JUnit Test Case 3.相关测试代码放到一个Test Case,每个小的测试代码搞一个测试的方法&#xff0c;方法上标记Test BeforeClass 标注BeforeClass的…

python pyqt eric_科学网—PyQt及Eric的安装 - 张鲁新的博文

PyQt及Eric的安装已有 10440 次阅读2010-4-16 13:19|个人分类:生活点滴|系统分类:科研笔记|Python, Eric, PyQtPython是功能很强大的脚本语言。Qt是跨平台的界面开发语言。二者的结合就是PyQt&#xff0c;而Eric则是由Python开发的一款支持PyQt的IDE。 Python目前有两个较大的版…

sharepoint对象模型性能比较

sharepoint的对象模型的属性和方法有多种&#xff0c;可能对于一些初学者不明白他们之间有什么区别&#xff0c;那种更优越&#xff0c;在何种情况下用那种属性或方法&#xff0c;通过这篇文章你会有所了解 1&#xff0c;splist 有些人喜欢通过列表的名字去获得列表&#xff0c…