layui实现动态添加选项卡

前言

上一篇博客介绍了树形菜单的实现,这一篇将继续完善通过点击左侧树形菜单实现动态打开选项卡Tab

一. 什么是Tab选项卡

Tab广泛应用于Web页面,因此我们也对其进行了良好的支持(简约风格、卡片风格、响应式Tab以及带删除的Tab等等)。Layui内置多种Tab风格,支持删除选项卡、并提供响应式支持。

二. 动态选项卡

添加动态选项卡的思路:

  1. 通过网站查找layui选项卡的页面布局代码
  2. 动态添加选项卡
  3. 将选项卡的名称换成选中的菜单名称
  4. 已打开的选项卡不再重复打开
  5. 选择已被打开的选项卡则进行选项卡的转换

示例代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<%@ include file="common/header.jsp" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<div class="layui-layout layui-layout-admin"><div class="layui-header"><div class="layui-logo layui-hide-xs layui-bg-black">layout demo</div><!-- 头部区域(可配合layui 已有的水平导航) --><ul class="layui-nav layui-layout-left"><!-- 移动端显示 --><li class="layui-nav-item layui-show-xs-inline-block layui-hide-sm" lay-header-event="menuLeft"><i class="layui-icon layui-icon-spread-left"></i></li><!-- Top导航栏 --><li class="layui-nav-item layui-hide-xs"><a href="">nav 1</a></li><li class="layui-nav-item layui-hide-xs"><a href="">nav 2</a></li><li class="layui-nav-item layui-hide-xs"><a href="">nav 3</a></li><li class="layui-nav-item"><a href="javascript:;">nav groups</a><dl class="layui-nav-child"><dd><a href="">menu 11</a></dd><dd><a href="">menu 22</a></dd><dd><a href="">menu 33</a></dd></dl></li></ul><!-- 个人头像及账号操作 --><ul class="layui-nav layui-layout-right"><li class="layui-nav-item layui-hide layui-show-md-inline-block"><a href="javascript:;"><img src="//tva1.sinaimg.cn/crop.0.0.118.118.180/5db11ff4gw1e77d3nqrv8j203b03cweg.jpg" class="layui-nav-img">tester</a><dl class="layui-nav-child"><dd><a href="">Your Profile</a></dd><dd><a href="">Settings</a></dd><dd><a href="login.jsp">Sign out</a></dd></dl></li><li class="layui-nav-item" lay-header-event="menuRight" lay-unselect><a href="javascript:;"><i class="layui-icon layui-icon-more-vertical"></i></a></li></ul></div><div class="layui-side layui-bg-black"><div class="layui-side-scroll"><!-- 左侧导航区域(可配合layui已有的垂直导航) --><ul id="menu" class="layui-nav layui-nav-tree" lay-filter="menu"><li class="layui-nav-item layui-nav-itemed"><a class="" href="javascript:;">menu group 1</a><dl class="layui-nav-child"><dd><a href="javascript:;">menu 1</a></dd><dd><a href="javascript:;">menu 2</a></dd><dd><a href="javascript:;">menu 3</a></dd><dd><a href="">the links</a></dd></dl></li><li class="layui-nav-item"><a href="javascript:;">menu group 2</a><dl class="layui-nav-child"><dd><a href="javascript:;">list 1</a></dd><dd><a href="javascript:;">list 2</a></dd><dd><a href="">超链接</a></dd></dl></li><li class="layui-nav-item"><a href="javascript:;">click menu item</a></li><li class="layui-nav-item"><a href="">the links</a></li> </ul></div></div><div class="layui-body"><!-- 内容主体区域 --><div class="layui-tab" lay-filter="demo" lay-allowclose="true"><ul class="layui-tab-title"><li class="layui-this" lay-id="11">网站设置</li></ul><div class="layui-tab-content"><div class="layui-tab-item layui-show">内容1</div></div>
</div></div><div class="layui-footer"><!-- 底部固定区域 -->底部固定区域</div>
</div>
<script>
//JS var element,layer,util,$;layui.use(['element', 'layer', 'util'], function(){element = layui.element,layer = layui.layer,util = layui.util,$ = layui.$;$.ajax({url:'${pageContext.request.contextPath }/permission.action?methodName=menus',dataType:'json',success:function(data){console.log(data)var htmlStr = '';$.each(data,function(i,n){htmlStr +='<li class="layui-nav-item layui-nav-itemed">';htmlStr +='<a class="" href="javascript:;">'+n.text+'</a>';if(n.hasChildren){var children=n.children;htmlStr +='<dl class="layui-nav-child">';$.each(children,function(index,node){htmlStr +='<dd><a href="javascript:;" onclick="openTab(\''+node.text+'\',\''+node.attributes.self.url+'\',\''+node.id+'\')">'+node.text+'</a></dd>';})htmlStr +='</dl>';}htmlStr +='</li>';})$("#menu").html(htmlStr);element.render('menu');} });
});function openTab(title,content,id){var $node = $('li[lay-id="'+id+'"]');console.log($node)if($node.length == 0){//新增一个Tab项element.tabAdd('demo', {title: title //用于演示,content: content,id: id //实际使用一般是规定好的id,这里以时间戳模拟下})}element.tabChange('demo', id); //切换到:用户管理}
</script>
</body>
</html>

dao层

package com.zking.dao;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import com.zking.entity.Permission;
import com.zking.util.BaseDao;
import com.zking.util.BuildTree;
import com.zking.util.PageBean;
import com.zking.util.TreeVo;public class PermissionDao extends BaseDao<Permission> {public List<Permission> list(Permission permission, PageBean pageBean) throws Exception {String sql = "select *from t_easyui_permission";return super.executeQuery(sql, Permission.class, pageBean);}//	将数据库查询出的平级数据,转换成父子关系的数据public List<TreeVo<Permission>> menus(Permission permission, PageBean pageBean) throws Exception{List<TreeVo<Permission>> lst = new ArrayList<TreeVo<Permission>>();List<Permission> list = this.list(permission, pageBean);for (Permission p : list) {TreeVo<Permission> vo = new TreeVo<>();vo.setId(p.getId()+"");vo.setText(p.getName());vo.setParentId(p.getPid()+"");Map<String, Object> map = new HashMap<String, Object>();map.put("self", p);vo.setAttributes(map);lst.add(vo);}return BuildTree.buildList(lst, "0");}
}

1. 通过网站查找layui选项卡的页面布局代码

参考地址:http://layui.org.cn/demo/index.html
在这里插入图片描述
预览效果:
在这里插入图片描述

2. 动态添加选项卡

点击菜单时要动态生成tab选项卡。
需要给菜单添加点击事件,点击菜单时调用增加选项卡的方法。

 tabAdd: function(){//新增一个Tab项element.tabAdd('demo', {title: '新选项'+ (Math.random()*1000|0) //用于演示,content: '内容'+ (Math.random()*1000|0),id: new Date().getTime() //实际使用一般是规定好的id,这里以时间戳模拟下})}

在这里插入图片描述

3. 将选项卡的名称换成选中的菜单名称

在将选项卡名称换为对应的菜单名称的同时,将选项卡的内容等也进行更改。

function openTab(title,content,id){var $node = $('li[lay-id="'+id+'"]');console.log($node)if($node.length == 0){//新增一个Tab项element.tabAdd('demo', {title: title //用于演示,content: content,id: id //实际使用一般是规定好的id,这里以时间戳模拟下})}element.tabChange('demo', id); //切换到:用户管理}

4. 已打开的选项卡不再重复打开

function openTab(title,content,id){var $node = $('li[lay-id="'+id+'"]');console.log($node)if($node.length == 0){//新增一个Tab项element.tabAdd('demo', {title: title //用于演示,content: content,id: id //实际使用一般是规定好的id,这里以时间戳模拟下})}element.tabChange('demo', id); //切换到:用户管理}

5. 选择已被打开的选项卡则进行选项卡的转换

element.tabChange('demo', id); //切换到:用户管理

三. 将JavaScript代码封装成js文件

好处

1. 代码复用性:将JavaScript代码封装在单独的JS文件中,可以在多个JSP页面中重复使用,提高了代码的复用性。这样可以简化对公共功能的修改和维护。

2. 可维护性:将JavaScript代码单独封装成JS文件后,可以专注于JavaScript代码的编写和维护,方便团队协作。同时,可以更方便地进行版本控制和管理。

3. 页面加载速度:将JavaScript代码封装成外部的JS文件后,可以缓存该文件,减小页面体积,加快页面加载速度。同时,当多个JSP页面引用同一个JS文件时,浏览器可以缓存该文件,减少服务器请求和响应的次数,提高网页性能。

4. 可读性和可维护性:将JavaScript代码从JSP页面中分离出来,可以提高代码的可读性和可维护性。在JS文件中,可以使用更好的代码编辑器和调试工具,提供更好的代码提示和错误检查,以及更方便的调试功能。

总之,将JSP界面中的JavaScript代码封装成JS文件可以提高代码的复用性、可维护性和可读性,同时也可以提高页面加载速度,优化用户体验。

封装后的js文件【main.js】

var element,layer,util,$;layui.use(['element', 'layer', 'util'], function(){element = layui.element,layer = layui.layer,util = layui.util,$ = layui.$;$.ajax({url:'permission.action?methodName=menus',dataType:'json',success:function(data){console.log(data)var htmlStr = '';$.each(data,function(i,n){htmlStr +='<li class="layui-nav-item layui-nav-itemed">';htmlStr +='<a class="" href="javascript:;">'+n.text+'</a>';if(n.hasChildren){var children=n.children;htmlStr +='<dl class="layui-nav-child">';$.each(children,function(index,node){htmlStr +='<dd><a href="javascript:;" onclick="openTab(\''+node.text+'\',\''+node.attributes.self.url+'\',\''+node.id+'\')">'+node.text+'</a></dd>';})htmlStr +='</dl>';}htmlStr +='</li>';})$("#menu").html(htmlStr);element.render('menu');} });
});function openTab(title,content,id){var $node = $('li[lay-id="'+id+'"]');console.log($node)if($node.length == 0){//新增一个Tab项element.tabAdd('demo', {title: title //用于演示,content: content,id: id //实际使用一般是规定好的id,这里以时间戳模拟下})}element.tabChange('demo', id); //切换到:用户管理}

在公共文件header.jsp中添加base标签

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<!-- 引入 layui.css -->
<link rel="stylesheet" href="${pageContext.request.contextPath }/static/js/layui/css/layui.css"><!-- 引入 layui.js -->
<script src="${pageContext.request.contextPath }/static/js/layui/layui.js"></script>
<base href="${pageContext.request.contextPath }/"/>

jsp界面

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<%@ include file="common/header.jsp" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="static/js/main.js"></script> 
</head>
<body>
<div class="layui-layout layui-layout-admin"><div class="layui-header"><div class="layui-logo layui-hide-xs layui-bg-black">layout demo</div><!-- 头部区域(可配合layui 已有的水平导航) --><ul class="layui-nav layui-layout-left"><!-- 移动端显示 --><li class="layui-nav-item layui-show-xs-inline-block layui-hide-sm" lay-header-event="menuLeft"><i class="layui-icon layui-icon-spread-left"></i></li><!-- Top导航栏 --><li class="layui-nav-item layui-hide-xs"><a href="">nav 1</a></li><li class="layui-nav-item layui-hide-xs"><a href="">nav 2</a></li><li class="layui-nav-item layui-hide-xs"><a href="">nav 3</a></li><li class="layui-nav-item"><a href="javascript:;">nav groups</a><dl class="layui-nav-child"><dd><a href="">menu 11</a></dd><dd><a href="">menu 22</a></dd><dd><a href="">menu 33</a></dd></dl></li></ul><!-- 个人头像及账号操作 --><ul class="layui-nav layui-layout-right"><li class="layui-nav-item layui-hide layui-show-md-inline-block"><a href="javascript:;"><img src="//tva1.sinaimg.cn/crop.0.0.118.118.180/5db11ff4gw1e77d3nqrv8j203b03cweg.jpg" class="layui-nav-img">tester</a><dl class="layui-nav-child"><dd><a href="">Your Profile</a></dd><dd><a href="">Settings</a></dd><dd><a href="login.jsp">Sign out</a></dd></dl></li><li class="layui-nav-item" lay-header-event="menuRight" lay-unselect><a href="javascript:;"><i class="layui-icon layui-icon-more-vertical"></i></a></li></ul></div><div class="layui-side layui-bg-black"><div class="layui-side-scroll"><!-- 左侧导航区域(可配合layui已有的垂直导航) --><ul id="menu" class="layui-nav layui-nav-tree" lay-filter="menu"><li class="layui-nav-item layui-nav-itemed"><a class="" href="javascript:;">menu group 1</a><dl class="layui-nav-child"><dd><a href="javascript:;">menu 1</a></dd><dd><a href="javascript:;">menu 2</a></dd><dd><a href="javascript:;">menu 3</a></dd><dd><a href="">the links</a></dd></dl></li><li class="layui-nav-item"><a href="javascript:;">menu group 2</a><dl class="layui-nav-child"><dd><a href="javascript:;">list 1</a></dd><dd><a href="javascript:;">list 2</a></dd><dd><a href="">超链接</a></dd></dl></li><li class="layui-nav-item"><a href="javascript:;">click menu item</a></li><li class="layui-nav-item"><a href="">the links</a></li> </ul></div></div><div class="layui-body"><!-- 内容主体区域 --><div class="layui-tab" lay-filter="demo" lay-allowclose="true"><ul class="layui-tab-title"><li class="layui-this" lay-id="11">网站设置</li></ul><div class="layui-tab-content"><div class="layui-tab-item layui-show">内容1</div></div>
</div></div><div class="layui-footer"><!-- 底部固定区域 -->底部固定区域</div>
</div>
<script>
//JS </script>
</body>
</html>

运行效果如下:
在这里插入图片描述

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

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

相关文章

注册中心技术Eureka、Nacos

说明&#xff1a;在微服务框架中&#xff0c;各个服务之间都是独立的。理论上来说&#xff0c;各个服务之间是可以直接通信的&#xff0c;但实际上因为服务之间通信需要管理和规划&#xff0c;如请求怎么负载均衡、请求怎么降级处理等等&#xff0c;所以就需要使用一个技术&…

mysql-windows 安装

今天&#xff0c;由于一个功能要用到mysql&#xff0c;所以下载了 mysql-8.0.33-winx64 的版本&#xff0c;突然发现&#xff0c;以前都是安装的Linux 版本&#xff0c;windows版本不会安装了&#xff0c;查看官网试着装了一次&#xff0c;记录本次经历&#xff1a; 软件下载 …

【Hello mysql】 mysql的基本查询

Mysql专栏&#xff1a;Mysql 本篇博客简介&#xff1a;介绍mysql的基本查询 mysql的基本查询 create单行插入全列插入多行查询指定列查询插入否则更新 &#xff08;不常用&#xff09;替换 Retrieveselect列全列查询指定列查询查询字段为表达式结果去重 where条件找到英语小于6…

Yocto系列讲解[技巧篇]92 - armv8 aarch64兼容armv7 32位程序运行环境

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 概述使能Multilib支持32位的helloworld程序执行出现No such file or directorylibc.so.6 cannot open shared object file修改内容固化…

手把手教你落地大模型应用创意!全新AI达人创造营限时招募

AI进入大模型时代&#xff0c;智能应用和产品的构建开始发生天翻地覆的变化。想把你的AI创意落地&#xff0c;解决实际问题&#xff1f;想让更多人看到你的AI应用的价值与意义&#xff1f; 飞桨领航团AI达人创造营第4期学员招募正式启动&#xff01; AI达人创造营是百度飞桨领…

图像处理之高斯滤波

文章目录 高斯函数1.一维高斯函数2. 二维高斯函数 高斯滤波1.高斯核生成2.滤波过程 高斯函数 高斯函数广泛应用于统计学领域&#xff0c;用于表述正态分布&#xff0c;在信号处理领域&#xff0c;用于定义高斯滤波器&#xff0c;在图像处理领域&#xff0c;二维高斯核函数常用…

1.5 纹理

这次笔记时间有点久&#xff0c;主要是这节课讲的东西需要很多基础来铺垫&#xff0c;看完了后感觉缺失信息很多&#xff0c;又去补了GAMES 101 3~10节内容。 强烈建议看不懂的先去学习GMAES101 网址Lecture 08 Shading 2 (Shading, Pipeline and Texture Mapping)_哔哩哔哩_bi…

APP开发中的数据安全:你需要知道的一切

APP开发中的数据安全&#xff0c;是指 APP开发过程中&#xff0c;所有的数据都会经过严格的安全处理。因为目前 APP开发公司的技术、资质良莠不齐&#xff0c;很多企业在开发过程中不注重对数据安全的保护。 在如今大数据时代&#xff0c; APP开发过程中&#xff0c;会产生大量…

unidbg或者java层解密方法IDEA中打包成jar包供python调用方法

一、导出jar包方法 &#xff08;1&#xff09;配置jar包参数 &#xff08;2&#xff09;创建生成jar包 成功生成&#xff01; 二、Python代码调用 import jpypejvmPath jpype.getDefaultJVMPath() d unidbg-android.jar # 对应jar地址 jpype.startJVM(jvmPath, "-ea&q…

Docker 运行花生壳实现内外网穿透

Docker 运行花生壳实现内外网穿透 1、docker安装centos2、进入centos容器安装花生壳客户端3、花生壳绑定设备4、测试外网穿透 1、docker安装centos 使用命令行安装centos7 docker run --privilegedtrue --restartalways -e TZ"Asia/Shanghai" -d --nethost --nam…

vue生命周期四个阶段(created和mount)

1.四个阶段 1&#xff09;必经阶段 2&#xff09;非必经阶段 提示&#xff1a;主动调用 vm.$destroy() 函数销毁后&#xff0c;可用 vm.$mount("#app") 将断开的 new Vue() 和页面重新建立虚拟 DOM 树&#xff0c;重新绑定起来挂载界面。 2. 生命周期钩子函数&…

利用python绘制二三维曲面和矢量流线图

为了实现不同数据的可视化&#xff0c;最近研究了python环境下的可视化方案&#xff0c;为后续的流体运动仿真模拟做好储备&#xff0c;由于python处理数据的便利性&#xff0c;导致目前很多后端处理或者可视化成图操作都在python中实现&#xff0c;比如前端是vue&#xff0c;加…