layui源码详细分析之树形菜单

2023-10-27

前言

今天分析的是layui框架内置模块tree.js,该模块的功能是构建树形菜单,具体的形式(layui官网该模块的具体形式)如下:
树形菜单

自实现树形菜单

使用html+css+js实现了树形菜单,具体的实现思路如下:

  • html中定义包含树形菜单的容器节点
  • 规划好树形菜单的样式以及图标
  • 使用js构建html结构以及绑定事件,实现树形菜单的点击折叠

实现效果图如下:
实现效果图
核心的实现是构建html结构,组织树状结构的数据,使用递归构建树,在本次实现中html的组织有两种形式,具体如下所述:

  • 子菜单和父菜单逻辑上形成父子关系,结构上是分离的
  • 子菜单和父菜单逻辑以及机构上都是父子关系

在刚一开始,我实际上是实现的第一种形式的,该形式的html结构体现如下:

<ul>
	<li>菜单1</li>
	<ul>
		<li>子菜单1</li>
		<li>子菜单2</li>
	</ul>
</ul>

后来又补充了下一种形式的(这种更常见),该形式的html结构体现如下:

<ul>
	<li>
		<span>菜单1</span>
		<ul>
			<li>子菜单1</li>
			<li>子菜单2</li>
		</ul>
    </li>
</ul>

递归形成树形菜单结构的代码如下(第二种形式):

tool.menuView = function(parentNode, menu) {
	if (!parentNode || parentNode.nodeType !== 1 ||   !Array.isArray(menu)) return;
        for (let i = 0; i < menu.length; i++) {
            let option = menu[i], name = option.name,
	            children = option.children, 
	            liNode = tool.createElement('li');
            tool.append(parentNode, liNode);
            if (children && children.length > 0) {
                 let ulNode = tool.createElement('ul');
                 tool.menuView(ulNode, children);
                 let [iNode, spanNode] = tool.createElement(['i', 'span'])
                 spanNode.innerText = name;
                 iNode.className = 'fa fa-play';
                 tool.append([liNode, parentNode, liNode], [[iNode, spanNode], [liNode], [ulNode]]);
             } else {
                 liNode.innerText = name;
             }
          }
   };

需要传入的数据形式如下:

data = [
	{
		name: '菜单1',
		children: [
			{
				name: '子菜单1'
			},
			{
				name: '子菜单2
			}
		]
	}
];

构建树形结构是关键的一步,之后就是对交互的处理,该模块的具体代码组织如下图:
tree模块代码组织

本次实现较大的缺点:

  • 可扩展性不强,对于树形菜单的css样式没有考虑作为模块来调用的形式,传入的容器id写死了(css样式)

下面来分析下layui内置的tree.js模块的具体实现以及模块代码组织结构,tree.js的代码组织如下图所示:
内置模块tree.js组织结构图

基本的使用形式是:layui.tree(options),简洁易用。该内置模块内容使用JQuery,对于树形结构的形成同样是采用递归形式生成,不过该内置模块还提供皮肤模式的选择等,对于扩展性等方面非常不错。

该内置模块的源码详细注释以及自实现demo一如既往会上传到我的Github上,每天都要接触新的知识点,将知识变为自己的永远是最好的。

致远方的你我
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

