前端框架Layui实现动态选项卡&iframe使用(附源码)

本文介绍了如何在网页开发中使用Tab选项卡和iframe标签,通过Layui框架实现动态加载和管理内容。讨论了如何处理选项卡的重复打开问题,以及在数据转换中扩展TreeVo工具类以适应不同字段需求。同时,提到了使用base标签优化页面引用路径,以及在JSP页面中实现这些功能的代码示例。
摘要由CSDN通过智能技术生成

目录

一、前言

1.什么是Tab选项卡

2.什么是iframe标签

3.使用iframe标签

二、案例实现

1.需求分析

①在线Layui示例寻找合适的选项卡

②点击左侧右侧没有url属性

③点击左侧列表右侧内容多开问题

④优化公共文件

2.Dao层的优化

3.JSP页面搭建

4.案例演示

5.总结


一、前言

1.什么是Tab选项卡

        选项卡(Tab)是一种常见的用户界面元素,用于在一个容器中显示多个内容页面。每个选项卡通常由一个标签和一个对应的内容区域组成

当用户点击选项卡的标签时,相应的内容区域将显示出来,而其他选项卡的内容区域则隐藏起来。这样用户可以通过点击不同的选项卡来在不同的页面之间进行切换,从而提供更好的用户体验。

        在网页开发中,实现选项卡通常有多种方法,如使用HTML、CSS和JavaScript来手动编写代码,或者使用现有的选项卡插件/库来简化开发过程。常见的选项卡插件/库包括Bootstrap的Tab插件、jQuery UI的Tabs组件等。

        通过选项卡,用户可以在一个页面中方便地切换不同内容,这在许多应用场景中都非常有用,例如网页导航菜单、设置面板、多标签浏览器等。选项卡的外观和交互方式可以根据设计需求和用户体验进行定制

tab效果展示:

2.什么是iframe标签

iframe(内嵌框架)是HTML中的一个标签,用于在网页中嵌入另一个页面或文档。

通过使用iframe标签,可以在网页中创建一个独立的内联框架,用于显示来自不同源或同一源的外部内容。这个嵌入的页面可以是其他网页、视频、地图、广告等等。

iframe标签通常包含以下属性:

  • src:指定要加载的内容的URL。
  • width:指定`iframe`的宽度。
  • -height:指定`iframe`的高度。
  • frameborder:指定是否显示边框。
  • scrolling:指定是否显示滚动条。

示例代码如下:

<iframe src="http://www.example.com" width="500" height="300" frameborder="0" scrolling="auto"></iframe>

需要注意的是,使用iframe标签时,被嵌入的内容将在一个单独的框架中显示,与父页面有一定的隔离性。这使得iframe非常有用,例如在网页中嵌入第三方内容、显示广告、集成其他网页应用等。但同时也需要注意安全性和设计上的考虑,避免滥用iframe可能引发的安全风险和用户体验问题。

3.使用iframe标签

当使用iframe标签时,您需要指定要嵌入的内容的URL或源文件,并定义相应的属性。下面是一个使用`iframe`标签的示例:

<!DOCTYPE html>
<html>
<head>
  <title>嵌入页面示例</title>
</head>
<body>
  <h1>主页面</h1>

  <iframe src="http://t.csdn.cn/ommMR" width="800" height="600" frameborder="0" scrolling="auto"></iframe>

  <p>这是主页面中的其他内容。</p>
</body>
</html>

在这个示例中,iframe标签嵌入了来自"http://t.csdn.cn/ommMR"的网页。宽度设置为800像素,高度设置为600像素。frameborder属性设置为0以隐藏边框,scrolling属性设置为"auto"以根据内容是否超出框架显示滚动条。

请注意,使用iframe标签时需要确保嵌入的内容是可信的,并且遵循安全性最佳实践,以防止潜在的安全风险。

效果演示:

二、案例实现

1.需求分析

在线Layui示例寻找合适的选项卡

下面是静态效果展示:

②点击左侧右侧没有url属性

由于我们的工具类TreeVo不可能有我们数据库的全部字段,那么应该怎么动态生成拥有属性url的TreeVo工具类??

TreeVo工具类

