输入菜单关键字,遍历匹配到 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);});

 

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

动手学大模型应用开发,第5天:大模型评估

第一章、验证迭代的一般思路 根据前文所讲解的大模型开发流程,我们可以发现,以调用、发挥大模型为核心的大模型开发相较传统的 AI 开发更注重验证迭代。由于你可以快速构建出基于 LLM 的应用程序,在几分钟内定义一个 Prompt,并在几小时内得到反馈结果,那么停下来收集一千个…

AI大模型完全本地化部署指南——从零硬件开始

本文将从基础硬件购置开始讲起,真正意义上从零开始,最终通过Ollama、LangChain、DeepSeek的一系列交互,输出本地大模型的第一声啼鸣,带你走进另一片广阔的世界。update:2025-02-23硬件方面 主板选型:主机组装:P40显卡拆解,改散热:kali显卡驱动安装软件方面 ollama服务端…

juc-01-多线程基本知识

进程与线程的关系:一个进程由一到多个线程组成。线程是cpu最小的调度单位。 进程是资源分配的最小单位。 并行与并发:并行:同一时刻执行多个任务。 并发:同一时刻,微观串行,宏观并行,cpu极速切换执行线程。单核cpu,如果没有并发,则不能同时执行多个任务同步与异步:同…

OceanBase数据库实战:Windows Docker部署与DBeaver无缝对接

一、前言 OceanBase 是一款高性能、高可扩展的分布式数据库,适用于大规模数据处理和企业级应用。 随着大数据和云计算的普及,OceanBase 在企业数字化转型中扮演着重要角色。学习 OceanBase 可以帮助开发者掌握先进的分布式数据库技术,提升数据管理能力。使用 Docker 安装 Oc…

爬虫随笔(四) scrapy

声明本账号中的所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁,用于商业用途和非法用途,否则有此产生的一切后果均与作者无关! scrapy在使用scrapy前准备工作,首先在pycharm中运行 pip install scrap…

微信小程序自动生成二维码

1、下载包 npm i weapp-qrcode 安装完成之后,出现这个文件夹 2. 构建npm打开微信开发者工具,进入对应的小程序项目。点击菜单栏中的 “工具” -> “构建 npm” 。 构建完成后,会在项目中生成一个miniprogram_npm文件夹 3、页面中引用 在js中调用方法 先引用: 显示效果…

QT布局管理器(QVBoxLayout,QHBoxLayout)不同部分比例大小设置方法

QT布局管理器(QVBoxLayout,QHBoxLayout)不同部分比例大小设置方法默认情况如果将多个控件加入到QT的布局管理器中(QVBoxLayout、QHBoxLayout)所有控件占用的宽度/高度是等比例大小的。然后,在实际应用和开发中往往希望在同一个布局管理器中,根据控件实际显示内容的多少或…

哪吒探针V1:全新版安装

哪吒探针可以方便的帮助我们监控服务器性能。 本文为大家带来最新版v1的安装过程。 一、安装控制面板 运行一键安装脚本 curl -L https://gitee.com/naibahq/scripts/raw/main/install.sh -o nezha.sh && chmod +x nezha.sh && sudo CN=true ./nezha.sh这里我们…

分散的离开公司的跨国纠纷的广泛斯大林年的;;;反斯大林可能的司法法国vdnmfjioaspgrjosgmdlfbdfvb

法斯基返回南京了哦;角色的绿柠檬酸公司经理年女郎科技的风格vs的风俗哦管理呢诺夫斯基考虑过赛时T1正解没调出来。打暴力,第二个暴力二分挂了但第一档暴力都是第二档的数据,but我先判的第二档,so人麻了。 不管了反正都要退役了,就先**这样吧。__________________________…

FrameScan:cms漏洞检测框架

免责声明: 工具仅供安全研究与学习之用,若将工具做其他用途,由使用者承担全部法律及连带责任,作者及发布者不承担任何法律及连带责任。信息及工具收集于互联网,真实性及安全性自测!!!项目介绍 FrameScan是一款python3编写的简易的cms漏洞检测利用框架,支持漏洞检测与简…

fork打开VS Code

在 File → Preferences → Custom Commands 中,添加 Respository 命令。 #!/bin/bash# 已知的路径格式(Unix/Linux风格,其中/d表示D盘) unix_path=$PWD# 提取盘符(注意:这里假设盘符总是小写,并且紧跟在根斜杠后面) disk_letter="${unix_path:1:1}" disk_le…