layui源码详细分析之树形菜单 的相关文章

  • 如何使用 JavaScript 创建链接?

    我有一个标题字符串和一个链接字符串 我不知道如何将两者放在一起以使用 JavaScript 在页面上创建链接 任何帮助表示赞赏 我试图解决这个问题的原因是因为我有一个 RSS 源并且有一个标题和 URL 列表 我想将标题链接到 URL 以使
  • 为什么 iife 在一个简单的例子中不起作用?

    我不明白为什么函数表达式调用不起作用并抛出错误 你能给我解释一下吗 var a function x alert x function a 1 谢谢大家 任务比我想象的要容易得多 这是因为 JS 将 IIFE 解析为函数的参数调用 这样做时
  • 如何在react-bootstrap中禁用表单提交的

    在下面的代码片段中 我有许多文本类型的输入表单 如果用户点击 我似乎会得到相同的合成事件 就像他们按下提交按钮一样 我想忽略作为表单提交 只允许一个人按下 提交 按钮 我删除了一些表单组以减少示例 在所有情况下 按钮或 ENTER 键 e
  • Chrome 中的性能问题

    我目前正在从事一个相对较大的项目 使用 AngularJs 构建 应用程序的一部分是一个表单 您可以向其中添加任意数量的页面 不幸的是 添加了很多不必要的垃圾 即表示表单模型的对象可能会变得非常大 在某些时候 Chrome 基本上无法处理它
  • 使用 dc.js 按条形值对条形图中的条形进行排序(排序)

    如何通过维度的计算值而不是维度本身的名称对 dc js 示例中的 x 轴 维度 进行排序 例如 请考虑序数条形图的 dc js 示例 https github com dc js dc js blob master web examples
  • 设置 cookie 时中断 JavaScript 执行

    当设置 cookie 时 是否可以始终中断浏览器开发人员工具中的 javascript 执行 无需显式设置 JS 断点 document cookie 在 html head 块的开头添加此代码片段效果很好
  • 如何解决 Typescript 构建中的错误“找不到模块 'jquery'”

    我目前在 ts 文件的顶部有这个import require jquery 我这样做是因为我试图在我的打字稿文件中使用 jquery 但我似乎无法编译它 因为它返回标题中所述的错误 我正在使用 ASP NET CORE 脚本文件夹 tsco
  • 在 HTML5 画布中,如何用我选择的背景遮盖图像?

    我试图用画布来实现这一点 globalCompositeOperation 但没有运气 所以我在这里问 这里有类似的问题 但我没有在其中找到我的案例 我的画布区域中有图层 从下到上的绘制顺序 画布底座填充纯白色 fff 用fillRect
  • 检查 jQuery 1.7 中是否存在基于文本的选择选项

    所以我有以下 HTML 片段
  • 将 UMD Javascript 模块导入浏览器

    你好 我正在对 RxJS 进行一些研究 我可以通过在浏览器中引用它来使用该库 如下所示 它使用全局对象命名空间变量 Rx 导入 我可以制作可观察的东西并做所有有趣的事情 当我将 src 更改为指向最新的 UMD 文件时 一切都会崩溃 如下所
  • 有没有办法在 onclick 触发时禁用 iPad/iPhone 上的闪烁/闪烁?

    所以我有一个有 onclick 事件的区域 在常规浏览器上单击时 它不会显示任何视觉变化 但在 iPad iPhone 上单击时 它会闪烁 闪烁 有什么办法可以阻止它在 iPad iPhone 上执行此操作吗 这是一个与我正在做的类似的示例
  • 页面上使用 HTML Editor Extender 进行回发会导致 IE11 中出现 JavaScript 错误

    我已将 HTML 编辑器扩展程序添加到我正在处理的页面中 现在每当我在页面上发回帖子时 都会收到以下 Javascript 错误 JavaScript 运行时错误 参数无效 之后什么也没有发生 这在 IE10 或更低版本以及我所知道的所有其
  • Three.js 各种大小的粒子

    我是 Three js 的新手 正在尝试找出添加 1000 个粒子的最佳方法 每个粒子都有不同的大小和颜色 每个粒子的纹理是通过绘制画布创建的 通过使用粒子系统 所有粒子都具有相同的颜色和大小 为每个粒子创建一个粒子系统是非常低效的 有没有
  • 使用 Vue 的多模式组件

    我在 Vue 中实现动态模式组件时遇到问题 A common approach I follow to display a set of data fetched from the db is I dump each of the rows
  • 代码镜像错误:未捕获错误:扩展集中无法识别扩展值([对象对象])

    全部 我目前正在从事一个React Electron项目 该项目的目标是完成一个Markdown编辑器 当我配置codemirror 该程序报告错误说 Uncaught Error Unrecognized extension value
  • 如何使用 crypto-js 解密 AES ECB

    我正在尝试将加密数据从 flash 客户端 发送到服务器端的 javascript 在 asp 中作为 jscript 运行 有几个 javascript Aes 库 但它们实际上没有文档记录 我正在尝试使用 crypto js 但无法让代
  • 如何隐藏/禁用 Highcharts.js 中的图例框?

    我想问是否可以使用 HighCharts js 库隐藏图表中的所有图例框 var chart object chart renderTo render to type graph type colors graph colors title
  • Javascript - 水波纹效果

    我需要 JS 上的脚本 它将以 水波纹 样式更改 images html 抱歉 6MB GIF 文件 http fcuunited ru temp listening2 gif http fcunited ru temp listening
  • 从 FileReader 设置背景图像样式

    我正在寻找一种解决方案 允许我从文件上传输入中获取文件并通过设置 document body style backgroundImage 来预览它 以下代码用于在 Image 元素中显示预览 function setImage id tar
  • 如何确定所有角度2分量都已渲染?

    当所有 Angular2 组件完成渲染时 是否会触发一个角度事件 For jQuery 我们可以用 function 然而 对于 Angular2 当domready事件被触发 html 只包含角度组件标签 每个组件完成渲染后 domrea

