目录

  • 续上一篇
    • 6. 模板引擎的实现原理
      • 6.1 正则与字符串操作
        • 6.1.1 基本语法
        • 6.1.2 分组
        • 6.1.3 字符串的replace函数
        • 6.1.4 多次replace
        • 6.1.5 使用while循环replace
        • 6.1.6 replace替换为真值
      • 6.2 实现简易的模板引擎
        • 6.2.1 实现步骤
        • 6.2.2 定义模板结构
        • 6.2.3 预调用模板引擎
        • 6.2.4 封装 template 函数
        • 6.2.5 导入并使用自定义的模板引擎
  • 总结

续上一篇


6. 模板引擎的实现原理

在模板引擎内部用的最主要的技术就是正则表达式字符串替换的操作。

6.1 正则与字符串操作

这里补充一下正则和字符串的基本知识

6.1.1 基本语法

正则函数exec(),用于检索字符串中的正则表达式的匹配。
如果字符串中有匹配的值,则返回该匹配值,否则返回 null。

语法格式:

// RegExpObject 表示正则表达式
RegExpObject.exec(string)

代码示例

var str = 'hello'
var pattern = /o/       // 正则表达式
// 输出的结果["o", index: 4, input: "hello", groups: undefined]
console.log(pattern.exec(str))

6.1.2 分组

正则表达式中 () 包起来的内容表示一个分组,可以通过分组来提取自己想要的内容,示例代码如下

var str = '<div>我是{{name}}</div>'var pattern = /{{([a-zA-Z]+)}}/  // + 号表示任意多个var patternResult = pattern.exec(str)console.log(patternResult)// 得到 name 相关的分组信息// ["{{name}}", "name", index: 7, input: "<div>我是{{name}}</div>", groups: undefined]

正则/{{([a-zA-Z]+)}}/里的小括号()代表提取分组。

6.1.3 字符串的replace函数

replace() 函数用于在字符串中用一些字符替换另一些字符,语法格式如下:

// 将1、2、3替换为a、b、c
var result = '123456'.replace('123', 'abc') // 得到的 result 的值为字符串 'abc456'

代码示例

var str = '<div>我是{{name}}</div>'
var pattern = /{{([a-zA-Z]+)}}/var patternResult = pattern.exec(str)
str = str.replace(patternResult[0], patternResult[1]) // replace 函数返回值为替换后的新字符串
// 输出的内容是:<div>我是name</div>
console.log(str)

6.1.4 多次replace

代码示例

var str = '<div>{{name}}今年{{ age }}岁了</div>'var pattern = /{{\s*([a-zA-Z]+)\s*}}/// 第一次匹配var res1 = pattern.exec(str)str = str.replace(res1[0], res1[1])console.log(str)// 第二次匹配var res2 = pattern.exec(str)str = str.replace(res2[0], res2[1])console.log(str)// 第三次匹配var res3 = pattern.exec(str)console.log(res3)</script>

\s* 表示空字符串,出现一次或多次。

6.1.5 使用while循环replace

代码示例:

<script>var str = '<div>{{name}}今年{{ age }}岁了</div>'var pattern = /{{\s*([a-zA-Z]+)\s*}}/var patternResult = nullwhile (patternResult = pattern.exec(str)) {str = str.replace(patternResult[0], patternResult[1])}console.log(str) // 输出 <div>name今年age岁了</div></script>

控件台输出:

6.1.6 replace替换为真值

