js 如何递归dom JSON?

类似这样的dom结构
<div class="a">

<div class="a1">
<div class="a11"></div>

</div>
<div class="a2"></div>
<div class="a3"></div>
</div>
<div class="b">
<div class="b1"></div>
<div class="b2"></div>
<div class="b3"></div>
</div>
想用js递归生成这样的JSON树结构
[
{
className:"a",

children:[
{
className:"a1",
children:[
className:"a11",
children:[]

]

},

{
className:"a2",
children:[]
},
{
className:"a3",
children:[]
}
]

},

{
className:"b",

children:[
{
{
className:"b1",

children:[]

},

{
className:"b2",

children:[]

}
{
className:"b3",

children:[]

}
}
]
}

]
a b 标签的父级是body
我想传一个body 的参数进一个方法 例如
fn( document.body )
然后返回 以上JSON

你好,我给你写了一个函数:

function nodeTree(node) {
    var root = node.tagName,
        tree = '<span style="color:#fff;">' + root + '</span><br>',
        output = '',
        kcolors = ['#cc99cc', '#78dead', '#3ba264', '#ffcc54'],
        vcolors = ['#bb512d', '#6798e8', '#f3825b', '#c1cff4'];
    function listObj(obj, _root) {
        var first = true,
            root = _root;
        for (var k in obj) {
            if (first) {
                root += '::' + k;
                first = false;
            }
            var deep = root.split('::').length - 1,
                v = typeof(obj[k]) == 'function' || typeof(obj[k]) == 'string' || ('' + obj[k]).indexOf('function') === 0 ? typeof(obj[k]) : obj[k];
            tree += '<span class="gray">&nbsp;&nbsp;&nbsp;' + '|....'.repeat(deep - 1) + '|.. </span><span style="color:' + kcolors[deep - 1] + ';">' + k + '</span>: <span style="color:' + vcolors[deep - 1] + ';">' + v + '</span><br>';
            if ((Object.prototype.toString.call(obj[k]) === '[object Object]' || Object.prototype.toString.call(obj[k]).match(/^\[object\sHTML[^I]/)) && deep < 3) {
                listObj(obj[k], root);
            }
        }
        return tree;
    }

    tree = listObj(node);
    document.body.style.backgroundColor = '#2d2d2d';
    document.body.style.color = '#fff';
    document.body.innerHTML = tree;
}

使用方法很简单,打开任意页面,在控制台先执行上面的函数声明,然后调用函数显示指定节点的属性列表:

nodeTree(document.body); // or
nodeTree(document.getElementsByTagName('div')[0]);

返回结果直接就会覆盖body中的内容,并高亮缩进显示,查看非常方便

递归显示内容比较多,执行会略慢,现在控制在显示三级,调用时需略作等待

希望是你想要的结果,望采纳~~

追问

能输入和我上面结构一样的JSON吗? 麻烦您了

追答

好吧,帮人帮到底,送佛送上西,来个完整版的,代码超限,贴不上来,请下载附件:

console.log只是为了在控制台查看输出的json结构是否正确,实际使用需删除

wrap只是为了显示最终结果新增的标签,与题中所列结构无关,请自行删除

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-11-19
你的意思是获取这些div的className,然后添加到json中?
相似回答