随机推荐

  • static修饰的函数能不能在其它文件里使用

    static修饰函数的作用 关于static关键字的作用可以参考我的博客 C语言中static关键字用法和作用 static修饰函数 就是把函数链接属性改为局部链接属性 用static修饰的函数其他文件是不可见的 没法直接使用 解决了不同源
  • 【批处理DOS-CMD命令-汇总和小结】-网络管理命令-上网和网络通信相关命令-进程与程序管理(netstat、tasklist、taskkill、taskmgr)

    一 显示netstat的帮助信息 执行命令 netstat 得到帮助信息如下 C Users Administrator gt netstat 显示协议统计信息和当前 TCP IP 网络连接 NETSTAT a b e f n o p pr
  • 曼哈顿距离,欧式距离,余弦距离

    1 曼哈顿距离 曼哈顿距离 叫出租车距离的 具见上图黄线 应该就能明白 计算距离最简单的方法是曼哈顿距离 假设 先考虑二维情况 只有两个乐队 x 和 y 用户A的评价为 x1 y1 用户B的评价为 x2 y2 那么 它们之间的曼哈顿距离为
  • MySQL客户端软件(DBeaver)连接报错解决方案

    1 mysql出现错误提示 Communications link failure The last packet sent successfully to the server was 0 mi 无论是在mysql客户端连接 或者是cod
  • DC靶场系列--DC1

    目录 引言 搭建环境 信息收集 漏洞分析 漏洞利用 引言 DC靶场 主要是通过web渗透技术 拿到web服务器的权限 会有flag做为标记 以拿到最终的flag为目标 DC1是vulnhub平台下的DC系列的第一个靶场 DC系列下载地址 官
  • 长角牛网络监听 arp欺骗

    一 原理 arp欺骗和攻击的原理是一样的 都是向目标计算机投毒 发送虚假ip地址对应的mac地址 致使被投毒计算机数据被窃听或者数据被盗取 多数情况欺骗和攻击会发生在计算机和网关的连接过程中 给目标计算机发送假的网关ip对应的mac地址 可
  • 【SDL实践指南】安全培训介绍

    转载自 SDL实践指南 安全培训介绍 腾讯云开发者社区 腾讯云https cloud tencent com developer article 2235019 文章前言 安全并不仅仅是安全团队的本职工作 也是企业的每个研发人员 产品经理
  • windows通过注册表修改3389端口号

    span style color FF0000 windows通过注册表修改3389端口号 步骤如下 span 1 开始 rarr 运行 输入regedit 打开注册表 进入这个路径HKEY LOCAL MACHINE SYSTEM Cur
  • 【波浪动态特效】基于jquery实现页面底部波浪动画效果(附完整源码下载)

    文章目录 写在前面 涉及知识点 实现效果 1 搭建页面 1 1 创建两个片区 1 2 创建波浪区域 1 3 静态页面源码 2 JS实现波浪效果 2 1 动画原理 2 2 动画源码 3 源码分享 3 1 百度网盘 3 2 123云盘 3 3
  • 图像识别(一) 之 灰度共生矩阵(GLDM)

    一 灰度共生矩阵 灰度共生矩阵被定义为从灰度为i的像素点出发 离开某个固定位置 相隔距离为d 方位为 的点上灰度值为的概率 1 计算方法 如上图 GLCM i j 的值呢就是I中像素为i 像素为j的有有多少和相邻的成对点 图上的 相邻 指的
  • 在VUE3中使用Pinia

    一 安装使用Pinia 安装下载 npm install pinia main js引入 import createPinia from pinia app use createPinia 根目录新建store index js中写入 im
  • ubuntu20.04 安装Anaconda3+CUDA+cudnn+Pytorch

    ubuntu20 04 安装Anaconda3 CUDA cudnn Pytorch Ubuntu GPU驱动 CUDA版本 CuDNN 版本 都要相互关联 版本不对应的话 就会出错 版本确认顺序 CUDA版本 gt CuDNN版本 gt
  • 反射、泛型详解

    反射 Class文件所包含的内容都有其对应的方法可以获得 创建Class对象的3种方式 方式一 类 class Class personClass Person class 方式二 对象 getClass Person person new
  • 《算法学习》C语言中“ const * “与“ * const “区别总结

    一 简介 最近重新学习了C语言中的指针 本文总结一下C语言中使用 的心得 二 总结 const 表示指针变量是constant 恒定的 不允许通过访问指针地址的方式改变指针所指地址的的值 const 表示该指针是恒定的 即该指针不能再指向别
  • 修改外向交货单:BAPI_OUTB_DELIVERY_CHANGE/SD_DELIVERY_UPDATE_PICKING_SAP刘梦_新浪博客

    TABLES LIKP PARAMETERS P DEL LIKE LIKP VBELN DEFAULT 8000002260 DATA STR HEADER DATA LIKE BAPIOBDLVHDRCHG STR HEADER CON
  • POJ-1240(分治,递归降解)

    题目 http poj org problem id 1240 题目的意思即 给定一棵m元树的前序和后序遍历 问你一共有多少颗m元树有这样的性质 乍一看好像没什么头绪 由于题目中也提到了由中序和后序求前序 想到是不是同样能用分治法 我们知道
  • 在阿里云服务器上部署Jekyll博客

    Step 0 首先买一台服务器 并且装好环境 我都是在阿里云上面买 而且我只是想挂一个个人网站 所以只需要最便宜的轻量应用服务器就好 半年只需要72块钱 我现在想来 之前也应该买香港的服务器 因为更加便宜 大陆的要60块一月 而且不需要给服
  • 初识ASO

    大概了解了一下ASO 在此记录一下 ASO 应用商店优化 的简称 ASO App Search Optimization 重点在于关键词搜索排名优化 覆盖热词 搜索下载激活 优化评论 关键词覆盖数量优化 就是指用户搜索更多关键词都能找到该款
  • VS Code(Visual Studio Code)环境下C++开发的配置方法

    一 Visual Studio Code的下载 去官网下载 下载地址 https code visualstudio com Download 我在windows系统下使用 直接点击Windows那个图标下载就好 安装时可以自己选择一下安装
  • layui源码详细分析之树形菜单

    前言 今天分析的是layui框架内置模块tree js 该模块的功能是构建树形菜单 具体的形式 layui官网该模块的具体形式 如下 自实现树形菜单 使用html css js实现了树形菜单 具体的实现思路如下 html中定义包含树形菜单的