输入菜单关键字,遍历匹配到 menuIds,展开 匹配节点 的所有父节点以及 匹配节点 本身,高亮 匹配节点

菜单检索,名称、地址、权限标志 等 关键字匹配、展开、高亮(全程借助 DeepSeek )

便捷简洁的企业官网 的后台菜单管理,图示:

改造点:

(1)修改 bootstrapTreeTable 的节点class命名方式为:treegrid-{item[options.id]},即采用id作为节点的唯一标识; 
(2)展开所有父节点; 
(3)展开该节点本身; 
(4)高亮该节点。

1. 修改 bootstrapTreeTable 的节点class命名方式为:treegrid-{item[options.id]},即采用id作为节点的唯一标识。只涉及 jquery.treegrid.extension.js 两处:

(1)修改 target.getChildNodes 方法

        // 递归获取子节点并且设置子节点

        target.getChildNodes = function(data, parentNode, parentIndex, tbody) {

            $.each(data, function(i, item) {

                if (item[options.parentCode] == parentNode[options.code]) {

                    var tr = $('<tr></tr>');

                    // 使用 item[options.id] 作为节点 ID

                    tr.addClass('treegrid-' + item[options.id]);

                    // 设置父节点关系

                    tr.addClass('treegrid-parent-' + parentNode[options.id]);

                    // 渲染行

                    target.renderRow(tr, item);

                    // 标记节点已显示

                    item.isShow = true;

                    // 将行添加到表格体

                    tbody.append(tr);

                    // 递归处理子节点

                    target.getChildNodes(data, item, item[options.id], tbody);

                }

            });

        };



(2)修改 target.load 方法

        // 加载数据

        target.load = function(parms) {

            // 加载数据前先清空

            target.html("");

            // 构造表头

            var thr = $('<tr></tr>');

            $.each(options.columns, function(i, item) {

                var th = null;

                if (i == 0 && item.field == 'selectItem') {

                    hasSelectItem = true;

                    th = $('<th style="text-align:' + item.valign + ';width:36px"></th>');

                } else {

                    th = $('<th style="text-align:' + item.valign + ';padding:10px;' + ((item.width) ? ('width:' + item.width) : '') + '"></th>');

                }

                th.text(item.title);

                thr.append(th);

            });

            var thead = $('<thead class="treegrid-thead"></thead>');

            thead.append(thr);

            target.append(thead);

            // 构造表体

            var tbody = $('<tbody class="treegrid-tbody"></tbody>');

            target.append(tbody);

            // 添加加载loading

            var _loading = '<tr><td colspan="' + options.columns.length + '"><div style="display: block;text-align: center;">正在努力地加载数据中,请稍候……</div></td></tr>';

            tbody.html(_loading);

            // 默认高度

            if (options.height) {

                tbody.css("height", options.height);

            }

            $.ajax({

                type: options.type,

                url: options.url,

                data: parms ? parms : options.ajaxParams,

                dataType: "JSON",

                success: function(data, textStatus, jqXHR) {

                    // 加载完数据先清空

                    tbody.html("");

                    if (!data || data.length <= 0) {

                        var _empty = '<tr><td colspan="' + options.columns.length + '"><div style="display: block;text-align: center;">没有记录</div></td></tr>';

                        tbody.html(_empty);

                        return;

                    }

                    // console.log('Loaded data:', data); // 调试信息

                    var rootNode = target.getRootNodes(data);

                    $.each(rootNode, function(i, item) {

                        var tr = $('<tr></tr>');

                        tr.addClass('treegrid-' + item[options.id]); // 使用 id 作为节点 ID

                        target.renderRow(tr, item);

                        item.isShow = true;

                        tbody.append(tr);

                        target.getChildNodes(data, item, item[options.id], tbody);

                    });

                    // 下边的操作主要是为了查询时让一些没有根节点的节点显示

                    $.each(data, function(i, item) {

                        if (!item.isShow) {

                            var tr = $('<tr></tr>');

                            tr.addClass('treegrid-' + item[options.id]); // 使用 id 作为节点 ID

                            target.renderRow(tr, item);

                            tbody.append(tr);

                        }

                    });

                    target.append(tbody);

                    // 初始化treegrid

                    target.treegrid({

                        treeColumn: options.expandColumn ? options.expandColumn : (hasSelectItem ? 1 : 0),

                        expanderExpandedClass: options.expanderExpandedClass,

                        expanderCollapsedClass: options.expanderCollapsedClass

                    });

                    if (!options.expandAll) {

                        target.treegrid('collapseAll');

                    }

                },

                error: function(xhr, textStatus) {

                    var _errorMsg = '<tr><td colspan="' + options.columns.length + '"><div style="display: block;text-align: center;">' + xhr.responseText + '</div></td></tr>';

                    tbody.html(_errorMsg);

                    debugger;

                },

            });

        };

