js实现无限级目录树

news/2024/7/19 13:52:06 标签: js, javascript, html

文章目录

  • 原理
      • N叉树的遍历
      • 显示/隐藏功能
      • 防止冒泡
  • 完整代码
  • 参考资料




原理

N叉树的遍历

每个data的数据格式如下:

var oneChoice = {
	name: 'A',
	child: [
		{
			name: 'A-1'
			child:[
				{...},
				{...}
			]
		},
		{
		
		}
	]
}

最终拼接成的html格式如下。

html"><li>
    <span>-</span>AAA
    <ul>
        <li><span>-</span>a1
            <ul style="display: block;">
                <li><span>-</span>a1-1</li>
                <li><span>-</span>a1-2</li>
            </ul>
        </li>
        <li><span>-</span>a2</li>
        <li><span>-</span>a3
            <ul style="display: block;">
                <li><span>-</span>a3-1</li>
                <li><span>-</span>a3-2
                    <ul style="display: block;">
                        <li><span>-</span>a3-2-1</li>
                        <li><span>-</span>a3-2-2</li>
                    </ul>
                </li>
            </ul>
        </li>
    </ul>
</li>
</ul>

实际上就是一个N叉树的遍历。

那是什么遍历呢?

很显然,是一个前序遍历,遵循着“根左右”的顺序。从根开始,先将第一层第一个选项中所有的子孙选项展开,再到第一层第二个选项…

当然,也有其他的做法,例如菜单展开的时候,只希望展开第一层中的选项,而第二第三层的选项等用户点击后再进行加载。那么这种情况可以考虑使用层级遍历。

这里我按照前序遍历的方式来写,可以先来做一做这道题,做完之后自然明白该怎么写了。

589. N叉树的前序遍历

/*
// Definition for a Node.
class Node {
    public int val;
    public List<Node> children;

    public Node() {}

    public Node(int _val) {
        val = _val;
    }

    public Node(int _val, List<Node> _children) {
        val = _val;
        children = _children;
    }
};
*/

class Solution {
    List<Integer> res = new ArrayList<>();

    public List<Integer> preorder(Node root) {
        if (root == null) {
            return res;
        }
        helper(root);
        return res;
    }
    
    private void helper(Node root) {
        if (root == null) {
            return;
        }
        res.add(root.val);
        for(Node oneNode: root.children){
            if(oneNode != null){
                helper(oneNode);
            }
        }
    }
}

框架就可以写出来了。

html" title=javascript>javascript">// 返回对应格式的html str
function createTree(data) {
    if(data为空){
        return '';
    }
    
    var str = '<ul>';
    for (选项 in data.child) {
        str += <li> ;
        str += '<span>-</span>' + 选项.name;
        
        // 递归
        if (选项.child) {
            str += createTree(data[i].child);
        }
        str += '</li>';
    };
    str += '</ul>';
    
    return str;
};

显示/隐藏功能

这个功能不难实现,只要使用display: none;和display:visible;来控制这块ul是否显示就行了。

  • 如果子ul的display状态为visible,则点击将会
    • 隐藏子ul
    • 将-变成+
  • 如果子ul的状态为none,则点击将会
    • 显示子ul
    • 将+变成-
html" title=javascript>javascript">//单击事件
$(".lists ul li").click(function (event) {

    //判断有没有ul子级
    if ($(this).find("ul").is(":visible")) {
        //隐藏   +
        $(this).find("ul").hide();
        $(this).find("span").text("+");
    } else {
        //显示  -
        $(this).find("ul").show();
        $(this).find("span").text("-");
    }
})

防止冒泡

就是在触发子类的函数时,防止父类也执行了子类中的行为。

如图,如果不阻止来自子类的冒泡事件,点击了b1-1-1-1时,就会使得BBB,乃至菜单root也会被关闭掉,这显然是不行的。

img

html" title=javascript>javascript">//单击事件
$(".lists ul li").click(function (event) {
    event.stopPropagation(); //阻止事件冒泡

    //判断有没有ul子级
    if ($(this).find("ul").is(":visible")) {
        //隐藏   +
        $(this).find("ul").hide();
        $(this).find("span").text("+");
    } else {
        //显示  -
        $(this).find("ul").show();
        $(this).find("span").text("-");
    }
})

完整代码

html"><!DOCTYPE html>
<html>

<head>
    <meta charset='utf-8'>
    <meta http-equiv='X-UA-Compatible' content='IE=edge'>
    <title>Page Title</title>
    <meta name='viewport' content='width=device-width, initial-scale=1'>
    <style>
        ul {
            list-style-type: none;
        }

        ul li span {
            color: red;
            padding-right: 10px;
        }
    </style>

</head>

