树状菜单(利用映射-bootstrap+jQuery实现折叠功能)

效果(默认全部展开):
在这里插入图片描述

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title><linkrel="stylesheet"href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css"/><script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script><script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script></head><style>/* 树状菜单 */#ulShow {height: 100%;}#ulShow > .list-group {color: #fff;margin: 0;height: 40px;line-height: 40px;margin: 0;list-style: none;}/* 一级菜单 */#ulShow > .list-group > .list-group {margin: 0;padding-left: 20px;background-color: #2d363f;}#ulShow > .list-group > .collapse > .list-group {margin: 0;}/* 动画进行时的样式设置,要和动画结束时的样式保持一致 */#ulShow > .list-group > .collapse > .list-group > .list-group-item,#ulShow > .list-group .collapsing .list-group-item {display: flex;align-items: center;padding: 0;padding-left: 40px;background-color: #1e2d3b;border: 0;}#ulShow > .list-group > .collapse > .list-group > .list-group-item a,#ulShow > .list-group .collapsing .list-group-item a {text-decoration: none;color: #fff;}#ulShow > .list-group > .collapse > .list-group > .list-group-item:hover,#ulShow > .list-group .collapsing .list-group-item:hover {background: #2d363f;cursor: pointer;}#ulShow > .list-group > .collapse > .list-group > .list-group-item:hover a,#ulShow > .list-group .collapsing .list-group-item:hover a {color: lightblue;}#ulShow > .list-group .collapsing {transition: height 0.5s ease;/* 修改为你想要的持续时间和缓动函数 *//* 动画加载时会有一个向下的高度占位 *//* background-color: red; */}</style><body><div id="ulShow"></div><script>const menuArray = [{ id: 1, pageName: "用户管理", pid: 0 },{ id: 2, pageName: "图书管理", pid: 0 },{ id: 3, pageName: "销售管理", pid: 0 },{ id: 4, pageName: "借阅管理", pid: 0 },{ id: 5, pageName: "系统设置", pid: 0 },{ id: 6, pageName: "用户类型管理", pid: 1 },{ id: 7, pageName: "用户信息管理", pid: 1 },{ id: 8, pageName: "新增用户", pid: 1 },{ id: 9, pageName: "图书类型管理", pid: 2 },{ id: 10, pageName: "图书管理", pid: 2 },{ id: 11, pageName: "入库管理", pid: 3 },{ id: 12, pageName: "出库管理", pid: 3 },{ id: 13, pageName: "借书管理", pid: 4 },{ id: 14, pageName: "还书管理", pid: 4 },{ id: 15, pageName: "退出", pid: 5 },];function showMenu(menuArray) {// 创建一个映射对象,用于存储菜单项及其子菜单项,map是计算结束后返回的值,是下一次调用回调时的第一个参数;item是当前值const itemMap = menuArray.reduce((map, item) => {// 将每个菜单项添加到映射中,并初始化其子菜单项数组/*在这段代码中,...item 用于对象展开(Object Spreading)是有效的,因为它正确地复制了 item 对象的所有可枚举属性到新创建的对象中。对象展开(Object Spreading)与浅拷贝(Shallow Copy)是相关的概念。在这段代码中,...item 进行的操作实际上是一个浅拷贝。浅拷贝是指创建一个新对象,并将原始对象的所有非静态属性的值复制到新对象中。如果这些属性值是基本类型(如数字、字符串、布尔值),则直接复制值;如果属性值是引用类型(如对象、数组),则复制的是内存中的地址,而不是实际的对象或数组。这意味着新对象和原始对象仍然共享对这些引用类型属性的引用。在对象展开中,...item 创建了一个新对象,并将 item 的所有可枚举属性复制到新对象中。由于这些属性是按值复制的,如果属性是基本类型,它们将被直接复制;如果属性是引用类型(例如,另一个对象或数组),则复制的是对这个引用类型值的引用,而不是实际的对象或数组本身。因此,对象展开在这种情况下执行的是一个浅拷贝。这段代码中的 subItems: [] 创建了一个新的空数组,并将其赋值给新对象的 subItems 属性。这是对新数组的一个独立引用,它不会影响原始 item 对象中的任何属性或数组。因此,当你在这段代码中使用 ...item 时,你正在创建一个新对象,该对象包含原始 item 对象的所有属性的浅拷贝,并且添加了一个新的 subItems 属性,该属性指向一个全新的数组。这样,每个 item 在 itemMap 中都有一个独立的、不与其他 item 共享的 subItems 数组。*/map[item.id] = { ...item, subItems: [] };// 如果菜单项没有父级(顶级菜单项),则标记为顶级if (item.pid === 0) {map[item.id].topLevel = true;} else {// 如果菜单项有父级,则将其添加到父级菜单项的子菜单项数组中const parentId = item.pid;if (map[parentId]) {map[parentId].subItems.push(item);}}return map;}, {});console.log(itemMap, "itemMap");// 从映射中提取所有顶级菜单项,返回一个新数组const topLevelItems = Object.values(itemMap).filter((item) => item.topLevel);// 构建顶级菜单项的 HTML 内容const listGroupContent = topLevelItems.map((topItem) => {let subItemsHtml = "";// 如果顶级菜单项有子菜单项,则构建子菜单项的 HTML 内容if (topItem.subItems.length > 0) {// 为子菜单项创建一个唯一的 collapse IDconst collapseId = `collapse-${topItem.id}`;// 构建子菜单项的列表组,并将其包装在一个 collapse 元素中subItemsHtml =`<div class="collapse" id="${collapseId}">` +`<ul class="list-group list-group-flush">` +topItem.subItems.map((subItem) =>// 将子菜单项转换为 a 标签,并设置 href 属性`<li class="list-group-item subItem" οnclick="handleSubItem('${subItem.pageName}')"><a href="#">${subItem.pageName}</a></li>`).join("") +`</ul>` +`</div>`;// 创建折叠触发器的按钮,并设置 data-target 属性以指向相应的 collapse 元素const triggerButton = `<div class="list-group"  data-toggle="collapse" data-target="#${collapseId}" aria-expanded="false" aria-controls="${collapseId}">${topItem.pageName}</div>`;// 返回顶级菜单项的 HTML 内容,包括折叠触发器和子菜单项return triggerButton + subItemsHtml;} else {// 如果顶级菜单项没有子菜单项,则只创建一个 a 标签return `<li class="list-group-item"><a href="#">${topItem.pageName}</a></li>`;}}).join("");// 清空 ulShow 元素的内容,并添加新构建的列表组内容$("#ulShow").empty().append(`<ul class="list-group">${listGroupContent}</ul>`);// 初始化所有 collapse 元素以启用折叠功能$(".collapse").collapse();}function handleSubItem(pageName) {console.log(pageName, "pageName");}$(".subItem").on("click", function (pageName) {handleSubItem(pageName);});window.onload = function () {showMenu(menuArray);};</script></body>
</html>

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

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

