当前位置: 首页 > news >正文

输入菜单关键字,遍历匹配到 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] 作为节点 IDtr.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);// 添加加载loadingvar _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 作为节点 IDtarget.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 作为节点 IDtarget.renderRow(tr, item);tbody.append(tr);}});target.append(tbody);// 初始化treegridtarget.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 - 博客园

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

相关文章:

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

菜单检索&#xff0c;名称、地址、权限标志 等 关键字匹配、展开、高亮(全程借助 DeepSeek ) 便捷简洁的企业官网 的后台菜单管理&#xff0c;图示&#xff1a; 改造点&#xff1a; &#xff08;1&#xff09;修改 bootstrapTreeTable 的节点class命名方式为&#xff1a;treeg…...

【Blender】二、建模篇--07,置换修改器

0 00:00:03,620 --> 00:00:08,620 大家好 这张课呢 我们来讲建模篇的最后一个重点修改器 置换修改器 1 00:00:08,980 --> 00:00:17,580 把它放在最后 不是因为它最难 而是因为它很常用 尤其大家以后做材质的时候 我们可以用一张贴图把一个平面做出来凹凸的感觉 2 00:00…...

玩转 Java 与 Python 交互,JEP 库来助力

文章目录 玩转 Java 与 Python 交互&#xff0c;JEP 库来助力一、背景介绍二、JEP 库是什么&#xff1f;三、如何安装 JEP 库&#xff1f;四、JEP 库的简单使用方法五、JEP 库的实际应用场景场景 1&#xff1a;数据处理场景 2&#xff1a;机器学习场景 3&#xff1a;科学计算场…...

鸿蒙学习-

鸿蒙数据传值 //* 传值 //* State /**State创建一个响应式的数据&#xff0c;但不是所有的更改都会引起刷新&#xff0c;只有被框架观察到的修改才会被刷新UI* 1. 基本数据类型如 number string boolean等值的变化修改* 2. Object类型&#xff0c;只会观察到第一层的数据变化或…...

list结构刨析与模拟实现

目录 1.引言 2.C模拟实现 2.1模拟实现结点 2.2模拟实现list前序 1&#xff09;构造函数 2&#xff09;push_back函数 2.3模拟实现迭代器 1&#xff09;iterator 构造函数和析构函数&#xff1a; *操作符重载函数&#xff1a; 前置/后置/--&#xff1a; /!操作符重载…...

机器人部分专业课

华东理工 人工智能与机器人导论 Introduction of Artificial Intelligence and Robots 必修 考查 0.5 8 8 0 1 16477012 程序设计基础 The Fundamentals of Programming 必修 考试 3 64 32 32 1 47450012 算法与数据结构 Algorithm and Data Structure 必修 考试 3 56 40 …...

流行粗野主义几何风现代曲线标题logo设计psai无衬线英文字体安装包 Mortend – Extended Family

介绍我们名为 Mortend 的新探索&#xff0c;这是一个强大的扩展字体系列。Mortend 的设计具有几何形状、大胆、强烈的曲线和现代感。灵感来自当今流行的粗野主义海报和极简主义设计&#xff0c;让您有更多机会表达您的创造力。这个字体系列带来了强烈的感觉而优雅的外观&#x…...

前端常见面试题-2025

vue4.0 Vue.js 4.0 是在 2021 年 9 月发布。Vue.js 4.0 是 Vue.js 的一个重要版本&#xff0c;引入了许多新特性和改进&#xff0c;旨在提升开发者的体验和性能。以下是一些关键的更新和新特性&#xff1a; Composition API 重构&#xff1a;Vue 3 引入了 Composition API 作为…...

高通Camera点亮3——Camera Module

Camera点亮除了Sensor之外还需要配置module、EEPROM等&#xff0c;multicamera&#xff1b;配置好编译设置。 Module <?xml version"1.0" encoding"utf-8" ?> <cameraModuleData<!--Module group can contain either 1 module or 2 modules…...

学习路程二 LangChain基本介绍

前面简单调用了一下deepseek的方法&#xff0c;发现有一些疑问和繁琐的问题&#xff0c;需要更多的学习&#xff0c;然后比较流行的就是LangChain这个东西了。 目前大部分企业都是基于 LangChain 、qwen-Agent、lammaIndex框架进行大模型应用开发。LangChain 提供了 Chain、To…...

