首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

js折叠树

JavaScript 折叠树(Tree Folding)是一种常见的用户界面交互模式,用于展示层次结构的数据。它允许用户通过点击节点来展开或折叠子节点,从而控制显示的内容量,提高用户体验。

基础概念

折叠树通常由以下几个部分组成:

  1. 节点(Node):表示树中的一个元素,可以是文件夹、文件或其他数据项。
  2. 父节点(Parent Node):拥有子节点的节点。
  3. 子节点(Child Node):属于某个父节点的节点。
  4. 根节点(Root Node):树的起始点,没有父节点。

优势

  1. 节省空间:用户可以根据需要展开或折叠节点,避免一次性显示大量数据导致的界面混乱。
  2. 提高可读性:通过层次结构展示数据,使用户更容易理解数据的组织方式。
  3. 增强交互性:用户可以主动探索数据,而不是被动接受信息。

类型

  1. 静态折叠树:节点结构固定,不支持动态添加或删除节点。
  2. 动态折叠树:允许用户在运行时添加、删除或修改节点。

应用场景

  1. 文件管理系统:展示文件夹和文件的层次结构。
  2. 组织架构图:显示公司内部的部门和员工关系。
  3. 数据库导航:帮助用户浏览和管理数据库表和字段。

示例代码

以下是一个简单的静态折叠树实现示例,使用HTML、CSS和JavaScript:

代码语言:txt
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>折叠树示例</title>
    <style>
        .tree ul {
            list-style-type: none;
            padding-left: 20px;
        }
        .tree li {
            cursor: pointer;
        }
        .tree .node {
            display: inline-block;
            margin-right: 5px;
        }
    </style>
</head>
<body>
    <div class="tree">
        <ul>
            <li>
                <span class="node">+</span> 根节点
                <ul>
                    <li>
                        <span class="node">+</span> 子节点1
                        <ul>
                            <li>叶子节点1</li>
                            <li>叶子节点2</li>
                        </ul>
                    </li>
                    <li>
                        <span class="node">+</span> 子节点2
                        <ul>
                            <li>叶子节点3</li>
                        </ul>
                    </li>
                </ul>
            </li>
        </ul>
    </div>

    <script>
        document.querySelectorAll('.tree .node').forEach(node => {
            node.addEventListener('click', function(event) {
                event.stopPropagation();
                const ul = this.nextElementSibling;
                if (ul && ul.tagName === 'UL') {
                    ul.style.display = ul.style.display === 'none' ? '' : 'none';
                    this.textContent = this.textContent === '+' ? '-' : '+';
                }
            });
        });
    </script>
</body>
</html>

常见问题及解决方法

  1. 节点展开/折叠状态丢失
    • 原因:页面刷新或重新加载导致状态丢失。
    • 解决方法:使用本地存储(如localStorage)保存节点状态,并在页面加载时恢复状态。
  • 性能问题
    • 原因:树结构非常庞大,导致渲染和交互缓慢。
    • 解决方法:采用虚拟滚动技术,只渲染当前视口内的节点,减少DOM操作。
  • 事件冒泡
    • 原因:点击子节点时触发了父节点的事件处理程序。
    • 解决方法:在事件处理程序中使用event.stopPropagation()阻止事件冒泡。

