UNPKG

avalon2

Version:

an elegant efficient express mvvm framework

96 lines (90 loc) 2.6 kB
import { avalon, createFragment } from '../seed/core' import { lookupOption, getSelectedValue } from '../directives/duplex/option' function getChildren(arr) { var count = 0 for (var i = 0, el; el = arr[i++];) { if (el.nodeName === '#document-fragment') { count += getChildren(el.children) } else { count += 1 } } return count } export function groupTree(parent, children) { children && children.forEach(function (vdom) { if (!vdom) return var vlength = vdom.children && getChildren(vdom.children) if (vdom.nodeName === '#document-fragment') { var dom = createFragment() } else { dom = avalon.vdom(vdom, 'toDOM') var domlength = dom.childNodes && dom.childNodes.length if (domlength && vlength && domlength > vlength) { if (!appendChildMayThrowError[dom.nodeName]) { avalon.clearHTML(dom) } } } if (vlength) { groupTree(dom, vdom.children) if (vdom.nodeName === 'select') { var values = [] getSelectedValue(vdom, values) lookupOption(vdom, values) } } //高级版本可以尝试 querySelectorAll try { if (!appendChildMayThrowError[parent.nodeName]) { parent.appendChild(dom) } } catch (e) { } }) } export function dumpTree(elem) { if (elem) { var firstChild while (firstChild = elem.firstChild) { if (firstChild.nodeType === 1) { dumpTree(firstChild) } elem.removeChild(firstChild) } } } export function getRange(childNodes, node) { var i = childNodes.indexOf(node) + 1 var deep = 1, nodes = [], end nodes.start = i while (node = childNodes[i++]) { nodes.push(node) if (node.nodeName === '#comment') { if (startWith(node.nodeValue, 'ms-for:')) { deep++ } else if (node.nodeValue === 'ms-for-end:') { deep-- if (deep === 0) { end = node nodes.pop() break } } } } nodes.end = end return nodes } export function startWith(long, short) { return long.indexOf(short) === 0 } var appendChildMayThrowError = { '#text': 1, '#comment': 1, script: 1, style: 1, noscript: 1 }