原生js递归方法做无限级菜单

<!DOCTYPE html>
<html lang="en">

    <head>
        <meta charset="UTF-8">
        <title>Document</title>
        <style type="text/css">
            li {
                list-style: none;
            }
            li ul {
                display: none;
            }
            p {
                position: relative;
                cursor: pointer;
            }
            span {
                position: absolute;
                left: -20px;
                color: red;
            }
        </style>
    </head>
    <body>
        <script type="text/javascript">
            function getStyle(el, attr) {
                return getComputedStyle(el)[attr];
            }
            var data = [{
                text: "家用电器",
                child: [{
                    text: "电视",
                    child: [{
                        text: "曲面电视",
                        child: [{
                                text: "4k屏",
                                child: [{
                                    text: "服饰shop"
                                    },
                                    {
                                        text: "key密钥"
                                    },{
                                        text: "文认为撒旦"
                                    }
                                ]
                            },
                            {
                                text: "1080P"
                            }
                        ]
                    }, {
                        text: "超薄电视"
                    }]
                }, {
                    text: "空调",
                    child: [{
                        text: "壁挂式空调"
                    }, {
                        text: "柜式空调"
                    }, {
                        text: "中央空调"
                    }]
                }, {
                    text: "洗衣机"
                }, {
                    text: "冰箱"
                }, {
                    text: "进口电器"
                }]
            }, {
                text: "手机 / 运营商 / 数码"
            }, {
                text: "电脑 / 办公",
                child: [{
                    text: "电脑整机"
                }, {
                    text: "电脑配件"
                }]
            }, {
                text: "家居 / 家具 / 家装 / 厨具"
            }, {
                text: "男装 / 女装 / 童装 / 内衣"
            }, {
                text: "美妆个护 / 宠物"
            }];
            var str=(data)=>{
                console.log(data)
                var list=document.createElement("ul");//创建ul标签
                document.body.appendChild(list);//插入body里面
                var create=(list,data)=>{
                    for(var i = 0; i < data.length; i++) { //循环数组长度生成li和内容
                        var li = document.createElement("li");
                        var p = document.createElement("p");
                        p.innerHTML = data[i].text;
                        li.appendChild(p);
                        if(data[i].child) { //如果还有子项  data[i].child的child必须和data数组中的数组对象值一致
                            var ul = document.createElement("ul"); //生成ul
                            create(ul, data[i].child); //传入ul,以及子项的数组,生成子项的li
                            li.appendChild(ul);
                            p.innerHTML = "<span>+</span>" + data[i].text;
                        }
                        list.appendChild(li);
                    }
                }
                var addEv=()=>{
                    var p = document.querySelectorAll('p');
                for(var i = 0; i < p.length; i++) {
                    p[i].onclick = function() {
                        var ul = this.nextElementSibling; /*获取它下边的ul */
                        if(ul) { /*存在*/
                            var uls = this.parentNode.parentNode.getElementsByTagName("ul");
                            for(var i = 0; i < uls.length; i++) {
                                if(uls[i] != ul) {
                                    uls[i].style.display = "none"; //清除掉同级所有ul(排除当前个)
                                }
                            }
                            /* 操作当前个 */
                            if(getStyle(ul, "display") == "none") {
                                ul.style.display = "block";
                            } else {
                                ul.style.display = "none";
                            }
                        }
                    }
                }
            }
            create(list,data);
            addEv();
            }
            str(data);//方便调用者调用
           </script>
    </body>

</html>

猜你喜欢

转载自blog.csdn.net/weixin_40888956/article/details/87723502