2.展开所有父节点(在  jquery.treegrid.js 中新增)

/**

 * 展开指定节点的所有父节点

 *

 * @param {string} nodeId 节点的唯一标识符

 * @returns {Object[]}

 */

expandParentNodes: function(nodeId) {

    return this.each(function() {

        var $this = $(this);

        var node = $this.treegrid('getNodeById', nodeId, $this.treegrid('getTreeContainer'));

        if (node.length > 0) {

            // 递归展开父节点

            var parentNode = node.treegrid('getParentNode');

            while (parentNode !== null) {

                parentNode.treegrid('expand');

                parentNode = parentNode.treegrid('getParentNode');

            }

        }

    });

},

3.展开该节点本身(在  jquery.treegrid.js 中新增)

/**

 * 展开指定节点

 *

 * @param {string} nodeId 节点的唯一标识符

 * @returns {Object[]}

 */

expandNode: function(nodeId) {

    return this.each(function() {

        var $this = $(this);

        // 找到对应的节点

        var node = $this.treegrid('getNodeById', nodeId, $this.treegrid('getTreeContainer'));

        // console.log('Node found:', node); // 调试信息

        if (node.length > 0) {

            // 展开该节点

            node.treegrid('expand');

            // console.log('Node expanded:', node); // 调试信息

        }

        // else{

        //     console.error('Node not found with ID:', nodeId); // 调试信息

        // }

    });

},

4.高亮该节点(在  jquery.treegrid.js 中新增)

/**

 * 高亮指定节点(设置背景色为红色)

 *

 * @param {string} nodeId 节点的唯一标识符

 * @param {string} backgroundColor 高亮的颜色

 * @returns {Object[]}

 */

highlightNode: function(nodeId, backgroundColor = '#CDEDC1') {

    return this.each(function() {

        var $this = $(this);

        var node = $this.treegrid('getNodeById', nodeId, $this.treegrid('getTreeContainer'));

        if (node.length > 0) {

            // 设置背景色为红色

            node.css('background-color', backgroundColor); // #CDEDC1  #FFE3FA  #99FFCC

        }

    });

},

5.将后面 三个改造点合并一处(在  jquery.treegrid.js 中新增):

/**

 * 展开指定节点的所有父节点、该节点本身,并高亮该节点

 *

 * @param {string} nodeId 节点的唯一标识符

 * @returns {Object[]}

 */

expandAndHighlightNode: function(nodeId) {

    return this.each(function() {

        var $this = $(this);// 清除所有节点的背景色

        // 展开所有父节点

        $this.treegrid('expandParentNodes', nodeId);

        // 展开该节点本身

        $this.treegrid('expandNode', nodeId);

        // 高亮该节点

        $this.treegrid('highlightNode', nodeId);

    });

},

6. 在  jquery.treegrid.extension.js 中调用 (在 jquery.treegrid.extension.js 中新增)

/**

 * 展开指定节点的所有父节点、该节点本身,并高亮该节点

 *

 * @param {Object} target 目标表格

 * @param {string} nodeId 节点的唯一标识符

 * @param {string} backgroundColor 高亮的背景色(默认:'#CDEDC1')

 * @returns {Object[]}

 */

expandAndHighlightNode: function(target, nodeId, backgroundColor) {

    return target.each(function() {

        var $this = $(this);

        // 调用 treegrid 的 expandAndHighlightNode 方法

        $this.treegrid('expandAndHighlightNode', nodeId, backgroundColor);

    });

},

7. 在使用处调用:

// 清除所有节点的背景色

$('#table').find('tr').css('background-color', '');



$.each(menuIds, function(i, id) {

    // console.log("展开:"+id);

    $('#table').bootstrapTreeTable('expandAndHighlightNode', id);

});

本文同步发布于:

输入菜单关键字,遍历匹配到 menuIds,展开 匹配节点 的所有父节点以及 匹配节点 本身,高亮 匹配节点 - BGStone - 博客园

