思路:将dom节点转换为json数据,其实是从上到下转换,首先获取该节点,然后分别使用tagName、attributes、childNodes获取元素的标签名、元素的属性集合(name、value)、元素的子节点 集合,然后再分别使用nodeType、textContent判断元素的节点类型、文本内容。

<body>
    <div id="jsContainer">
        <ul class="js-test" id="jsParent">
            <li data-index="0">1</li>
            <li data-index="1">2</li>
        </ul>
        <span style="font-weight: bold;">3</span>
        4
    </div>
    <script type="text/javascript">
        function dom2json() {
            const jsContainer=document.getElementById('jsContainer')
            var res=createObj(jsContainer)
            console.log(res)
            return res
}
    function createObj(element)
    {
        //创建空对象
        const obj={}
        //获取标签名称
        obj.tag=element.tagName.toLowerCase()
        //获取属性
        var attribute={}
        Array.from(element.attributes).forEach(attr=>{
            var name = attr.name
            var value = attr.value
            attribute[name]=value
        })
        obj.attributes=attribute
        //获取子节点
        var children=[]
        Array.from(element.childNodes).forEach(node=>{
            if(node.nodeType===1)
                children.push(createObj(node))
            else if(node.nodeType===3)
            {
                var content=node.textContent.trim()
                if(content!=="")
                {
                    children.push({tag:'text',content:content})
                }
            }
        })
        obj.children=children
        return obj
    }
    dom2json()
    </script>
</body>

总结:tagName(标签名称)代表DOM节点的标签名称;attributes(属性)代表DOM节点的属性集合;nodeType(节点类型)表示DOM节点的类型,1代表元素节点,3代表文本节点;textContent(文本内容)代表DOM节点的文本内容,当节点类型是文本节点(nodeType为3)时,textContent属性表示该文本节点包含的文本内容。

注意:和JS40是互逆操作!!!