Docker-技术架构演进之路

目录 一、概述 常见概念 二、架构演进 1.单机架构 2.应用数据分离架构 3.应用服务集群架构 4.读写分离 / 主从分离架构 5.引入缓存 —— 冷热分离架构 6.垂直分库 7.业务拆分 —— 微服务 8.容器化引入——容器编排架构 三、尾声 一、概述 在进行技术学习过程中&am…...

API接口设计模式:从分层架构到CQRS的实战应用

以下将从分层架构和 CQRS&#xff08;命令查询职责分离&#xff09;的基本概念入手&#xff0c;为你阐述从分层架构到 CQRS 的实战应用相关内容&#xff1a; 分层架构 概念&#xff1a;分层架构是将系统按照功能划分为不同的层次&#xff0c;每个层次负责特定的职责&#xff0c…...

【机器学习】【KMeans聚类分析实战】用户分群聚类详解——SSE、CH 指数、SC全解析,实战电信客户分群案例

1.引言 在实际数据分析中&#xff0c;聚类算法常用于客户分群、图像分割等场景。如何确定聚类数 k 是聚类分析中的关键问题之一。本文将以“用户分群”为例&#xff0c;展示如何通过 KMeans 聚类&#xff0c;利用 SSE&#xff08;误差平方和&#xff0c;也称 Inertia&#xff…...

【C++】 时间库chrono计算程序运行时间

C 时间库chrono计算程序运行时间 本文总结了chrono库的引入方法以及计算程序片段运行时间的方法 一、chrono库的引入方法&#xff08;注意事项&#xff09; 首先chrono是属于std命名空间的。 所以在程序中应该这样包含头文件&#xff1a; #include <chrono> using n…...

