layui-左侧递归菜单-js实现

完整代码 两种下拉风格

<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title><link href="lib/layui/css/layui.css" rel="stylesheet" /><!--    <link href="css/layout-admin.css" rel="stylesheet"/>--></head><body class="layui-bg-gray"><div class="layui-side"><div class="layui-side-scroll"><div id="test"></div></div></div><!--<div id="test"></div>--><script src="lib/layui/layui.js"></script><script>layui.use(["element", "dropdown"], function () {var element = layui.element;var dropdown = layui.dropdown;var util = layui.util;// 假设我们有一个菜单数据var menuData = {code: 0,data: [{id: 1,parentId: 0,name: "test-1",weight: 1,url: "https://blog.csdn.net/weixin_42164004/article/details/115178178",type: "link",children: [{id: 2,parentId: 1,name: "test-2",weight: 2,url: "https://blog.csdn.net/weixin_42164004/article/details/115178178",type: "link",children: [{id: 3,parentId: 2,name: "test-3",weight: 3,url: "https://blog.csdn.net/weixin_42164004/article/details/115178178",type: "link",children: [{id: 4,parentId: 3,name: "test-4",weight: 4,url: "https://blog.csdn.net/weixin_42164004/article/details/115178178",type: "link",},],},],},],},],count: 1,};function buildMenu(id, data) {let type = "group";function buildMenuTree(items) {function isArray(obj) {return typeof obj === "object" && Array.isArray(obj);}function isNotNullArray(obj) {if (isArray(obj)) {return obj.length > 0;}return false;}let html = [];for (let i = 0; i < items.length; i++) {let item = items[i];if (isNotNullArray(item.children)) {if (type === "group") {html.push('<li class="layui-menu-item-group layui-menu-item-up"><div class="layui-menu-body-title"><span>' +item.name +"</span></div><ul>" +buildMenuTree(item.children) +"</ul></li>");} else if (type === "parent") {html.push('<li class="layui-menu-item-parent layui-menu-item-up"><div class="layui-menu-body-title"><span>' +item.name +'</span> <i class="layui-icon layui-icon-right"></i></div> <div class="layui-panel layui-menu-body-panel" style="width: 200px;"><ul>' +buildMenuTree(item.children) +"</ul></div></li>");}} else {html.push('<li><div class="layui-menu-body-title"><span>' +item.name +"</span></div></li>");}}return html.join();}let html = "";if (type === "group") {html ='<ul class="layui-menu" id="left-menu" lay-filter="left-menu" lay-accordion>' +buildMenuTree(data) +"</ul>";} else if (type === "parent") {html ='<div class="layui-panel" style="width: 200px;margin: 16px"><ul class="layui-menu" id="left-menu" lay-filter="left-menu" lay-accordion>' +buildMenuTree(data) +"</ul></div>";}document.getElementById(id).innerHTML = html;}buildMenu("test", menuData.data);//element.init();});</script></body>
</html>

freemarker模板引擎实现 对管理后台均可,因为并不需要seo

[#ftl encoding="utf-8"]
[#--递归下拉菜单--]
[#macro list items][#list items][#items as item][#if item.children?? && item.children?size gt 0 ]<li class="layui-menu-item-group layui-menu-item-up"lay-options="{id: '${item.id}', parentId: '${item.parentId}', isTab: false, url:'${item.url}', type:'${item.type}'}"><div class="layui-menu-body-title"><span>${item.name}</span></div><ul>[@list items=item.children /]</ul></li>[#else]<li lay-options="{id: '${item.id}', parentId: '${item.parentId}', isTab: true, url:'${item.url}', type:'${item.type}'}"><div class="layui-menu-body-title"><span>${item.name}</span></div></li>[/#if][/#items][/#list]
[/#macro]<div class="side"><ul class="layui-menu layui-menu-lg" id="left-menu" lay-filter="left-menu">[@list items= leftMenu /]</ul>
</div><script>layui.use(function () {const dropdown = layui.dropdown;const element = layui.element;const layer = layui.layer;const $ = layui.jquery;function reportWindowSize(event) {const height = $('.layui-body').height() - $('.layui-tab-title').height() - $('.layui-footer').height();setTimeout(function () {$('.tab-page').css('height', height);}, 100);}window.addEventListener("resize", reportWindowSize);dropdown.on('click(left-menu)', function (options) {if (options.isTab === true) {let exist = false;let layId = options.id.toString();let $li = $('.layui-tab-title li');$li.each(function () {if ($(this).attr('lay-id') === layId) {exist = true;}});if (!exist) {if ($li.length >= 20) {return;}element.tabAdd("tab-card", {title: options.title,content: '<div id="tab-page-' + layId + '" class="tab-page"></div>',id: layId,change: true});reportWindowSize(null);console.log(options.type);if (options.type === 'page') {$('#page-' + layId).load(options.url,{id: options.id},function (responseTxt, statusTxt, xhr) {if (statusTxt === "success") {} else if (statusTxt === "error") {layer.alert(options.title + ',加载失败!');element.tabDelete('tab-card', layId);}});} else if (options.type === 'link') {$('#tab-page-' + layId).html('<iframe title="'+options.title+'" src="' + options.url + '" style="width: 100%;height: 100%;border: none;scrollbar-width=none" scrolling="no">')}} else {element.tabChange('tab-card', layId);}}});});
</script>

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

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

相关文章

【C语言回顾】文件操作

前言1. 文件打开模式2. 示例代码2.1 打开和关闭文件2.2 读写文件2.3 二进制文件操作 结语 #include<GUIQU.h> int main { 上期回顾: 【C语言回顾】动态内存管理 个人主页&#xff1a;C_GUIQU 专栏&#xff1a;【C语言学习】 return 一键三连; } 前言 各位小伙伴大家好&…

美国空军出版物:网络空间作战

这份文件是《AIR FORCE DOCTRINE PUBLICATION 3-12: CYBERSPACE OPERATIONS》&#xff0c;即美国空军教义出版物3-12&#xff0c;关于网络空间作战。 该文件详细阐述了美国空军在网络空间领域的组织、规划、执行、评估以及相关的政策、角色和责任。 以下是其核心内容的概述&a…

搜索引擎索引是什么

搜索引擎索引是搜索引擎中的关键组件&#xff0c;用于存储和管理网页、文档、图片等信息&#xff0c;并提供快速的检索功能。索引包括索引基础、单词词典、倒排列表、建立索引、动态索引、索引更新策略、查询处理、多字段索引、短语查询和分布式索引。 索引基础&#xff1a;索…

特定情况下docker run --restart=always重启失效的情况

特定情况下解决cicd中docker run --restartalways重启失效的情况_c 执行exit后 restartalways失效-CSDN博客

分享:怎么才能保证大数据查询的准确性?

随着大数据应用到金融风控领域&#xff0c;大数据越来越重要了&#xff0c;很多朋友在查大数据的时候都会遇到一个问题&#xff0c;那就是自己查询的大数据什么信息都没有&#xff0c;要么就是很少&#xff0c;这是什么原因呢?要怎么才能保证大数据查询的准确性呢?下面小编就…

给JTextArea添加右键菜单

给JTextArea添加右键菜单 package jTextarea;import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent;import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import jav…

Java进阶学习笔记3——static修饰成员方法

成员方法的分类&#xff1a; 类方法&#xff1a;有static修饰的成员方法&#xff0c;属于类&#xff1a; 成员方法&#xff1a;无static修饰的成员方法&#xff0c;属于对象。 Student类&#xff1a; package cn.ensource.d2_staticmethod;public class Student {double scor…

双拼打字,可以尝试这个练习平台

本文将介绍由本人开发的双拼练习平台打字侠&#xff0c;以及一些对新手学习双拼的建议。课程一共233课&#xff0c;共分为两大部分&#xff1a; 韵母键位&#xff0c;主要练习双拼中韵母对应的键盘键位&#xff0c;同时提供可视化的键盘指法示意图。 实战练习&#xff0c;同时…

Selenium常用命令(python版)

日升时奋斗&#xff0c;日落时自省 目录 1、Selenium 2、常见问题 1、Selenium 安装Python和配置环境没有涉及 注&#xff1a;如有侵权&#xff0c;立即删除 首先安装selenium包&#xff0c;安装方式很简单 pip install selenium 注:我这里已经安装好了&#xff0c;所以…

怎么一键消除路人?教你三个消除方法

怎么一键消除路人&#xff1f;在数字时代&#xff0c;摄影已成为我们记录生活、表达情感的重要方式。然而&#xff0c;完美的照片背后往往隐藏着一些不那么完美的元素——比如那些不经意间闯入镜头的路人。他们或许只是匆匆过客&#xff0c;但却足以破坏你精心构图的美好瞬间。…

分割文本文件

分割一个.txt文件&#xff0c;可以选择在命令行中使用split指令&#xff0c;或者编写一段脚本进行操作。以下是一个简单的Python脚本来分割文本文件&#xff1a; def split_file(file, lines):# Open source filewith open(file, r) as source:count 0atEOF Falsewhile not …

shell笔记脚本3

执行脚本文件demo2.sh, 观察打印VAR4效果 执行脚本文件后, 在交互式Shell环境打印VAR4, 观察打印VAR4效果 结论 全局变量在当前Shell环境与子Shell环境中可用, 父Shell环境中不可用 小结 自定义变量的分类 自定义局部变量: 就是在一个脚本文件内部使用 var_namevalue 自…

128天的创意之旅:从初心到成就,我的博客创作纪念日回顾

文章目录 &#x1f680;机缘&#xff1a;初心的种子——回望创作之旅的启航&#x1f308;收获&#xff1a;成长的果实——128天创作之旅的宝贵馈赠❤️日常&#xff1a;创作与生活的交织&#x1f44a;成就&#xff1a;代码的艺术&#x1f6b2;憧憬&#xff1a;未来的蓝图 &…

python3 pandas

pandas - Python Data Analysis Library

Mujoco仿真【xml文件的学习 3】

在学习Mujoco仿真的过程中&#xff0c;为了与时俱进&#xff0c;之前的mujoco210版本不再使用&#xff0c;改用了mujoco-3.1.4版本&#xff0c;下面继续mujoco仿真的学习&#xff01; 先前关于mujoco的学习博客汇总如下&#xff1a; 强化学习&#xff1a;MuJoCo机器人强化学习…

2024最新(PC+WEB+IOS+Android)即时通讯系统客户端仿默往IM源码下载

2024最新(PCWEBIOSAndroid)即时通讯系统客户端仿默往IM源码下载(总大小约2.4G&#xff09; 系统功能配置灵活、海量并发、稳定可靠、数据安全&#xff0c;2小时快速部署、数据安全、单聊群聊、系统通知等通信功能&#xff0c;支持App、PC、Web等多端快速接入。 群功能&#xf…

gtask笔记

1、创建Task GTask *g_task_new (gpointer source_object, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer callback_data); source_object&#xff1a;GObject对象&#xff0c;拥有者 cancellable&#xff1a;可否取消 callback&#xff1a;task完成后…

Linux 软件包管理器 yum的下载、功能介绍及使用

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;青果大战linux 总有光环在陨落&#xff0c;总有新星在闪烁 Linux下的三种软件安装方…

panic对defer语句的执行的影响

1.主线程中的panic会直接导致所有正在运行的go协程无法执行,还会导致声明在它之后的defer语句无法执行。 package mainimport ("fmt""time" )func main() {defer fmt.Println("defer1") //声明在panic之前的defer会执行go func() {defer fmt.Pri…

蓝桥杯Web开发【大赛大纲】15届

一、 组别 Web应用开发分为&#xff1a;大学组和职业院校组。 每位选手只能申请参加其中一个组别的竞赛。各个组别单独评奖。 研究生和本科生只能报大学组。 其它高职高专院校可自行选择报任意组别。 二. 竞赛赛程 省赛时长&#xff1a;4小时。 决赛时长&#xff1a;4小…