> bodyTab模块是layuiCMS 2.0的核心，通过简单的配置就能实现左侧导航的输出、点击菜单添加新窗口的功能。同时优化了窗口过多的展示效果和相关操作。打开的窗口超出可视区域的时候不再以下拉的形式展示，而是通过左右拖动来查看被隐藏的窗口。打开的窗口未超出可视区域的情况下则正常显示，没有拖动效果。添加了“刷新当前”，“关闭其他”，“关闭全部”操作，但需要给相应的元素添加"refresh"、"closePageOther"、"closePageAll"类【如class="closePageAll"】。

> 模块加载名称：bodyTab

核心方法

语法：layui.bodyTab(options)

    		layui.use('bodyTab', function(){
    		  layui.bodyTab(options);
    		});

options是一个对象参数，为了操作简单，所以只设置了一些常用的功能。可支持的key如下表

参数 | 状态 | 类型 | 默认值 | 作用
--- | --- | --- | --- | ---
openTabNum | 非必填 | string | undefined | 设置可打开窗口的最大数量，默认可以无限打开。如果想设置最多可以打开10个窗口则：openTabNum:"10"
tabFilter | 非必填 | string | bodyTab | 添加窗口的filter。这里的“非必填”指的是没有更改index.html中源码的情况下，如果修改过，则为必填项。具体用法为：在<ul class="tab"></ul>中添加新窗口，应该设置为<ul class="tab" lay-filter="bodyTab"></ul>，此处填写的为lay-filter的值。
url | 必填 | object | undefined | 获取菜单的接口路径。请严格按照需要的Json格式返回菜单信息。Json详细格式见下表

菜单数据格式

参数 | 类型 | 作用
--- | --- | ---
title | string | 菜单名称
menu1 | string | 与顶部菜单的data-menu属性值相同，具体请参考：三级菜单menu字段与顶部菜单data-menu属性的关系
icon | string | 菜单前面的图标（可不填）。如果调用的图标是框架中的，填写的内容为Unicode（如 &#xe603;）。如果调用的图标为外部引入的，填写的内容为Font CLass（如 icon-chakan）【如果是“图标管理”中的图标可以直接使用，如果是自己通过阿里图标库选择的，有两种方法：1、请将“Font Family”修改为“seraph”，如何修改：“iconfont.cn”-“图标管理”-“我的项目”-“更多操作”-“编辑项目”-“Font Family”的值修改为“seraph”；2、将bodyTab.js文件中第30-80行中的seraph修改为你自己设置的class名称，阿里默认为“iconfont”。不会第一种方式的可直接使用第二种方法】
href | string | 对应的页面链接。（有子菜单的情况下建议不填）
spread | boolean | 子菜单是否展开。（默认不展开）
children | object | 子菜单数据。（格式同上）
target | string | 控制对应页面链接的打开方式。不设置的情况下以窗口形式打开，设置后页面整体跳转，如“登录页面”。可选参数：_blank。

这是一个菜单JSON较为完整的例子

    	{
    	  "menu1": [{
    	      "title": "菜单格式",
    	      "icon": "",
    	      "href": "topPage.html",
    	      "spread": false,
    	      "children": [{
    	          "title": "二级菜单",
    	          "icon": "",
    	          "href": "page.html",
    	          "spread": false,
    	          "target": "_blank"
    	       }]
    	   }]
    	}

内置方法

bodyTab模块是这套模版的核心。主要作用是点击菜单生成窗口及一些对窗口进行的操作。下面我将对这些方法做一些简单的介绍。使用方法：layui.bodyTab.method(option)，其中method为方法名，option为参数，如 layui.bodyTab.navBar(dataStr)。其中“无需主动执行”的方法简单了解一下就好，“需主动执行”的方法可以仔细的研究一下用法。

##  tabAdd() 方法

此方法需主动执行，这是bodyTab模块中的核心，此方法只有一个参数，即被点击的元素。此元素需要包含下面的属性和标签：

参数 | 类型 | 作用
--- | --- | ---
data-url | 属性 | 链接的窗口路径，类似 a 标签的 href 属性。如：<a data-url="index.html"></a>
i | 标签 | 添加窗口时标题前面的图标。如：<i class="seraph icon-icon10" data-icon="icon-icon10"></i>或者<i class="layui-icon" data-icon="&#xe68e;"></i>
cite | 标签 | 所添加窗口的标题。如：<cite>后台首页</cite>

下面是一个完整的被点击元素：

    		<a href="javascript:;" data-url="index.html">
    		  <i class="seraph icon-icon10" data-icon="icon-icon10"></i>  //这是外部引入的图标
    		  <i class="layui-icon" data-icon="&#xe68e;"></i>  //这是框架中的图标【与外部引入的图标进行二选一】
    		  <cite>后台首页</cite>
    		</a>

它的主要作用是添加窗口。点击菜单时如果窗口已经打开，则进行窗口的切换，否则添加窗口。执行方法为：

    		layui.bodyTab.tabAdd(_this);      //主窗口（如index.html）中
    		top.layui.bodyTab.tabAdd(_this);  //iframe（如main.html）中

##  tabMove() 方法

此方法为仅次于tabAdd()的一个方法。其主要作用是通过判断已打开的窗口宽度是否小于可视宽度（包括改变浏览器的大小）。如果已打开的窗口宽度是否小于可视宽度，则不做任何操作；否则为窗口盒子（此处为 #top_tabs_box）添加鼠标滑动事件，用以通过鼠标滑动去选择其他的窗口。模版中对一些会操作窗口盒子的位置都执行了此方法。如果想要在其他的地方执行：

    		layui.bodyTab.tabMove();

##  navBar() 方法

此方法无需主动执行，它的主要作用是将后台返回的菜单json文件生成菜单然后通过render方法渲染到页面上，一般情况下外部不会调用。只有一个参数，这个参数是一个符合菜单格式的json文件。

##  render() 方法

此方法需主动执行，它与navBar配合使用，用于将navBar方法生成的字符串渲染到页面上。在需要渲染菜单的页面都需要主动执行此方法，否则将不显示菜单。

##  changeRegresh() 方法

此方法无需主动执行，它的主要作用是通过判断“是否设置过切换窗口刷新页面”去进行页面的刷新。如果在“功能设置”中开启此功能，则切换窗口的时候会进行页面的刷新，否则将不会刷新页面。

##  set() 方法

此方法无需主动执行，它的主要作用是设置bodyTab的参数。可以在引入模块的时候直接配置。无需直接执行此方法进行配置。方法如下：

    		layui.use('bodyTab', function(){
    		  layui.bodyTab({
    		    openTabNum : "50",  //最大可打开窗口数量
    		    url : "json/navs.json" //获取菜单json地址
    		  });
    		});

##  getLayId() 方法

此方法无需主动执行，它的主要作用是通过title获取lay-id，主要用在窗口切换和删除时的定位到所操作的窗口。返回值为当前元素的 lay-id

##  hasTab() 方法

此方法无需主动执行，它的主要作用是通过title判断点击的菜单时候打开过，如果打开过则切换到对应的窗口，否则添加一个新的窗口。返回值为 1或者-1，如果点击的菜单存在相应的窗口则返回1，否则返回-1

##  jq方法

通过on()方法写的一些简单的切换窗口、删除窗口、刷新当前页面、关闭其他页面、关闭前部页面等方法，在此不做赘述，有兴趣的可以查看一下源码。

> 也许通过上面的描述，你已经大致了解如何使用 bodyTab 了，但愿TA能成为你永久的开发伙伴，转化为你屏幕上的万千字节！