<body>
    <div class="lists"></div>

    <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.html" title=js>js">html" title=javascript>javascript"></script>
    <script>html" title=javascript>javascript">
        var data = [
            {
                name: 'AAA',
                child: [
                    {
                        name: 'a1',
                        child: [
                            {
                                name: 'a1-1'
                            }, {
                                name: 'a1-2'
                            }
                        ]
                    },
                    {
                        name: 'a2'
                    },
                    {
                        name: 'a3',
                        child: [
                            {
                                name: 'a3-1'
                            }, {
                                name: 'a3-2',
                                child: [
                                    {
                                        name: 'a3-2-1'
                                    }, {
                                        name: 'a3-2-2'
                                    }
                                ]
                            }
                        ]
                    }
                ]
            },
            {
                name: 'BBB',
                child: [
                    {
                        name: 'b1',
                        child: [
                            {
                                name: 'b1-1',
                                child: [
                                    {
                                        name: 'b1-1-1',
                                        child: [
                                            {
                                                name: 'b1-1-1-1',
                                                child: [
                                                    {
                                                        name: 'b1-1-1-1-1',
                                                        child: [
                                                            {
                                                                name: 'b1-1-1-1-1-1'
                                                            },
                                                        ]
                                                    },
                                                ]
                                            },
                                        ]
                                    },
                                ]
                            },

                        ]
                    },
                    {
                        name: 'b2'
                    },
                    {
                        name: 'b3'
                    }
                ]
            },
            {
                name: 'CCC',
                child: [
                    {
                        name: 'c1'
                    }
                ]
            },
            {
                name: 'DDD'
            }
        ];

        $(function () {
            //递归
            function createTree(data) {
                var str = '<ul>';
                for (var i = 0; i < data.length; i++) {
                    str += '<li><span>-</span>' + data[i].name;
                    if (data[i].child) {
                        str += createTree(data[i].child);
                    }
                    str += '</li>';
                };
                str += '</ul>';
                return str;
            };

            $(".lists").html(createTree(data));

            //单击事件
            $(".lists ul li").click(function (event) {
                event.stopPropagation(); //阻止事件冒泡

                //判断有没有ul子级
                if ($(this).find("ul").is(":visible")) {
                    //隐藏   +
                    $(this).find("ul").hide();
                    $(this).find("span").text("+");
                } else {
                    //显示  -
                    $(this).find("ul").show();
                    $(this).find("span").text("-");
                }
            })
        })
    </script>
</body>

</html>

img

参考资料

《前端面试题》


http://www.niftyadmin.cn/n/555324.html

相关文章

linux网络编程中的超时设置

1 下面是在网上找到的资料&#xff0c;先非常的感谢。 用setsockopt()来控制recv()与send()的超时 在send(),recv()过程中有时由于网络状况等原因&#xff0c;收发不能预期进行,而设置收发超时控制&#xff1a; 在Linux下需要注意的是时间的控制结构是struct timeval而并不是某…

iis无法显示页面 因为发生内部服务器错误,HTTP Error 500.0。无法显示页面,因为发生内部服务器错误。...

在asp.net开发中&#xff0c;经常遇到500错误。500错误的原因&#xff0c;基本山都可以归结为代码问题或者配置问题&#xff0c;这种问题往往在服务器本地环境才可以看到报错详情。这是基于系统安全考虑的&#xff0c;不暴露系统结构隐私&#xff0c;可以防止被人猜解系统结构。…

[十大排序算法]冒泡排序及其优化

文章目录十大排序算法冒泡排序描述实现优化优化方向一优化方向二参考资料十大排序算法 排序算法时间复杂度&#xff08;最坏&#xff09;时间复杂度&#xff08;最好&#xff09;空间复杂度排序方式稳定性插入排序n^2n1in稳定冒泡排序n^2n1in稳定选择排序n^2n^21in不稳定快速排…

iis搭建web服务器虚拟目录,Win7系统下iis6部署网站时配置虚拟目录的方法

IIS 6.0经过了广泛的重新设计&#xff0c;以提高Web服务器的可靠性和可用性&#xff0c;新的容错进程架构和其它功能特性可以帮助用户减少不必要的停机时间&#xff0c;并提高应用程序的可用性&#xff0c;当我们在iis6中添加网站来部署网站的时候&#xff0c;要怎么添加配置虚…

[十大排序算法]选择排序及其优化

文章目录十大排序算法选择排序描述实现优化优化方向1参考资料十大排序算法 排序算法时间复杂度&#xff08;最坏&#xff09;时间复杂度&#xff08;最好&#xff09;空间复杂度排序方式稳定性插入排序n^2n1in稳定冒泡排序n^2n1in稳定选择排序n^2n^21in不稳定快速排序n^2nlog(…

mac下安装了brew

使用mac后发现很多软件都可以通过终端命令brew。。。来安装。 查了一下&#xff0c;发现brew原来是osx系统上的软件包管理工具&#xff0c;全名是Homebrew&#xff0c;官网&#xff1a;https://brew.sh&#xff08;这官竟然还包含各种语言&#xff01;完美&#xff01;&#xf…

服务器php网站配置域名访问,phpstudy在服务器上配置域名

phpstudy在服务器上配置域名 内容精选换一换可以。一个服务器上可以同时配置多个证书。证书是与域名或IP绑定的&#xff0c;对服务器的数量没有限制。如果您购买的证书绑定的域名用于多台服务器&#xff0c;则购买的证书需要在每台服务器上进行部署才能生效。不是。华为云的或非…

10、二维数组的申请(test7.java)

我个人认为&#xff0c;二维数组的构造就是在一位数组中存入一个地址&#xff0c;这个地址指向另一个一位数组&#xff0c;这样通过这种排列组合便构造成了二维数组。 二维数组的形状&#xff0c;有的时候二维数组看起来像是一个矩阵&#xff0c;所以一般情况下如果涉及到矩阵&…