代码示例:

 <script>var data = {name: '张三',age: 20}var str = '<div>{{name}}今年{{ age }}岁了</div>'var pattern = /{{\s*([a-zA-Z]+)\s*}}/var patternResult = nullwhile ((patternResult = pattern.exec(str))) {// 模板引擎的核心代码str = str.replace(patternResult[0], data[patternResult[1]])}console.log(str)  // 输出:<div>张三今年20岁了</div></script>

控制台输出:

6.2 实现简易的模板引擎

6.2.1 实现步骤

  • 定义模板结构;
  • 预调用模板引擎;
  • 封装 template 函数;
  • 导入并使用自定义的模板引擎;

6.2.2 定义模板结构

模板代码示例:

 <div id="user-box"></div><!-- 定义模板结构 --><script type="text/html" id="tpl-user"><div>姓名:{{name}}</div><div>年龄:{{ age }}</div><div>性别:{{ gender}}</div><div>住址:{{address }}</div></script>

6.2.3 预调用模板引擎

js代码示例:

 <!-- 预调用模板引擎 --><script>// 定义数据var data = { name: '张三疯',age: 128,gender: '男',address: '湖北武当山' }// 调用模板函数var  htmlStr  =  template('tpl-user', data)// 渲染HTML结构document.getElementById('user-box').innerHTML = htmlStr</script>

页面渲染:

6.2.4 封装 template 函数

代码:

 // 封装template函数function  template(id,  data)  {  var  str  =  document.getElementById(id).innerHTML  var  pattern  =  /{{\s*([a-zA-Z]+)\s*}}/ var  pattResult  =  null  while  ((pattResult  =  pattern.exec(str)))  {    str  =  str.replace(pattResult[0],  data[pattResult[1]])  }  return  str}

6.2.5 导入并使用自定义的模板引擎

<head><meta charset="UTF-8"  /><meta name="viewport"  content="width=device-width, initial-scale=1.0"  /><meta http-equiv="X-UA-Compatible"  content="ie=edge"  /><title>自定义模板引擎</title><!-- 导入自定义的模板引擎 --><script src="./js/template.js"></script>
</head>

总结

上一篇:前端_网页编程 Form表单与模板引擎(中)

前端_网页编程 Form表单与模板引擎(下)相关推荐

  1. 前端_网页编程 Form表单与模板引擎(中)

    目录 ... ... (续上篇) 四.模板引擎的基本概念 1.定义 2. 优点 五.art-template模板引擎 1.art-template模板引擎介绍 2. art-template的安装 3 ...

  2. 前端_网页编程 Form表单与模板引擎(上)

    目录 一.form表单的基本使用 1. 什么是表单? 2. 表单的组成部分 3. < form>标签的基本属性 3.1 action 3.2 target 3.3 method 3.4 e ...

  3. Form表单及模板引擎

    Form表单及模板引擎 什么是Form表单 Form表单的一些属性 表单的同步提交及优缺点 通过Ajax提交表单数据 JQuery的监听表单提交事件 取消表单默认提交行为 快速获取表单中的数据 模板引 ...

  4. form表单与模板引擎

    form表单与模板引擎 一.form表单的基本使用 1.1 什么是表单 1.2 表单的组成部分 1.3 <form>标签的属性 1.4 表单的同步提交及缺点 二.通过ajax提交表单数据 ...

  5. 前后端交互之form表单和模板引擎

    目录 一.Form表单 1.1 标签属性 1.1.1 action 1.1.2 target 1.1.3 method 1.1.4 enctype 1.2 表单的同步提交及缺点 1.3 通过Ajax提 ...

  6. 前后端交互:form表单与模板引擎

    目录 form表单 基础知识 概念 组成 常用属性 表单同步提交 概念 缺点 表单事件监听 submit监听方式 on监听方式 阻止表单默认行为 serialize 快速获取表单提交的数据 模板引擎 ...

  7. 前端_网页编程 Ajax加强

    目录 内容 一.XMLHttpRequest的基本使用 1. 什么是XMLHttpRequest 2. 使用xhr发起GET请求 3. xhr对象的readyState属性 4. 使用xhr发起带参数 ...

  8. 前端学习--Ajax(2) form表单

    一.form表单 组成:表单标签.表单域(采集信息).表单按钮(提交) 1.1 <form>的属性 action -- 向何处发送表单数据 如果不写默认是当前页面url target -- ...

  9. 【前端】Ajax-form表单与模板引擎

    目录 一.form表单的基本使用 1.1什么是表单 1.2表单的组成部分 1.3form标签属性 1.4表单的同步提交及缺点 1.4.1什么是表单的同步提交 1.4.2表单同步提交的缺点 1.4.3如 ...

最新文章

  1. 计算机科学基础知识(六)理解栈帧
  2. 查看selenium python的api小记录
  3. python通信编程_python 通信编程
  4. 2019.04.13 - 19:34
  5. SharePoint PowerShell 批量删除遗弃视图
  6. maven 加入第三方库_添加第三方库到Maven资源库
  7. 高中毕业 84 岁奶奶自学编程受邀参加 WWDC,人生从来没有太晚!
  8. 第 6 章 本地方法接口
  9. C++模板函数/类示例
  10. myisam为什么比innodb查询快_mysql存储引擎之MyISAM 和 InnoDB的比较
  11. 信号检测与估计c语言,清华大学出版社-图书详情-《信号检测与估计(第2版)》...
  12. QQ空间自动删除说说的js脚本(亲测有效)
  13. C++ 详解快速排序代码
  14. 进入mariadb_MariaDB基本命令
  15. EDK2编译环境搭建、编译、在模拟器运行、在笔记本运行(带目录版本)
  16. 开展922绿色出行活动 加强城市绿色交通安全管理
  17. python小助手_如何用python写个人专属群聊提醒小助手?
  18. html背景多图片拼接,将多个图片整合到一张图片中再用css_进行网页背景定位.
  19. 微软Skype开始采用全新图标 淘汰云朵图案
  20. 分布式架构之网络通信

热门文章

  1. 转载:tcpdump抓包和Wireshark解包
  2. influxDb 异常:{“error“:“retention policy not found: default“}
  3. MyBatis之使用resultMap实现高级映射
  4. socket网络编程实现远程备份
  5. SparkStreaming 异常:java.lang.NoSuchMethodError: scala.Predef scope()Lscala/xml/TopScope
  6. 媒体智能-淘宝直播流媒体互动实践 | D2 分享视频+文章
  7. 阿里云HBase增强版全文索引功能技术解析
  8. 从国际站 - M 站建设谈开发者产品思维
  9. 支付宝的商业与技术创新双轮驱动 创造数字时代普惠金融“奇迹”
  10. 530并行日:用超算更省心