0

0

如何在 TreeView 折叠时隐藏加载图标(Loading Icon)

霞舞

霞舞

发布时间:2026-01-17 15:53:11

|

315人浏览过

|

来源于php中文网

原创

如何在 TreeView 折叠时隐藏加载图标(Loading Icon)

本文介绍如何通过引入状态标志(flag)精准控制 treeview 展开/折叠时的加载图标显示逻辑,确保仅在展开子节点时显示旋转加载动画,折叠时不触发任何加载态,从而提升用户体验与交互准确性。

在基于 jQuery 实现的 TreeView 组件中,常见做法是在点击父节点时统一显示加载图标(如 Font Awesome 的 fa-spinner fa-spin),再通过 setTimeout 延迟移除并执行 slideToggle 动画。但原始实现未区分「展开」与「折叠」状态,导致每次点击都插入 .loading 元素——这不仅造成视觉冗余,还可能引发 DOM 冗余或样式冲突。

核心解决方案:为每个可折叠分支(

  • )维护独立的状态标志(flag)
  • ,用于记录当前是否处于「已展开」状态。该 flag 必须声明在 tree.find('li').has("ul").each(...) 的迭代作用域内,确保每个分支拥有私有状态,避免相互干扰。

    以下是关键逻辑重构说明:

    状态隔离

    tree.find('li').has("ul").each(function () {
      var branch = $(this);
      let flag = false; // ✅ 每个分支独享 flag,不可提至外层!
      branch.on('click', function (e) {
        if (this === e.target) {
          flag = !flag; // 点击即切换状态
          // ...
        }
      });
    });

    条件化加载图标注入
    仅当 flag === true(即本次操作为「展开」)时插入 loading 元素;折叠时直接执行收起动画,不添加、不移除加载元素:

    if (flag) {
      $(this).append("
    "); setTimeout(() => { $(this).find('.loading').remove(); $(this).children().children().slideToggle(400); }, 400); } else { $(this).children().children().slideToggle(400); // 无 loading,直切动画 }

    ⚠️ 注意事项

    医真AI+开放平台
    医真AI+开放平台

    医真AI+ 医学AI开放平台

    下载
    • ❌ 错误做法:将 let flag = false 声明在 $.fn.treed 函数顶部 → 所有分支共享同一 flag,状态混乱;
    • ✅ 正确做法:let flag 必须置于 each() 回调内部,利用闭包维持各分支独立状态;
    • ? 图标类名需同步更新:icon.toggleClass(openedClass + " " + closedClass) 保证 +/- 图标随状态正确切换;
    • ? 清理时机:setTimeout 中的 .remove() 仅在展开流程中执行,折叠路径完全跳过 DOM 操作,性能更优。

    完整精简版插件片段(含注释)

    $.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);
            $branch
              .prepend(``)
              .addClass('branch');
    
            let isOpen = false; // 分支级状态标识
    
            $branch.on('click', function (e) {
              if (e.target !== this) return;
    
              isOpen = !isOpen;
              const $icon = $branch.children('i:first');
              $icon.toggleClass(`${opts.openedClass} ${opts.closedClass}`);
    
              if (isOpen) {
                // 展开:显示 loading → 延迟移除 → 执行展开动画
                $branch.append('
    '); setTimeout(() => { $branch.find('.loading').remove(); $branch.children('ul').slideDown(400); }, 400); } else { // 折叠:直接收起,不触发 loading $branch.children('ul').slideUp(400); } }); // 初始化:默认收起子列表 $branch.children('ul').hide(); }); }); } });

    最后,初始化时可传入自定义图标类:

    $('#tree2').treed({
      openedClass: 'fa-folder-open',
      closedClass: 'fa-folder'
    });

    通过该方案,TreeView 的加载反馈变得语义清晰、行为可控——用户能明确感知“正在加载新内容”仅发生在展开动作中,折叠则即时响应,无任何视觉延迟或干扰,符合现代 Web 交互设计最佳实践。

    相关专题

    更多
    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

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

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

    27

    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号