// 劫持节点并转化为文档片段 functionnode2Fragment(node, vm) { var flag = document.createDocumentFragment() var child while (child = node.firstChild) { // 编译每个节点,直到node下无子节点 compile(child, vm) flag.appendChild(child) // appendchild方法会自动删除node的child节点(子节点有且仅有一个父节点) } return flag // 返回填充后的文档片段 }
// 编译节点 functioncompile(node, vm) { var reg = /\{\{(.*)\}\}/ if (node.nodeType === 1) { // 元素节点 var attr = node.attributes for (var i = 0; i < attr.length; i++) { if (attr[i].nodeName == 'v-model') { var name = attr[i].nodeValue.trim() node.value = vm.data[name] } } }; if (node.nodeType === 3) { // 文本节点 if (reg.test(node.nodeValue)) { var name = RegExp.$1.trim() node.nodeValue = vm.data[name] } } }
// 创建Vue对象 functionVue(options) { this.data = options.data var node = document.getElementById(options.el) var dom = node2Fragment(node, this) // 将dom片段添加到目标元素 node.appendChild(dom) }
functioncompile(node, vm) { var reg = /\{\{(.*)\}\}/ if (node.nodeType === 1) { var attr = node.attributes for (var i = 0; i < attr.length; i++) { if (attr[i].nodeName == 'v-model') { var name = attr[i].nodeValue.trim() node.addEventListener('input', function(e) { vm[name] = e.target.value }); node.value = vm[name] } } }; if (node.nodeType === 3) { if (reg.test(node.nodeValue)) { var name = RegExp.$1.trim() new Watcher(vm, node, name) // 初始化数据并添加订阅者 } } }