package com.zking.util;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;


public class TreeVo<T> {
	/**
	 * 节点ID
	 */
	private String id;
	/**
	 * 显示节点文本
	 */
	private String text;
	/**
	 * 节点状态,open closed
	 */
	private Map<String, Object> state;
	/**
	 * 节点是否被选中 true false
	 */
	private boolean checked = false;
	/**
	 * 节点属性
	 */
	private Map<String, Object> attributes;

	/**
	 * 节点的子节点
	 */
	private List<TreeVo<T>> children = new ArrayList<TreeVo<T>>();

	/**
	 * 父ID
	 */
	private String parentId;
	/**
	 * 是否有父节点
	 */
	private boolean hasParent = false;
	/**
	 * 是否有子节点
	 */
	private boolean hasChildren = false;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getText() {
		return text;
	}

	public void setText(String text) {
		this.text = text;
	}

	public Map<String, Object> getState() {
		return state;
	}

	public void setState(Map<String, Object> state) {
		this.state = state;
	}

	public boolean isChecked() {
		return checked;
	}

	public void setChecked(boolean checked) {
		this.checked = checked;
	}

	public Map<String, Object> getAttributes() {
		return attributes;
	}

	public void setAttributes(Map<String, Object> attributes) {
		this.attributes = attributes;
	}

	public List<TreeVo<T>> getChildren() {
		return children;
	}

	public void setChildren(List<TreeVo<T>> children) {
		this.children = children;
	}

	public boolean isHasParent() {
		return hasParent;
	}

	public void setHasParent(boolean isParent) {
		this.hasParent = isParent;
	}

	public boolean isHasChildren() {
		return hasChildren;
	}

	public void setChildren(boolean isChildren) {
		this.hasChildren = isChildren;
	}

	public String getParentId() {
		return parentId;
	}

	public void setParentId(String parentId) {
		this.parentId = parentId;
	}

	public TreeVo(String id, String text, Map<String, Object> state, boolean checked, Map<String, Object> attributes,
                  List<TreeVo<T>> children, boolean isParent, boolean isChildren, String parentID) {
		super();
		this.id = id;
		this.text = text;
		this.state = state;
		this.checked = checked;
		this.attributes = attributes;
		this.children = children;
		this.hasParent = isParent;
		this.hasChildren = isChildren;
		this.parentId = parentID;
	}

	public TreeVo() {
		super();
	}

}

看完以上代码我们可以发现虽然没有我们想要的属性但是拥有private Map<String, Object> attributes属性,那么我们就可以在进行将平级数据转换成父子级数据的时候将遍历的平级数据直接加到Map集合中,这样该属性就拥有了数据库表的全部字段。

③点击左侧列表右侧内容多开问题

我们只需要在添加tab选项卡之前加一个判断即可,我们发现tab中的li标签上都有一个lay-id属性,我们只需将我们TreeVo的id赋给它,然后每次点击的时候通过jquery获取该标签,如果没有找到说明没有打开,如果找到了那么我们就选中它。

//点击左侧列表右侧选项卡打开
		function opedTab(title, content, id) {
			//判断是否已经打开
			var node=$('li[lay-id="'+id+'"]');
			//没有找到该标签时就打开
			if(node.length==0){
				//因为element没有获取到要扩大权限(layui.use里有element)
				  element.tabAdd('demo', {
					title : title,
					content :"<iframe frameborder='0' src='"+content+"' scrolling='auto' style='width:100%;height:100%;'></iframe>",
					id : id
				})  
			}
			//有该标签就打开
			element.tabChange('demo', id)
			
		}

④优化公共文件

因为我们在页面上需要写大量的${pageContext.request.contextPath}非常的繁琐,所以我们就可以使用一个标签——base标签

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

<!-- 引入layui.js-->
<script type="text/javascript" src="${pageContext.request.contextPath}/static/js/layui/layui.js"></script>

<!-- base标签 -->
<base href="${pageContext.request.contextPath}/">


</head>

</html>

小贴士:

<base> 标签是HTML中的一个元标签(meta tag),用于指定页面中所有相对路径的基准URL。

