0

0

如何在 TreeView 收起时隐藏加载图标(Loading Icon)

碧海醫心

碧海醫心

发布时间:2026-01-17 09:38:11

|

243人浏览过

|

来源于php中文网

原创

如何在 TreeView 收起时隐藏加载图标(Loading Icon)

本文详解如何通过状态标志(flag)控制 treeview 展开/收起时的加载图标显示逻辑,确保仅在展开子节点时显示旋转加载动画,收起时不触发、不残留,提升用户体验与交互准确性。

在基于 jQuery 实现的 TreeView 组件中,常见需求是:仅在用户点击展开(open)节点时显示加载动画(如 fa-spinner fa-spin),而在收起(close)节点时完全不显示该图标。原始代码中,每次点击都无差别地插入 .loading 元素并执行 slideToggle(),导致收起过程也短暂出现加载图标,违背设计意图。

✅ 核心解决方案:引入局部状态标志(flag)

关键在于为每个可折叠的

Designs.ai
Designs.ai

AI设计工具

下载
  • 分支(branch)维护一个独立的布尔状态变量 flag,用于记录当前是否处于“已展开”状态。该变量必须声明在 tree.find('li').has("ul").each(...) 的迭代作用域(即每个 branch 独享一份),而非函数顶层——否则所有节点将共享同一 flag,导致状态错乱。
    branch.on('click', function (e) {
      if (this === e.target) {
        const icon = $(this).children('i:first');
        const $childrenUl = $(this).children('ul'); // 更精准的目标元素
    
        // 切换状态:true → 展开;false → 收起
        flag = !flag;
    
        // 更新图标类
        icon.toggleClass(openedClass + ' ' + closedClass);
    
        if (flag) {
          // 【展开时】:插入 loading,延时移除并展开内容
          $(this).append('
    '); setTimeout(() => { $(this).find('.loading').remove(); $childrenUl.slideDown(400); // 推荐用 slideDown/slideUp 替代 slideToggle,语义更清晰 }, 400); } else { // 【收起时】:直接收起,不插入、不显示 loading $childrenUl.slideUp(400); } } });
    ? 注意细节优化:使用 $(this).children('ul') 明确目标子菜单,避免 children().children() 这种模糊选择器可能引发的意外行为;slideDown() / slideUp() 比 slideToggle() 更可控,配合 flag 可完全解耦展开/收起逻辑;HTML 中 标签需闭合(原文缺失 >,已修正):。

    ? 常见错误规避

    • 错误:将 let flag = false 写在 $.fn.treed 函数顶部 → 所有分支共用一个 flag,状态同步失效;
    • 错误:未清理 .loading 元素即再次点击 → 多个 loading 叠加或残留;
    • 错误:在 else 分支中遗漏 slideUp() → 收起无动画,体验割裂。

    ✅ 完整推荐写法(精简整合版)

    $.fn.extend({
      treed: function (options) {
        const opts = $.extend({
          openedClass: 'fa-minus-circle',
          closedClass: 'fa-plus-circle'
        }, options);
    
        return this.each(function () {
          const $tree = $(this).addClass('tree');
          $tree.find('li').has('ul').each(function () {
            const $branch = $(this);
            const $icon = $('', {
              class: `indicator fas ${opts.closedClass}`
            }).prependTo($branch);
            $branch.addClass('branch');
    
            let isOpen = false; // ✅ 每个分支独立状态
    
            $branch.on('click', function (e) {
              if (e.target !== this) return;
    
              isOpen = !isOpen;
              $icon.toggleClass(`${opts.openedClass} ${opts.closedClass}`);
    
              const $ul = $branch.children('ul');
              if (isOpen) {
                $branch.append('
    '); setTimeout(() => { $branch.find('.loading').remove(); $ul.slideDown(400); }, 400); } else { $ul.slideUp(400); } }); // 初始化:默认收起子菜单 $branch.children('ul').hide(); }); // 图标/链接/按钮点击透传 $tree.find('.branch .indicator, .branch>a, .branch>button') .on('click', function (e) { $(this).closest('li').click(); e.preventDefault(); }); }); } });

    ? 总结

    隐藏收起时的加载图标,本质是分离展开与收起的 UI 行为逻辑。通过为每个可折叠节点维护独立状态标志,并严格限定其作用域,即可精准控制 loading 元素的创建与销毁时机。此方案轻量、可靠、易于维护,适用于各类基于 jQuery 的树形控件增强场景。

  • 相关专题

    更多
    jquery插件有哪些
    jquery插件有哪些

    jquery插件有jQuery UI、jQuery Validate、jQuery DataTables、jQuery Slick、jQuery LazyLoad、jQuery Countdown、jQuery Lightbox、jQuery FullCalendar、jQuery Chosen和jQuery EasyUI等。本专题为大家提供jquery插件相关的文章、下载、课程内容,供大家免费下载体验。

    150

    2023.09.12

    jquery怎么操作json
    jquery怎么操作json

    操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

    309

    2023.10.13

    jquery删除元素的方法
    jquery删除元素的方法

    jquery可以通过.remove() 方法、 .detach() 方法、.empty() 方法、.unwrap() 方法、.replaceWith() 方法、.html('') 方法和.hide() 方法来删除元素。更多关于jquery相关的问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

    394

    2023.11.10

    jQuery hover()方法的使用
    jQuery hover()方法的使用

    hover()是jQuery中一个常用的方法,它用于绑定两个事件处理函数,这两个函数将在鼠标指针进入和离开匹配的元素时执行。想了解更多hover()的相关内容,可以阅读本专题下面的文章。

    498

    2023.12.04

    jquery实现分页方法
    jquery实现分页方法

    在jQuery中实现分页可以使用插件或者自定义实现。想了解更多jquery分页的相关内容,可以阅读本专题下面的文章。

    179

    2023.12.06

    jquery中隐藏元素是什么
    jquery中隐藏元素是什么

    jquery中隐藏元素是非常重要的一个概念,在使用jquery隐藏元素之前,需要先了解css样式中关于元素隐藏的属性,比如display、visibility、opacity等属性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

    119

    2024.02.23

    jquery中什么是高亮显示
    jquery中什么是高亮显示

    jquery中高亮显示是指对页面搜索关键词时进行高亮显示,其实现办法:1、先获取要高亮显示的行,获取搜索的内容,再遍历整行内容,最后添加高亮颜色;2、使用“jquery highlight”高亮插件。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

    172

    2024.02.23

    jQuery 正则表达式相关教程
    jQuery 正则表达式相关教程

    本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

    33

    2026.01.13

    高德地图升级方法汇总
    高德地图升级方法汇总

    本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

    25

    2026.01.16

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    jQuery 教程
    jQuery 教程

    共42课时 | 4.3万人学习

    HTML+CSS基础与实战
    HTML+CSS基础与实战

    共132课时 | 9.5万人学习

    tp6+adminlte搭建通用后台
    tp6+adminlte搭建通用后台

    共39课时 | 5.7万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号