简单实现一个模板引擎
2020-06-30 09:32
120 查看
html代码
<body> <div id="app"> <div>123<div>{{name}}</div>123 </div> <div> <div> <div> <div>{{age}}</div> </div> </div> </div> <div>{{gender}}</div> <div>{{height}}</div> </div> </body>
js代码
var data = { name:"yjt", age:18, gender:"man", height:"178" } var app = document.getElementById("app") function createFragment(app){ var fragment = document.createDocumentFragment() var child = app.firstChild while(child){ fragment.appendChild(child) child = app.firstChild } return fragment } var fragment = createFragment(app) var reg = /\{\{(.*)\}\}/ function compile(fragment){ var childNodes = fragment.childNodes childNodes.forEach(node => { if(isNode(node)){ compile(node) }else{ if(reg.test(node.textContent)){ var name = reg.exec(node.textContent)[1] node.textContent = node.textContent.replace(reg.exec(node.textContent)[0], data[name]) } } }); return fragment } function isNode(node){ return node.nodeType === 1 ? true:false } app.appendChild(compile(fragment))
总体思路:首先将页面的节点,全部添加到模拟的节点,等模拟的节点将模板全部替换完了,再一次插入,这主要就是为了减少dom更新的次数。主要就是有这两个函数
createFragment() 将app节点里的所有子节点添加到模拟节点fragment
compile() 遍历递归所有节点,如果是标签的就调用自己,用正则匹配所有文本节点的是否满足 {{变量名}} 的形式,如果满足替换,当所有都完成替换,将最终的模拟节点返回出去,再插入到app节点中
相关文章推荐
- 200行python代码实现一个类似django的简单模板引擎
- 【python】简单实现一个模板引擎
- 新手开发asp.net模板引擎(1): 一个简单的模板
- Juicer – 一个Javascript模板引擎的实现和优化
- 如何实现一个简单的工作流审批引擎
- 一步一步实现一个前端模板引擎
- MVC模式与模板引擎简单实现
- php实现简单视图模板(视图引擎)
- 一个利用CAN实现车辆控制的简单模板
- Juicer – 一个Javascript模板引擎的实现和优化
- 教你使用javascript简单写一个页面模板引擎
- php 编写一个简单的模板引擎
- 一个简单的seqlist的模板实现
- PHP实现简单的模板引擎功能示例
- 一行代码实现一个简单的模板字符串替换
- 如何实现一个简单的工作流审批引擎——请看
- 新手开发asp.net模板引擎(1): 一个简单的模板
- .net c# 一个简单但是功能强大动态模板引擎
- 一个简单的Java模板工具类(二)—简单表达式解析实现
- 教你使用javascript简单写一个页面模板引擎