使用 <base> 标签可以改变页面中所有相对链接的基准URL,它是一种全局的设置。通常情况下,相对路径是以当前页面的URL为基准进行解析。但是,当使用 <base> 标签时,相对路径将以 <base> 标签中指定的URL为准。需要注意的是,一个页面只能有一个 <base> 标签,并且应放置在 <head> 标签中的最顶部

2.Dao层的优化

package com.xw.dao;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.xw.entity.Permission;
import com.zking.util.BaseDao;
import com.zking.util.BuildTree;
import com.zking.util.TreeVo;

/**管理系统左侧列表
 * @author 索隆
 *
 */
public class PermissionDao extends BaseDao<Permission>{
	
	/**获取管理的所有信息(平级数据)
	 * @return
	 * @throws Exception 
	 */
	public List<Permission> list() throws Exception{
		String sql="select * from t_oa_permission";
		return  super.executeQuery(sql, Permission.class, null);
	}

	
	/**将平级数据变成我们需要的父子级数据
	 * @return
	 * @throws Exception 
	 */
	public List<TreeVo<Permission>> menu() throws Exception{
		//存放父子级的容器
		List<TreeVo<Permission>> menu=new ArrayList<TreeVo<Permission>>();
		//拿到平级数据
		List<Permission> list = this.list();
		//遍历平级数据
		for (Permission permission : list) {
			//工具类帮助我们完成父子级关系
			TreeVo<Permission> vo=new TreeVo<Permission>();
			vo.setId(permission.getId()+"");//id
			vo.setParentId(permission.getPid()+"");//父级id
			vo.setText(permission.getName());//列表名称
			
            //优化代码
			//利用一个map集合保存TreeVo没有的属性
			Map<String, Object> map=new HashMap<>();
			//将数据的所有信息保存到map容器中
			map.put("self", permission);
			vo.setAttributes(map);
			
			menu.add(vo);
		}
		
		//通过工具类筛选父级菜单的儿子,String是父级菜单的pid
		return BuildTree.buildList(menu, "-1");
	}
	
	
	
	
}

刚刚需求分析的时候也提到了,这里就不过多讲解,大家直接看代码即可。

3.JSP页面搭建

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE>
<html>
<head>
<%@ include file="common/static.jsp"%>
<script type="text/javascript" src="js/index.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">OA会议系统</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="${pageContext.request.contextPath }/static/images/user/小黑子索隆.jpg"
						class="layui-nav-img">我的
				</a>
					<dl class="layui-nav-child">
						<dd>
							<a href="">修改信息</a>
						</dd>
						<dd>
							<a href="">安全管理</a>
						</dd>
						<dd>
							<a href="login.jsp">退出登录</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">

				</ul>
			</div>
		</div>

		<div class="layui-body">
			<!-- 内容主体区域 -->
			<div class="layui-tab" lay-filter="demo" lay-allowclose="true">
				<ul class="layui-tab-title">
					
				</ul>
				<div class="layui-tab-content">
					
				</div>
			</div>
		</div>

		<div class="layui-footer">
			<!-- 底部固定区域 -->
			底部固定区域
		</div>

	</div>
	<script>
	var element,layer,util,$;

layui.use(['element', 'layer', 'util','jquery'], function(){
	element = layui.element
  ,layer = layui.layer
  ,util = layui.util
  ,$ = layui.jquery;
  

  	$.ajax({
  		url: " Permission.action?methodName=listmenu",
  		type: 'post',
  		dataType: 'json',
  		success: function(data) {
  			//定义一个变量将回显的数据进行拼接,最终追加到指定标签上
  			var str='';
  			$.each(data,function(i,n){
  				str+='<li class="layui-nav-item layui-nav-itemed">';
  				str+=' <a class="" href="javascript:;">'+n.text+'</a>';
  				//判断有无children节点有就遍历
  				if(n.hasChildren){
  					//有children节点拿到children节点
  					var children=n.children;
  						str+='<dl class="layui-nav-child">';
  					$.each(children,function(idx,node){
  						str+='<dd><a href="javascript:;" onclick="opedTab(\''+node.text+'\',\''+node.attributes.self.url+'\',\''+node.id+'\')">'+node.text+'</a></dd>';
  		  			})
  		  				str+='</dl>';
  				}
  				
  				str+='</li>';
  				
  			})
  			//将拼接内容追加到指定ul标签
  			$("#menu").html(str);
  			//渲染ul标签
  			element.render('menu');
  			
  		}
  	})
  
  
});




		//点击左侧列表右侧选项卡打开
		function opedTab(title, content, id) {
			//判断是否已经打开
			var node=$('li[lay-id="'+id+'"]');
			//没有找到该标签时就打开
			if(node.length==0){
				//因为element没有获取到所有要去上面扩大权限
				  element.tabAdd('demo', {
					title : title,
					content :"<iframe frameborder='0' src='"+content+"' scrolling='auto' style='width:100%;height:100%;'></iframe>",
					id : id
				})  
			}
			//有该标签就打开
			element.tabChange('demo', id)
			
			
			
		}
		
		
	</script>