PCL 边界体积层次结构(Boundary Volume Hierarchy, BVH)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 边界体积层次结构(Boundary Volume Hierarchy, BVH) 是一种高效的空间数据结构,广泛应用于计算机图形学、计算机视觉、机器人学、物理仿真等领域。它的核心思想是通过将空间递归地划分为层次化的包围体(通常是轴…...

算法随笔_58: 队列中可以看到的人数

上一篇:算法随笔_57 : 游戏中弱角色的数量-CSDN博客 题目描述如下: 有 n 个人排成一个队列&#xff0c;从左到右 编号为 0 到 n - 1 。给你以一个整数数组 heights &#xff0c;每个整数 互不相同&#xff0c;heights[i] 表示第 i 个人的高度。 一个人能 看到 他右边另一个人…...

创建React项目的三个方式

创建React项目 创建一个React项目非常简单&#xff0c;通常有几种方法可以进行&#xff0c;下面是最常见的几种方法&#xff1a; 1. 使用 create-react-app (已经不被推荐了) create-react-app 是一个官方的脚手架工具&#xff0c;用于快速创建 React 项目。它会为你配置好很…...

QT闲记-工具栏

工具栏通常用来放置常用的操作按钮,如QPushButton,QAction等。可以放置在顶部,底部,左侧,右侧,并且支持拖曳,浮动。 1、创建工具栏 通常通过QMainWindow 提供的addToolBar()来创建,它跟菜单栏一样,如果需要工具栏,一般情况下,我们设置这个类的基类为QMainWindow。 …...

为什么继电器要加一个反向并联一个二极管

1 动感就是电流不突变 2 为什么有的继电器上面要反向并联一个二极管和电阻 1 并联二极管是为消除掉动感产生的高压 2 加上二极管是为了让继电器更快的断开&#xff08;二极管选型的工作电流要大于动感电流&#xff0c;开关要够快&#xff09; 3 公式&#xff1a;二极管压降0…...

【Leetcode 每日一题 - 扩展】1512. 好数对的数目

问题背景 给你一个整数数组 n u m s nums nums。 如果一组数字 ( i , j ) (i,j) (i,j) 满足 n u m s [ i ] n u m s [ j ] nums[i] nums[j] nums[i]nums[j] 且 i < j i < j i<j&#xff0c;就可以认为这是一组 好数对 。 返回好数对的数目。 数据约束 1 ≤ n …...

LWIP TCP定时器源码实战:手把手调试tcp_slowtmr与tcp_fasttmr(附避坑指南)

LWIP TCP定时器深度调试实战&#xff1a;从源码到问题定位的全链路指南 在嵌入式网络开发中&#xff0c;TCP连接的稳定性往往决定着产品的成败。当设备出现莫名断连、数据传输卡顿或资源异常消耗时&#xff0c;很多工程师的第一反应是检查网络环境或应用层代码&#xff0c;却忽…...

数学建模小白必看:从组队到拿奖,避开这5个坑你也能成大神

数学建模竞赛避坑指南&#xff1a;从组队到获奖的实战策略 第一次参加数学建模竞赛时&#xff0c;我和两位室友组队&#xff0c;信心满满地选了最短的题目——结果三天后交了一篇连格式都没调好的论文。那次惨痛经历让我明白&#xff0c;数学建模远不止解题那么简单。本文将分…...

Windows平台终极ADB和Fastboot驱动一键安装完整指南:3分钟搭建安卓开发环境

Windows平台终极ADB和Fastboot驱动一键安装完整指南&#xff1a;3分钟搭建安卓开发环境 【免费下载链接】Latest-adb-fastboot-installer-for-windows A Simple Android Driver installer tool for windows (Always installs the latest version) 项目地址: https://gitcode.…...

从图纸到代码:如何用可编辑架构图提升深度学习开发效率

从图纸到代码&#xff1a;如何用可编辑架构图提升深度学习开发效率 【免费下载链接】Neural-Network-Architecture-Diagrams Diagrams for visualizing neural network architecture 项目地址: https://gitcode.com/gh_mirrors/ne/Neural-Network-Architecture-Diagrams …...

阅读效率低下,读后即忘,还怎么写文献综述?

对于每一位研究生来说&#xff0c;开题报告的文献综述环节堪称“第一道难关”。面对领域内成百上千篇中英文文献&#xff0c;熬了几个通宵精读&#xff0c;合上文献却记不清核心观点&#xff1b;好不容易整理出一堆笔记&#xff0c;拼凑起来的综述却逻辑混乱、重点模糊&#xf…...

KMS_VL_ALL_AIO深度解析:企业级Windows与Office批量激活完整指南

KMS_VL_ALL_AIO深度解析&#xff1a;企业级Windows与Office批量激活完整指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 在当今企业IT环境中&#xff0c;Windows和Office的批量许可证管理是…...

世界模型:AI理解现实的新范式与AGI的关键路径

摘要 世界模型是一种能够对现实世界环境进行仿真,并基于文本、图像、视频及运动等多模态输入生成视频、预测未来状态的生成式人工智能模型。它解决了传统大模型"只懂语言、不懂物理、只会生成、不会推演"的幻觉与落地瓶颈,被认为是实现通用人工智能(AGI)的必经之路…...

从航拍到穿越:手动模式FPV入门避坑指南(附FPV Freerider地图设置)

从航拍到穿越&#xff1a;手动模式FPV入门避坑指南 第一次松开自稳模式开关时&#xff0c;我的手指在遥控器上颤抖了整整三秒。眼前这个5英寸的碳纤维小怪兽突然像脱缰野马般开始自由落体&#xff0c;而过去三年航拍积累的肌肉记忆完全失效——这就是大多数航拍飞手转型FPV时遭…...

不止于错误捕获:深入Tcl的catch命令,玩转break、continue和return的异常流

深入解析Tcl的catch命令&#xff1a;掌控脚本流程的终极武器 在Tcl脚本编程中&#xff0c;异常处理是构建健壮应用程序的关键。大多数开发者对catch命令的理解停留在简单的错误捕获层面&#xff0c;却忽略了它作为流程控制枢纽的强大潜力。本文将带你重新认识这个被低估的语言特…...

HTTrack网站镜像工具:如何高效构建离线浏览环境的完整指南

HTTrack网站镜像工具&#xff1a;如何高效构建离线浏览环境的完整指南 【免费下载链接】httrack HTTrack Website Copier, copy websites to your computer (Official repository) 项目地址: https://gitcode.com/gh_mirrors/ht/httrack 在当今快速发展的数字时代&#…...