all files / vtree/ fromDOM.js

100% Statements 39/39
93.55% Branches 29/31
100% Functions 3/3
100% Lines 39/39
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78        109×     588× 588×     134×           454× 454×           454×     24×   454× 56× 56× 38×   398× 356× 356× 479× 479× 460×       454×         454× 454× 380× 380×   380×     454× 39× 39× 39× 10×       454× 454×     454×   454×  
import { orphanTag } from './orphanTag'
import { voidTag } from './voidTag'
import { makeOrphan } from './makeOrphan'
 
export function fromDOM(dom) {
    return [from(dom)]
}
 
export function from(node) {
    var type = node.nodeName.toLowerCase()
    switch (type) {
        case '#text':
        case '#comment':
            return {
                nodeName: type,
                dom: node,
                nodeValue: node.nodeValue
            }
        default:
            var props = markProps(node, node.attributes || [])
            var vnode = {
                nodeName: type,
                dom: node,
                isVoidTag: !!voidTag[type],
                props: props
            }
            if(type === 'option'){
                //即便你设置了option.selected = true,
                //option.attributes也找不到selected属性
               props.selected = node.selected
            }
            if (orphanTag[type] || type === 'option') {
                makeOrphan(vnode, type, node.text || node.innerHTML)
                if (node.childNodes.length === 1) {
                    vnode.children[0].dom = node.firstChild
                }
            } else if (!vnode.isVoidTag) {
                vnode.children = []
                for (var i = 0, el; el = node.childNodes[i++];) {
                    var child = from(el)
                    if (/\S/.test(child.nodeValue)) {
                        vnode.children.push(child)
                    }
                }
            }
            return vnode
    }
}
 
var rformElement = /input|textarea|select/i
 
function markProps(node, attrs) {
    var ret = {}
    for (var i = 0, n = attrs.length; i < n; i++) {
        var attr = attrs[i]
        Eif (attr.specified) {
            //IE6-9不会将属性名变小写,比如它会将用户的contenteditable变成contentEditable
            ret[attr.name.toLowerCase()] = attr.value
        }
    }
    if (rformElement.test(node.nodeName)) {
        ret.type = node.type
        var a = node.getAttributeNode('value')
        if (a && /\S/.test(a.value)) { //IE6,7中无法取得checkbox,radio的value
            ret.value = a.value
        }
 
    }
    var style = node.style.cssText
    if (style) {
        ret.style = style
    }
    //类名 = 去重(静态类名+动态类名+ hover类名? + active类名)
    if (ret.type === 'select-one') {
        ret.selectedIndex = node.selectedIndex
    }
    return ret
}