相关文章

CSS的background 背景图片自动适应元素大小,实现img的默认效果 background-size:100% 100%;

CSS的background 背景图片自动适应元素大小,实现img的默认效果 background-size:100% 100%; 关键是background-size:100% 100%; background-size:100% 100%; background-size:100% 100%; background-size:contain; 保持纵横比, 容器部分可能空白background-size:cover; 保…

解锁Spring Boot中的设计模式—02.解释器模式:探索【解释器模式】的奥秘与应用实践!

解释器模式 1.简介 解释器模式&#xff08;Interpreter Pattern&#xff09;是一种行为设计模式&#xff0c;它用于定义语言的文法&#xff0c;并且解释语言中的表达式。在Java中&#xff0c;解释器模式可以用于构建解释器以解析特定的语言或表达式&#xff0c;如数学表达式、…

C++面试宝典第28题:寻找丢失的数字

题目 给定一个包含n个整数的数组nums,其中nums[i]在区间[1, n]内。请找出所有在[1, n]范围内,但没有出现在nums中的数字,并以数组的形式返回结果。 示例1: 输入:nums = [4, 3, 2, 7, 8, 2, 3, 1] 输出:[5, 6] 示例2: 输入:nums = [1, 1] 输出:[2] 解析 初看这道题,…

【lesson57】信号量和生产者消费者模型(环形队列版)

文章目录 信号量概念信号量接口初始化销毁等待发布 基于环形队列的生产者消费者模型编码Common.hLockGuard.hppTask.hppsem.hppRingQueue.hppConProd.cc 信号量概念 POSIX信号量和SystemV信号量作用相同&#xff0c;都是用于同步操作&#xff0c;达到无冲突的访问共享资源目的…

【测试】JUnit

目 录 一.注解二.断言三.用例的执行顺序四.参数化五.测试套件 自动化就是 selenium 脚本来实现的 junit 是 java 的单亓测试工具&#xff0c;只不过我们在实现自动化的时候需要借用一下下 junit 库里面提供的一些方法 引入依赖 Junit 5 <!-- https://mvnrepository.com/a…

自然语言编程系列(二):自然语言处理(NLP)、编程语言处理(PPL)和GitHub Copilot X

编程语言处理的核心是计算机如何理解和执行预定义的人工语言&#xff08;编程语言&#xff09;&#xff0c;而自然语言处理则是研究如何使计算机理解并生成非正式、多样化的自然语言。GPT-4.0作为自然语言处理技术的最新迭代&#xff0c;其编程语言处理能力相较于前代模型有了显…

电子元器件基础5---二极管

除了电阻、电容和电感等线性元器件之外,还有二极管、三极管这些常用的非线性器件广泛应用于日常生活中。那么今天我们来介绍以下二极管这一常用的电子元器件。 一、二极管概念 二极管是用半导体材料(硅、硒、锗等)制成的一种电子器件 。二极管有两个电极,正极,又叫阳极;负…

django报错:Cannot use ImageField because Pillow is not installed

1、问题概述 ERRORS: accounts.User.avatar: (fields.E210) Cannot use ImageField because Pillow is not installed. HINT: Get Pillow at https://pypi.org/project/Pillow/ or run command "python -m pip install Pillow". System check identified 1 …

