欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

EasyUI主页面布局:左侧菜单tree、tabs选项卡、tabs右键菜单详解

程序员文章站 2022-07-02 18:35:17
EasyUI主页面布局:左侧菜单tree、tabs选项卡、tabs右键菜单详解 1.页面布局 北(north)部 西(west)部:tree的ul标签 中(center...
EasyUI主页面布局:左侧菜单tree、tabs选项卡、tabs右键菜单详解

EasyUI主页面布局:左侧菜单tree、tabs选项卡、tabs右键菜单详解

1.页面布局

北(north)部

西(west)部:tree的ul标签

中(center)部:左侧菜单点击加载页面的位置

tab-tools:tabs右键点击菜单事件的menu

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>  
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">  
<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
<%@ include file = "head.jsp" %>  
<script type="text/javascript" src="<%=request.getContextPath()%>/js/main.js"></script>  
<title>首页面</title>  
</head>  
<body>  
    <p class="easyui-layout" data-options="fit:true">  
        <p data-options="region:'north',collapsible:false,hideCollapsedContent:false" data-id="head" style="height:45px;overflow:hidden">  
          
        </p>  
        <!-- 左侧菜单 -->  
        <p data-id="leftmenu" style="width:190px;overflow:auto;" data-options="region:'west',split:false,collapsible:false,style:{textAlign:'left'}">  
            <ul id="menutree"></ul>  
        </p>  
        <p data-options="region:'center',split:true"><!--  -->  
            <p id="mainTabs" class="easyui-tabs" data-options="toolPosition:'right',fit:true,border:false">  
                <p title="主页">默认一个主页面tab</p>  
            </p>  
        </p>  
    </p>  
  
    <!-- 以下为tabs右击事件 -->  
    <p id="tab-tools" class="easyui-menu" style="width:100px;">  
        <p id="1" data-options="iconCls:'icon-arrow_refresh'">刷新</p>  
        <p class="menu-sep"></p>  
        <p id="2" data-options="iconCls:'icon-cross'">关闭当前标签</p>  
        <p id="3" data-options="iconCls:'icon-cross'">关闭非当前标签</p>  
        <p class="menu-sep"></p>  
        <p id="4" data-options="iconCls:'icon-cross'">关闭左侧标签</p>  
        <p id="5" data-options="iconCls:'icon-cross'">关闭右侧标签</p>  
        <p class="menu-sep"></p>  
        <p id="6" iconCls="icon-cancel">关闭所有标签</p><!-- 也可这样设置图标 -->  
    </p>      
</body>  
</html>  
2.左侧菜单tree 2.1json数据

自定义tree图标自定义onSelect事件的跳转页面

[{
	"id":1,
	"text":"My Documents",
	"iconCls":"icon-page",   "这是注释(注意逗号)":"自定义tree图标",
	"children":[{
		"id":11,
		"text":"Photos",
		"iconCls":"icon-page", "这是注释(注意逗号)":"自定义tree图标",
		"children":[{
			"id":111,
			"text":"Friend",
			"iconCls":"icon-page",
			"page":"newWin.jsp",  "这是注释(注意逗号)":"自定义点击的目标页面"
		},{
			"id":112,
			"text":"Wife",
			"page":"grid.jsp",  "这是注释(注意逗号)":"自定义点击的目标页面"
		},{
			"id":113,
			"text":"Company"
		}]
	},{
		"id":12,
		"text":"Program Files",
		"iconCls":"icon-page", 
		"state":"closed",
		"children":[{
			"id":121,
			"text":"Intel"
		},{
			"id":122,
			"text":"Java",
			"attributes":{
				"p1":"Custom Attribute1",
				"p2":"Custom Attribute2"
			}
		},{
			"id":123,
			"text":"Microsoft Office"
		},{
			"id":124,
			"text":"Games",
			"checked":true
		}]
	},{
		"id":13,
		"text":"index.html"
	},{
		"id":14,
		"text":"about.html"
	},{
		"id":15,
		"text":"welcome.html"
	}]
}]
2.2js渲染+onSelect事件
	/** 左侧menu菜单 * */
	renderLeftMenu();
	function renderLeftMenu() {
		$("#menutree").tree({
			url : "json/treedata.json",
			rootWidth : "184",
			kidWidth : "180",
			height : "auto",
			onSelect : function(node) {
				var isLeaf = $(this).tree('isLeaf',node.target);//只可选择tree子节点
				if(isLeaf){
					openLeftWin(node);//打开新的tabs
				}
			}
		});
	}
3.新增tabs 3.1tabs新增

刷新小按钮需要8*8像素的小图标,只有16*16像素的导致图标不漂亮啊(ー`′ー)。

	/**打开新的tabs **/
	function openLeftWin(node) {
		var tabName = node.text;
		if($("#mainTabs").tabs("exists", tabName)) {// 如果已存在,选中
			$("#mainTabs").tabs("select", tabName);
		}else {
			$("#mainTabs").tabs("add", {
				title : tabName,
				selected : true,
				closable : true,
//				href : "newWin.jsp",//此处可动态跳转页面
				href : node.page,//此处可动态跳转页面,在加载的json、或者后台数据中组合添加属性即可
				tools : [ {  //加载刷新小按钮
					iconCls : "icon-page_refresh",//应该使用8*8像素图片,没有找到8*8
					handler : function() {
						var currentTab = $("#mainTabs").tabs('getSelected');
						refreshTab(currentTab);
					}
				} ]
			});
		}
	}

	/**
	 * 通用刷新tabs方法
	 * currentTab 刷新的tabs对象
	 */
	function refreshTab(currentTab) {
		var url = $(currentTab.panel('options')).attr('href');
		$('#tabs').tabs('update', {
			tab : currentTab,
			options : {
				href : url //重新获取目标页面
			}
		});
		currentTab.panel('refresh');//刷新
	}
	
3.2tabs右击事件
	/**
	 * 新增tabs右击事件
	 */
	$("#mainTabs").tabs({
        onContextMenu:function(e,title,index){
            e.preventDefault();
            $("#tab-tools").menu('show', {
                left : e.pageX,
                top : e.pageY
            });
        }
    });
3.3tabs右击菜单事件

点击事件的关闭方法参考其他博客文章。

	/**
	 * tabs右击菜单绑定事件
	 */
	$("#tab-tools").menu({
    onClick : function (node) {
      closeTab(this, node.id);
    }
  });
	
	/**
	 * 相关右击菜单的点击事件
	 * menu 此处没有用到,即当前选择的menu菜单
	 * id menu菜单的id标识,可用其他唯一标识代替
	 */
    function closeTab(menu, id){
    	var tab = $("#mainTabs").tabs('getSelected');//当前所选tab
    	var index = $("#mainTabs").tabs('getTabIndex',tab);//当前所选tab的下标位置
    	var tablist = $("#mainTabs").tabs('tabs');  //所有的tabs列表
        switch (id){
            case '1' ://刷新
            	RefreshTab(tab);
                break;
            case '2' ://关闭当前标签
                $("#mainTabs").tabs("close", index);
                break;
            case '3' ://关闭非当前标签
                for(var i=tablist.length-1;i>index;i--){
                    $("#mainTabs").tabs('close',i);
                }
                var num = index-1;
                for(var i=num;i>=0;i--){
                    $("#mainTabs").tabs('close',0);
                }
                break;
            case '4' ://关闭左侧
                var num = index-1;
                for(var i=num;i>=0;i--){
                    $("#mainTabs").tabs('close',0);
                }
                break;
            case '5' ://关闭右侧
                for(var i=tablist.length-1;i>index;i--){
                    $("#mainTabs").tabs('close',i);
                }
            	break;
            case '6'://关闭所有
                for(var i=tablist.length-1;i>=0;i--){
                    $("#mainTabs").tabs("close", i);
                }
            	break;
            default:
        }
    }
4.完整main.js
$(function() {
	var URL = {
			//获取数据url
	};

	/** 左侧menu菜单 * */
	renderLeftMenu();
	function renderLeftMenu() {
		$("#menutree").tree({
			url : "json/treedata.json",
			rootWidth : "184",
			kidWidth : "180",
			height : "auto",
			onSelect : function(node) {
				var isLeaf = $(this).tree('isLeaf',node.target);//只可选择tree子节点
				if(isLeaf){
					openLeftWin(node);//打开新的tabs
				}
			}
		});
	}

	/**打开新的tabs **/
	function openLeftWin(node) {
		var tabName = node.text;
		if($("#mainTabs").tabs("exists", tabName)) {// 如果已存在,选中
			$("#mainTabs").tabs("select", tabName);
		}else {
			$("#mainTabs").tabs("add", {
				title : tabName,
				selected : true,
				closable : true,
//				href : "newWin.jsp",//此处可动态跳转页面
				href : node.page,//此处可动态跳转页面,在加载的json、或者后台数据中组合添加属性即可
				tools : [ {  //加载刷新小按钮
					iconCls : "icon-page_refresh",//应该使用8*8像素图片,没有找到8*8
					handler : function() {
						var currentTab = $("#mainTabs").tabs('getSelected');
						refreshTab(currentTab);
					}
				} ]
			});
		}
	}

	/**
	 * 通用刷新tabs方法
	 * currentTab 刷新的tabs对象
	 */
	function refreshTab(currentTab) {
		var url = $(currentTab.panel('options')).attr('href');
		$('#tabs').tabs('update', {
			tab : currentTab,
			options : {
				href : url //重新获取目标页面
			}
		});
		currentTab.panel('refresh');//刷新
	}
	
	/**
	 * 新增tabs右击事件
	 */
	$("#mainTabs").tabs({
        onContextMenu:function(e,title,index){
            e.preventDefault();
            $("#tab-tools").menu('show', {
                left : e.pageX,
                top : e.pageY
            });
        }
    });
	/**
	 * tabs右击菜单绑定事件
	 */
	$("#tab-tools").menu({
        onClick : function (node) {
            closeTab(this, node.id);
        }
    });
	
	/**
	 * 相关右击菜单的点击事件
	 * menu 此处没有用到,即当前选择的menu菜单
	 * id menu菜单的id标识,可用其他唯一标识代替
	 */
    function closeTab(menu, id){
    	var tab = $("#mainTabs").tabs('getSelected');//当前所选tab
    	var index = $("#mainTabs").tabs('getTabIndex',tab);//当前所选tab的下标位置
    	var tablist = $("#mainTabs").tabs('tabs');  //所有的tabs列表
        switch (id){
            case '1' ://刷新
            	RefreshTab(tab);
                break;
            case '2' ://关闭当前标签
                $("#mainTabs").tabs("close", index);
                break;
            case '3' ://关闭非当前标签
                for(var i=tablist.length-1;i>index;i--){
                    $("#mainTabs").tabs('close',i);
                }
                var num = index-1;
                for(var i=num;i>=0;i--){
                    $("#mainTabs").tabs('close',0);
                }
                break;
            case '4' ://关闭左侧
                var num = index-1;
                for(var i=num;i>=0;i--){
                    $("#mainTabs").tabs('close',0);
                }
                break;
            case '5' ://关闭右侧
                for(var i=tablist.length-1;i>index;i--){
                    $("#mainTabs").tabs('close',i);
                }
            	break;
            case '6'://关闭所有
                for(var i=tablist.length-1;i>=0;i--){
                    $("#mainTabs").tabs("close", i);
                }
            	break;
            default:
        }
    }
});
5.总结

可能遇到的问题与解决方法、注意点: tabs新增的页面无法加载js/css文件:把引入文件的方法放到内即可。tree只可选择子节点:

var isLeaf = $(this).tree('isLeaf',node.target);//如果为子节点返回true,否则为false。

json添加注释:直接用key:value代替即可。修改tree默认图标:此处直接在json数据中添加iconCls属性获取;其他方法请自行搜索。加载tree:如果需要从后台获取数据,数据格式必须与官网demo一致。此处直接使用了官网demo的json数据。tabs右键事件:onContentMenutabs刷新按钮:tools 源码位置(github):