应用于 便捷简洁的企业官网 的后台菜单管理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/975903.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【落羽的落羽 数据结构篇】顺序结构的二叉树——堆

文章目录 一、堆1. 概念与分类2. 结构与性质3. 入堆4. 出堆 二、堆排序三、堆排序的应用——TOP-K问题 一、堆 1. 概念与分类 上一期我们提到&#xff0c;二叉树的实现既可以用顺序结构&#xff0c;也可以用链式结构。本篇我们来学习顺序结构的二叉树&#xff0c;起个新名字—…

数据结构系列一:初识集合框架+复杂度

前言 数据结构——是相互之间存在一种或多种特定关系的数据元素的集合。数据结构是计算机专业的基础课程&#xff0c;但也是一门不太容易学好的课&#xff0c;它当中有很多费脑子的东西&#xff0c;之后在学习时&#xff0c;你若碰到了困惑或不解的地方 都是很正常的反应&…

Python 入门教程(2)搭建环境 | 2.3、VSCode配置Python开发环境

文章目录 一、VSCode配置Python开发环境1、软件安装2、安装Python插件3、配置Python环境4、包管理5、调试程序 前言 Visual Studio Code&#xff08;简称VSCode&#xff09;以其强大的功能和灵活的扩展性&#xff0c;成为了许多开发者的首选。本文将详细介绍如何在VSCode中配置…

VSCode自定义快捷键和添加自定义快捷键按键到状态栏

VSCode自定义快捷键和添加自定义快捷键按键到状态栏 &#x1f4c4;在VSCode中想实现快捷键方式执行与某些指令操作进行绑定&#xff0c;可以通过配置组合式的键盘按键映射来实现&#xff0c;另外一种方式就是将执行某些特定的指令嵌入在面板菜单上&#xff0c;在想要执行的时候…

Linux系统安装MySQL5.7(其他版本类似)避坑指南

1.远程连接 在Linux系统安装好MySQL5.7数据库&#xff0c;不要以为就大功告成了后面还有大坑等着你踩了。宏哥这里介绍一下远程连接遇到的坑以及如何处理。由于征文要求安装环境教学除外宏哥这里就不介绍在Linux系统安装mysql数据库&#xff0c;有需要的可以自己百度一下。但是…

HybridCLR+Adressable+Springboot热更

本文章会手把手教大家如何搭建HybridCLRAdressableSpringboot热更。 创作不易&#xff0c;动动发财的小手点个赞。 安装华佗 首先我们按照官网的快速上手指南搭建一个简易的项目&#xff1a; 快速上手 | HybridCLR 注意在热更的代码里添加程序集。把用到的工具放到程序集里…

C语言(12)--------->for循环

在C语言中&#xff0c;有三大结构&#xff1a;顺序、选择、循环。这些结构可以用于处理生活中各种各样的复杂问题。选择结构通常是用if语句或者switch语句实现&#xff0c;可参考前面的博客&#xff1a; C语言&#xff08;7&#xff09;------------&#xff1e;if语句CSDN C…

react路由总结

目录 一、脚手架基础语法(16~17) 1.1、hello react 1.2、组件样式隔离(样式模块化) 1.3、react插件 二、React Router v5 2.1、react-router-dom相关API 2.1.1、内置组件 2.1.1.1、BrowserRouter 2.1.1.2、HashRouter 2.1.1.3、Route 2.1.1.4、Redirect 2.1.1.5、L…

JAVA最新版本详细安装教程(附安装包)

目录 文章自述 一、JAVA下载 二、JAVA安装 1.首先在D盘创建【java/jdk-23】文件夹 2.把下载的压缩包移动到【jdk-23】文件夹内&#xff0c;右键点击【解压到当前文件夹】 3.如图解压会有【jdk-23.0.1】文件 4.右键桌面此电脑&#xff0c;点击【属性】 5.下滑滚动条&…

拆解微软CEO纳德拉战略蓝图:AI、量子计算、游戏革命如何改写未来规则!

2025年2月19日 知名博主Dwarkesh Patel对话微软CEO萨蒂亚纳德拉 在最新访谈释放重磅信号&#xff1a;AI将掀起工业革命级增长&#xff0c;量子计算突破引爆材料科学革命&#xff0c;游戏引擎进化为世界模拟器。 整个视频梳理出几大核心观点&#xff0c;揭示科技巨头的未来十年…