JDK1.8安装教程

目录 下载安装环境配置打开系统高级设置环境配置 验证安装是否成功 下载 https://www.oracle.com/java/technologies/downloads/#java8-windows 安装 打开安装包&#xff0c;点击下一步。 选择好自己熟悉的目的安装目录&#xff0c;点击下一步。 等待安装 选择好jre的安装目…

ubuntu22.04@laptop OpenCV Get Started: 013_contour_detection

ubuntu22.04laptop OpenCV Get Started: 013_contour_detection 1. 源由2. 应用Demo2.1 C应用Demo2.2 Python应用Demo 3. contour_approx应用3.1 读取图像并将其转换为灰度格式3.2 应用二进制阈值过滤算法3.3 查找对象轮廓3.4 绘制对象轮廓3.5 效果3.6 CHAIN_APPROX_SIMPLE v.s…

java中的枚举

枚举 枚举类型的概述 关键字&#xff1a;enum 你可以把枚举类型理解成是一个自定义的常量的序列 枚举的语法结构 定义的枚举类型文件 package com.it.xiaosi.demo01;/*** Classname : direction* Description : TODO 枚举* Author : lin_refuelqq.com*/ public enum direct…

springboot第56集:微服务框架,物联网IOT,SQL数据库MySQL底层,AOP收集业务操作日志架构周刊...

单点登录 1.配置代理信息 /*请求登陆的方法*/ "/modelLogin": {//本地服务接口地址&#xff0c;这是测试环境&#xff0c;正式环境需要更改下地址target: "http://127.0.0.1:6776/xxx-auth/",changeOrigin: true,pathRewrite: {"^/modelLogin": …

在ubuntu中制作ubuntu的U盘启动盘

概要&#xff1a; 本篇演示在ubuntu22.04中制作ubuntu22.04的U盘启动盘 一、下载ubuntu22.04的iso文件 访问ubuntu官网https://ubuntu.com自行下载ubuntu官网 二、制作U盘启动盘 打开系统自带软件Startup Disk Creator 软件会自动检测iso文件和U盘 点击Make Startup Disk…

【Java EE初阶十二】网络原理(二)

2. 传输层 2.2 TCP协议 2.2.2 关于可靠传输 4.滑动窗口 前面的三个机制&#xff0c;都是在保证 tcp 的可靠性&#xff1b; TCP 的可靠传输,是会影响传输的效率的.(多出了一些等待 ack 的时间,单位时间内能传输的数据就少了)&#xff1b; 滑动窗口,就让可靠传输对性能的影响,更…

MySQL数据库⑪_C/C++连接MySQL_发送请求

目录 1. 下载库文件 2. 使用库 3. 链接MySQL函数 4. C/C链接示例 5. 发送SQL请求 6. 获取查询结果 本篇完。 1. 下载库文件 要使用C/C连接MySQL&#xff0c;需要使用MySQL官网提供的库。 进入MySQL官网选择适合自己平台的mysql connect库&#xff0c;然后点击下载就行…

Day-02-02

Httpclient测试 安装HTTP Client插件 使用IDEA自带的http接口测试工具——HTTP Client Open in HTTP Client 生成测试用例 点击绿色箭头可以运行测试用例&#xff0c;控制台会输出结果。 保存和修改测试用例 在模块下新建一个api-test包用来存放测试用例&#xff0c;将生…

Packet content transfer stopped (received 8 bytes)

esp32烧录程序时报错&#xff1a;A fatal error occurred: Packet content transfer stopped (received 8 bytes) 解决方法&#xff1a; 降低上传速度&#xff0c;使用115200&#xff1b;更换flash模式&#xff0c;使用DIO方式重试如果还不行&#xff0c;检查flash连接情况&am…

failing dimm dimm location (uncorrectable memory component found)

开机界面出现这个 failing dimm dimm location (uncorrectable memory component found)“DIMM DIMM location. Uncorrectable memory component found” 是一条硬件故障信息&#xff0c;表明在服务器的某个特定双列直插式内存模块&#xff08;Dual In-line Memory Module, DI…

【漏洞复现】蓝网科技临床浏览系统信息泄露漏洞

Nx01 产品简介 蓝网科技临床浏览系统是一个专门用于医疗行业的软件系统&#xff0c;主要用于医生、护士和其他医疗专业人员在临床工作中进行信息浏览、查询和管理。 Nx02 漏洞描述 蓝网科技临床浏览系统存在信息泄露漏洞&#xff0c;攻击者可以利用该漏洞获取敏感信息。 Nx03…

深度学习基础之《TensorFlow框架(4)—Operation》

一、常见的OP 1、举例 类型实例标量运算add&#xff0c;sub&#xff0c;mul&#xff0c;div&#xff0c;exp&#xff0c;log&#xff0c;greater&#xff0c;less&#xff0c;equal向量运算concat&#xff0c;slice&#xff0c;splot&#xff0c;canstant&#xff0c;rank&am…