</body>
</html>

4.案例演示

登录成功才可访问我们的主页面 

 因为这里的url页面我项目中还没有编写,所以404是必然的,不用管他!!!

5.总结

  • ①因为我们自己所编写的方法中要用到element,而这个元素我们在方法内没有获取所有要在layui.use(加载模块)获取element的时候扩大作用域。
  • ②url在TreeVo工具类中没有该属性,所以我们要在平级数据转成父子级数据的时候下文章,加到Map中再将Map赋值给TreeVo中的Attributes属性,从而拿到数据库表的全部字段及内容。
  • ③选项卡打开后不可重复打开,应该做判断。如果已经有该选项卡存在,那么我就让其选中,不存在我才打开。

到这里我的分享就结束了,欢迎到评论区探讨交流!!

如果觉得有用的话还请点个赞吧 ♥  ♥

### 回答1: Layuiiframe框架使用方法如下: 1. 引入layui框架的js和css文件。 2. 在html页面中添加一个div容器,用于放置iframe。 3. 在js中使用layui.use()方法引入iframe模块,并设置iframe的属性。 4. 使用layui.layer.open()方法打开iframe窗口,将iframe的url地址作为参数传入。 5. 在iframe页面中使用parent.layui.layer.closeAll()方法关闭窗口。 具体代码示例: HTML页面: <div id="iframe-container"></div> JS代码: layui.use(['layer', 'iframe'], function(){ var layer = layui.layer; var iframe = layui.iframe; //设置iframe属性 iframe.config({ //iframe容器的id container: 'iframe-container', //iframe的高度 height: '500px', //iframe的宽度 width: '800px' }); //打开iframe窗口 layer.open({ type: 2, title: 'iframe窗口', content: 'http://www.baidu.com' }); }); 在iframe页面中关闭窗口: parent.layui.layer.closeAll(); ### 回答2: layui是一种基于轻量级的模块化前端框架,具有简单易用、高效稳定、灵活扩展等优点,layui的框架设计是模块化的设计。 其中iframelayui中的一种框架,简单理解就是页面嵌套的概念,可以将一个页面嵌套在另一个页面中。layuiiframe作为一个非常实用的功能,其使用方法也非常简单,主要包括以下几个方面: 1. 引入layui组件库:首先,需要引入layui组件库,可以在页面头部引入layui.js文件和layui.css样式文件。 2. 定义父页面:在父页面中定义一个占位符div,用来承载iframe页面。需要给这个div设置一个class名,方便后续使用。例如:在父页面中定义一个id为main的div,用于承载iframe页面。 3. 定义子页面:在子页面中定义一个一般带head和body的html页面,父页面利用iframe元素嵌入子页面。需要给iframe元素设置一个类名,这个类名必须与父页面中定义的div的class名保持一致。例如:在子页面中定义一个id为page1的iframe元素,并设置class为layui-tab-item layui-show。 4. 编写JavaScript代码:在JavaScript代码中,需要利用layui.use()方法调用iframe模块,然后根据layui.use()方法的规定,传入所有需要使用的模块,包括layer、element、jquery等。并在调用该方法后,相应模块将被加载并运行。此后可以使用element.tabAdd()方法动态添加子页面。 以上是layui iframe框架使用方法的一些基本步骤。需要注意的是,由于iframe存在一些局限性,例如无法统计访问量、SEO效果不佳等,因此在使用layui iframe时需要特别注意。同时,在编写JavaScript代码时,也需要注意变量命名、代码风格等问题,可以有效提升程序的可读性和可维护性。 ### 回答3: layui 是一个轻量级的前端框架,提供了丰富的组件和工具,方便开发者快速搭建页面。在 layui 中,iframe 是一个非常实用的组件,可以用来实现页面的嵌套和跳转。下面我们将详细介绍 layui iframe 框架的使用方法。 一、引入 layui使用 layui iframe 框架之前,我们需要在页面中引入 layui 的核心文件。可以通过以下方式引入: ```html <link rel="stylesheet" href="layui/css/layui.css"> <script src="layui/layui.js"></script> ``` 二、定义 iframe 区域 在页面中,我们需要先定义一个 iframe 区域,以便于后续的跳转。可以通过以下方式定义一个 iframe 区域: ```html <div class="layui-container"> <div class="layui-row"> <div class="layui-col-md12"> <div class="layui-card"> <div class="layui-card-body"> <div class="layui-row"> <div class="layui-col-md2"> <ul class="layui-nav layui-nav-tree layui-nav-side"> <li class="layui-nav-item layui-nav-itemed"> <a href="javascript:;">菜单一</a> <dl class="layui-nav-child"> <dd><a href="javascript:;" data-url="page/table.html" data-id="page/table.html">数据表格</a></dd> <dd><a href="javascript:;" data-url="page/form.html" data-id="page/form.html">表单页面</a></dd> </dl> </li> </ul> </div> <div class="layui-col-md10"> <div class="layui-tab-content"> <div class="layui-tab-item layui-show"> <iframe id="iframe" name="iframe" class="main-iframe"></iframe> </div> </div> </div> </div> </div> </div> </div> </div> </div> ``` 在上面的代码中,我们定义了一个 iframe 区域,并设置了 id 和 name 为 iframe,设置了 class 为 main-iframe。同时,在菜单中,我们设置了 data-url 和 data-id,分别表示跳转的地址和 iframe 需要的 id。 三、编写 JavaScript 代码 有了 iframe 区域,我们就需要编写 JavaScript 代码来实现跳转和页面嵌套。可以通过以下方式实现: ```javascript layui.use(['element', 'layer'], function() { var element = layui.element; var layer = layui.layer; var $ = layui.jquery; var winH = $(window).height(); //iframe自适应高度 $(window).on('resize', function() { var $content = $('#iframe').contents().find('body'); $content.each(function() { var $this = $(this); var h = $(this).height() < winH ? winH : $(this).height(); $this.css('min-height', h); }); }).resize(); //菜单跳转 $('.layui-nav-child a[data-id]').click(function() { var $this = $(this); var href = $this.data('url'); var id = $this.data('id'); if($('#tabs-header>li[lay-id="' + id + '"]').length == 0) { element.tabAdd('tabs', { id: id, title: $this.text(), content: '<iframe src="' + href + '" frameborder="0" class="main-iframe"></iframe>' }); } element.tabChange('tabs', id); }); }); ``` 上面的代码中,我们使用layui 的 element 和 layer 模块,分别用来实现选项卡和弹窗。我们还使用了 jQuery 库,方便操作 DOM 元素。 在代码中,我们定义了一个 winH 变量,表示浏览器窗口的高度。接下来,我们通过 resize 事件来动态调整 iframe 的高度,并保证其不小于 winH。 为了实现菜单跳转,我们使用了 jQuery 选择器来选中菜单项,然后获取 data-url 和 data-id 的值。如果选项卡不存在,则使用 element.tabAdd() 方法添加选项卡,同时设置 id、title 和 content 属性。最后,我们使用 element.tabChange() 方法来切换选项卡。 四、总结 通过本文的介绍,我们了解了 layui iframe 框架的使用方法。其中,我们需要先定义一个 iframe 区域,然后编写 JavaScript 代码实现跳转和页面嵌套。layui 提供了丰富的组件和工具,方便开发者快速搭建页面,是一个非常有价值的前端框架
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java方文山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值