通过以上方法,可以有效解决折叠树在实际应用中遇到的常见问题,提升用户体验。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • js应用字典树

    字典树又叫前缀树或Trie树,是处理字符串常见的一种树形数据结构,其优点是利用字符串的公共前缀来节约存储空间,比如加入‘abc’,‘abcd’,‘abd’,‘bcd’,‘efg’,‘hik’之后,其结构应该如下图所示...当有新的单词加入时,需要判断是否在已经存储的单词中,如果不存在则直接插入 2.来了一个单词的前缀,统计一下存储的单词中有多少个单词前缀是和该单词前缀相同 下面我们开始来实现这个数据结构: //字典树...字典树的一个常用场景有代码补全,输入框单词提示等。 Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。...Trie树也有它的缺点, 假定我们只对字母与数字进行处理,那么每个节点至少有52+10个子节点。为了节省内存,我们可以用链表或数组。在JS中我们直接用数组,因为JS的数组是动态的,自带优化。

    2.2K10

    js 中树的搜索

    适用场景 树的深度有限:适用于树的深度较浅或中等的情况。 优先代码可读性:当代码的简洁性和可读性优先于极限性能时。...适用场景 处理深度较大的树:当树的深度可能导致递归方法栈溢出时。 性能要求较高:在对性能有较高要求的情况下,迭代方法可能更为合适。...适用场景 复杂的树操作:当需要进行复杂的树操作(如节点的增删改查、遍历、过滤等)时。 项目已使用相关库:如果项目中已经使用了某些库(如 lodash),可以利用其现有功能。...推荐库 Lodash:提供了丰富的工具函数,可以简化树的操作。 Immutable.js 或 Immer:适用于需要不可变数据结构的场景。 Tree-model:专门用于树形结构操作的库。...不过,这需要额外的内存和在树更新时维护映射表。

    10010

    vim 代码折叠之设置默认代码不折叠

    配置 foldmethod 可以定义折叠方式,有6种可选方式: 1. manual //手工定义折叠 2. indent //用缩进表示折叠 3. expr //用表达式来定义折叠 4. syntax...//用语法高亮来定义折叠 5. diff //对没有更改的文本进行折叠 6. marker //用标志折叠 我选用 syntax 来定义折叠,这种方式比较简单,但是当配置完这个值后,你打开代码,就会发现...vim 默认把所有代码都折叠了,这显然不是我想要的,google一番后找到办法,设置 foldlevelstart 为99后,打开默认没有折叠。...配置: "使用语法高亮定义代码折叠 set foldmethod=syntax "打开文件时默认不折叠代码 set foldlevelstart=99 参考文献# vim的代码折叠:设置默认代码不折叠

    42030

    智慧树刷课js脚本

    前言   最近博主选了两门智慧树的选修课,以前都是电脑安装安卓模拟器然后模拟器安装知到app 使用模拟器播放,挺麻烦的,今天在页面上随便点了下,突然发现智慧树的pc端播放器不是使用flash而是使用的html...+js,于是想到使用js点击事件控制播放下一集(智慧树视频要求只需要看到80%即可)、关闭答题弹窗(智慧树的答题可以不管直接关闭,超星的必须答题),如果需要为播放到100%切换下一集请更改第45行的83...由于是纯JS代码,基本没有被检测作弊的风险,博主不做100%的保证,谨慎使用!!...---- 程序js代码 /** * author: 雨落凋殇 * website: https://rainss.cn * description: 自动播放、下一集、关闭答题窗口、刷智慧树网课...---- JS代码文件下载 智慧树刷课脚本.js 原创文章转载请注明出处 ! 雨落凋殇博客https://rainss.cn

    21.4K41

    AVL 树旋转及 JS 实现,平衡树支棱起来~

    AVL旋转 在 AVL 树中,增加和删除元素的操作则可能需要借由一次或多次 树旋转,以实现树的重新平衡。 所以,AVL树最核心操作就是“AVL 旋转”!...以下 GIF 演示了不断将节点插入AVL树时的情况,包含: 左旋(Left Rotation) 右旋(Right Rotation) 右左旋转(Right-Left Rotation) 左右旋转(Left-Right...Rotation) 以及带子树的右旋(Right Rotation with children) 安利一个在线动态演示 VAL 树的旋转的网站:www.cs.usfca.edu/~galles/vis...因此,删除操作的时间复杂度为O(logN)+O(logN)=O(2logN); JS 实现 左单旋: function roateLeft(AvlNode) { var node =...,脑袋也有点晕眩了╮(╯▽╰)╭ 啃不下来,就先收藏慢慢啃吧~~ 不慌,后续还会带来更多关于平衡二叉树的练习,以及前端少有接触的红黑树等等。。。

    2.1K00

    折叠绳子

    折叠绳子 原题链接 描述 农夫约翰有一条长度为 L 的绳子,可用于农场周围的各种任务。 绳子在不同的位置有 N 个绳结,包括两个端点处各有一个。...约翰注意到,在某些位置,他可以将绳子对折,这样,相对的绳索上的绳结就可以彼此完全对齐: image.png 请帮助约翰统计具有此属性的折叠点数。 允许在某个绳结处折叠,但不允许在端点绳结处折叠。...折叠后,较长的一侧可以有多余节点。 输入格式 第一行包含两个整数 N 和 L。 接下来 N 行,每行包含一个 0∼L 范围内的整数,表示一个绳结的位置。其中两行包含的数字分别是 0 和 L。...输出格式 输出有效折叠位置的数量。 数据范围 1≤L≤10000, 1≤N≤100 输入样例: 输出样例: 4 5 10 0 10 6 2 4 样例解释 有效折叠位置为 1,2,3,8。...分析 对于样例: image.png 可知,枚举j问绳子上的折叠点,若j点之前所有的点a[j]与a[i+i-j]的点状态相同,则说明该折叠点是有效的 注意绳子的折叠点可能为0.5、1.5,故将绳子长度变为原来的

    67430

    JS数据结构之AVL树

    介绍 AVL树(Adelson-Velsky and Landis Tree)是最早被发明的自平衡二叉查找树,它能保证查找、插入和删除在平均和最坏情况下的时间复杂度都是O(log n)。...当平衡因子处于[-1, 1]区间时,我们认为这棵树是平衡的,否则就是不平衡状态,需要通过一次或多次旋转使其重新平衡。 如果你还不知道什么是二叉查找树,请看点这里看我写的上一篇文章。...左单旋转 当node.left.left被进行了一次插入操作,导致这棵树不平衡时,需要进行左单旋转,过程如下: 分析: 由于插入了节点x,使得原本以k1为根节点的AVL树不再平衡。...那么B树放到哪里?根据二叉搜索树的定义,我们知道,对于任意B树中的节点m,都有m > k2 && m 树就要被重新调整了。

    70510
    领券