记录此刻:历时两月,初步实现基于FPGA的NVMe SSD固态硬盘存储控制器设计!

背景 为满足实验室横向项目需求&#xff0c;在2024年12月中下旬导师提出基于FPGA的NVMe SSD控制器研发项目。项目核心目标为&#xff1a;通过PCIe 3.0 x4接口实现单盘3000MB/s的持续读取速率。 实现过程 调研 花了半个月的时间查阅了一些使用FPGA实现NVME SSD控制器的论文、…

Grok 3与GPT-4.5的“智能天花板”争夺战——谁才是大模型时代的算力之王?

2025年2月18日&#xff0c;马斯克旗下 xAI 高调发布新一代大模型Grok 3&#xff0c;号称“地球上最聪明AI”&#xff0c;在数学推理、代码生成等核心能力上碾压 GPT-4o、DeepSeek-V3 等对手。而就在同一天&#xff0c;OpenAI创始人 Sam Altman 暗示 GPT-4.5 即将登场&#xff0…

Window电脑中 Linux 系统配置VMware固定IP【最新详细】

一、为什么需要固定IP 当前我们虚拟机的Linux操作系统&#xff0c;其IP地址是通过DHCP服务获取的&#xff0c;DHCP&#xff1a;动态获取IP地址,即每次重启设备后都会获取一次&#xff0c;可能导致IP地址频繁变更。 原因1&#xff1a;办公电脑IP地址变化无所谓&#xff0c;但是…

网络安全高级软件编程技术

安全软件开发入门 软件安全问题 有趣的《黑客帝国》终极解释&#xff1a; 《黑客帝国》故事里面的人物关系&#xff0c;就像电脑里面的各种程序的关系一样&#xff1a; 电脑里面的系统程序&#xff1a;Matrix&#xff1b; 病毒程序&#xff1a;以Neo为首的人类&#xff1b; …

【AI学习笔记】2月10日李飞飞巴黎AI峰会演讲:探索 AI 的历史、现状与未来

【AIGC学习笔记】2月10日李飞飞巴黎AI峰会演讲&#xff1a;探索 AI 的历史、现状与未来 AI 的历史根基与发展历程 生命起源与智能诞生&#xff1a;5 亿年前视觉概念的出现推动了智能的诞生。最初的感知仅仅是被动的体验&#xff0c;只是但随着神经系统的活跃&#xff0c;视觉…

一文读懂Docker之Docker Compose

目录 一、Docker Compose简介 二、Docker Compose的安装和基本使用 1、Docker Compose的安装 步骤一、下载docker-compose 步骤二、新增可执行权限 步骤三、查看是否安装成功 2、Docker Compose的基本使用 (1)、docker-compose up (2)、docker-compose ps (3)、docke…

算法常见八股问题整理

1.极大似然估计和交叉熵有什么关系 在分类问题中&#xff0c;当我们使用softmax函数作为输出层时&#xff0c;最大化对数似然函数实际上等价于最小化交叉熵损失函数。具体来说&#xff0c;在多分类情况下&#xff0c;最大化该样本的对数似然等价于最小化该样本的交叉熵损失。 交…

自注意力机制和CNN的区别

CNN&#xff1a;一种只能在固定感受野范围内进行关注的自注意力机制。​CNN是自注意力的简化版本。自注意力&#xff1a;具有可学习感受野的CNN。自注意力是CNN的复杂形态&#xff0c;是更灵活的CNN&#xff0c;经过某些设计就可以变为CNN。 越灵活、越大的模型&#xff0c;需要…

书生大模型实战营14-MindSearch深度解析实践

文章目录 L2——进阶岛MindSearch深度解析实践1 MindSearch 简介2 开发环境配置2.1. 打开codespace主页&#xff0c;选择Blank模板进行创建2.2. 创建conda环境隔离并安装依赖 3. 获取硅基流动API KEY4. 启动MindSearch4.1. 启动后端4.2. 启动前端 5. 部署到自己的 HuggingFace …

【Linux系统】—— 冯诺依曼体系结构与操作系统初理解

【Linux系统】—— 冯诺依曼体系结构与操作系统初理解 1 冯诺依曼体系结构1.1 基本概念理解1.2 CPU只和内存打交道1.3 为什么冯诺依曼是这种结构1.4 理解数据流动 2 操作系统2.1 什么是操作系统2.2 设计OS的目的2.3 操作系统小知识点2.4 如何理解"管理"2.5 系统调用和…