function dom2json() { //获取到dom对象 const jsContainer = document.querySelector("#jsContainer") console.log(jsContainer) console.log(typeof jsContainer) console.log(jsContainer.nodeName) //DIV console.log(jsContainer.nodeName.toLocaleLowerCase()) console.log(jsContainer.nodeType) //nodeType:1 代表该节点为元素节点 console.log(jsContainer.attributes) console.log(Array.from(jsContainer.attributes)) console.log(jsContainer.childNodes) console.log(typeof jsContainer.childNodes) //NodeList object function domJson(dom) { var obj = { tag: getTagName(dom) } //dom节点为元素element,nodeType节点类型为1 if (dom.nodeType == 1) { var attrs = getTagAttrs(dom) if (attrs) obj.attributes = attrs; console.log(dom.children) //筛选出nodeType不为3且文本内容不为空的子DOM节点,并进行递归 obj.children = Array.from(dom.childNodes).filter(child => { return !(child.nodeType == 3 && !child.textContent.trim()) }).map(child => domJson(child)) return obj } //dom节点为文本类型, nodeType节点类型为3 if (dom.nodeType == 3) { obj.content = texthandle(dom.textContent) return obj } } //去除空白符 function texthandle(str) { return str.replace(/\s/g, '') } //获取到节点的标签名,注意需要转换为小写 function getTagName(dom) { return dom.nodeName.toLocaleLowerCase().replace('#', '') } //获取节点的属性对象 function getTagAttrs(dom) { //获取到属性数组 var attr = Array.from(dom.attributes) var obj = {} attr.forEach(atr => obj[atr.name] = atr.value) return attr.length ? obj : null; } return domJson(jsContainer) } dom2json() console.log(dom2json())