每个节点都有一个 nodeType 属性,用于表明节点的类型,节点类型由 Node 类型中定义12个常量表示:

 nodeType在vue中的应用

在vue编译的过程中需要查找html结构中的双大括号,或者@事件等代表vue中的数据及方法的属性值,通过编译将查找到的部分使用vue实例中的属性或方法替换

class Compile {
// el是宿主元素选择器
// vm是KVue实例
constructor(el, vm) {
this.$vm = vm; this.$el = document.querySelector(el); // 先把模板移动到fragment标签中,更新完成后在追加回来
this.$fragment = this.node2Fragment(this.$el);
// 执行编译
this.compile(this.$fragment);
// 追加
this.$el.appendChild(this.$fragment);
} node2Fragment(el) {
// 移动操作
const fragment = document.createDocumentFragment();
let child;
while(child = el.firstChild) {
// 移动操作
fragment.appendChild(child);
}
return fragment
} // 递归el,分别处理文本节点和元素节点
compile(el) {
const childNodes = el.childNodes;
Array.from(childNodes).forEach(node => {
if (node.nodeType == 1) {
// 元素节点 <p k-text="abc" @click="onClick"></p>
// console.log('元素节点:'+node.nodeName);
this.compileElement(node);
} else if (this.isInter(node)) {
// 文本节点,且内容是{{xxx}}实行
// console.log('插值文本:'+node.textContent);
this.compileText(node);
} // 递归子节点
if (node.childNodes && node.childNodes.length > 0) {
this.compile(node);
}
}) }
// 文本节点,且内容是{{xxx}}实行
isInter(node) {
return node.nodeType == 3 && /\{\{(.*)\}\}/.test(node.textContent)
} // 编译元素节点
compileElement(node) {
// 遍历所有属性
const nodeAttrs = node.attributes;
Array.from(nodeAttrs).forEach(attr => {
// 规定:指令以k-xxx="yyy"命名
const attrName = attr.name; // 属性名称 k-xxx
const exp = attr.value;// 属性值 yyy
if (attrName.indexOf('k-') == 0) {
const dir = attrName.substring(2);
// 执行指令解析
this[dir] && this[dir](node, exp)
}
})
}
compileText(node) {
const exp = RegExp.$1;
this.update(node, exp, 'text');
} // 通用update方法
update(node, exp, dir) {
// 获取更新函数
let updator = this[dir + 'Updator'];
// 初始化,首次页面赋值
updator && updator(node, this.$vm[exp]); // 创建Watcher
new Watcher(this.$vm, exp, function(value) {
updator && updator(node, value);
})
} textUpdator(node, value) {
node.textContent = value;
} text(node, exp) {
this.update(node, exp, 'text')
} html(node, exp) {
this.update(node, exp, 'html')
}
htmlUpdator(node, value) {
node.innerHTML = value;
}
}

以上是简单的进行属性查找的示例,通过nodeType为1来判断是元素节点,还是文本节点并进行相应的操作。

最新文章

  1. oracle远程连接配置
  2. 图片延迟加载jquery插件imgLazyLoading
  3. [Asp.net MVC]Asp.net MVC5系列——添加视图
  4. ASM:《X86汇编语言-从实模式到保护模式》第14章:保护模式下的特权保护和任务概述
  5. UIPage
  6. Lotus防病毒与数据备份案例
  7. css 横向渐变 图片阴影效果 字体模糊效果
  8. FusionCharts参数说明-----3D饼图属性(Pie3D.swf )
  9. shell脚本实现仅保留某目录下最新的两个文件
  10. mysql 中 LIMIT的简单用法
  11. VS2008 如何将Release版本设置可以调试的DEBUG版本
  12. Delphi如何处理在进行大量循环时,导致的应用程序没有响应的情况
  13. Quartz动态修改数据库cronExpression(无须重启服务器即可更改定时时间)
  14. px em rem 区别
  15. ZOJ 1314 Reactor Cooling | 上下界无源汇可行流
  16. linux top命令看到的实存(RES)与虚存(VIRT)分析
  17. JDBC 与 Bean Shell的使用(一)获取值,并且传递
  18. SpringMVC中注解控制器及数据绑定
  19. struts2——上传图片格式
  20. loj2045 「CQOI2016」密钥破解

热门文章

  1. ESA2GJK1DH1K基础篇: Android连接MQTT简单的Demo
  2. 蒟蒻所见之DP
  3. python总结三
  4. 图文详解如何使用VMWare创建一套虚拟机“集群”
  5. javascript系列--认识并理解构造函数,原型和原型链
  6. 【layui】日期选择一闪而过问题
  7. shell备份,重命名,删除目录下面的文件
  8. .Net Core 基于 SnmpSharpNet 开发
  9. Python3第三方组件最新版本追踪实现
  10. FusionInsight大数据开发---HDFS应用开发