var $; String.prototype.format = function () { //字符串占位符 //eg: var str1 = "hello {0}".format("world"); if (arguments.length == 0) return this; var param = arguments[0]; var s = this; if (typeof (param) == 'object') { for (var key in param) { s = s.replace(new RegExp("\\{" + key + "\\}", "g"), param[key]); } return s; } else { for (var i = 0; i < arguments.length; i++) { s = s.replace(new RegExp("\\{" + i + "\\}", "g"), arguments[i]); } return s; } }; layui.define(["element", "jquery"], function (exports) { var layui = parent.layui || layui; $ = layui.jquery; var element = layui.element, layer = layui.layer, okTab = function () { this.tabConfig = { openTabNum: 30, //最大可打开窗口数量默认30 tabFilter: "ok-tab", //添加窗口的filter url: "./data/navs.json" //获取菜单的接口地址 } }; /** * 导航初始化的操作(只执行一次) * @param option 配置tabConfig参数 * @returns {okTab} */ okTab.prototype.init = function (option) { var _this = this; //这个this就是代表okTab(因为prototype的原因) $.extend(true, _this.tabConfig, option); //函数用于将一个或多个对象的内容合并到目标对象。http://www.runoob.com/jquery/misc-extend.html this.tabDelete(); //关闭导航页的操作 this.tab(); //tab导航切换时的操作 return _this; }; /** * 定位tab位置 * @param superEle 父级元素 * @param ele 当前tab */ okTab.prototype.positionTab = function (contEle, ele) { var superEle = $(".ok-tab");//父级元素 contEle = $(contEle);//tab内容存放的父元素 ele = $(ele);//当前的tab var menuSet = $(".okadmin-side a[lay-id]");//获取所有菜单集合 var thatLayId = ele.attr('lay-id'); var contWidth = contEle.width(),//父级元素宽度 superWidth = parseInt(superEle.width()) - 40 * 3,//可显示的宽度 subWidth = ele.outerWidth(),//当前元素宽度 elePrevAll = ele.prevAll(),//左边的所有同级元素 leftWidth = 0,//左边距离 postLeft = Math.abs(contEle.position().left);//当前移动的位置 var maxMoveWidth = contWidth - superWidth;//最大可移动的宽度 /*console.log("maxMoveWidth:" + maxMoveWidth); console.log("superWidth:" + superWidth); console.log("contWidth:" + contWidth);*/ for (let i = 0; i < elePrevAll.length; i++) { leftWidth += $(elePrevAll[i]).outerWidth() * 1; } if (contWidth > superWidth) { /** * 移动tab栏的位置 */ var showPost = leftWidth - postLeft;//当前点击的元素位置(显示区域的位置) var halfPlace = parseInt(superWidth / 2);//可显示的宽度的一半 if (halfPlace < showPost) {//从右往左移动 var tempMove = leftWidth - subWidth;//预留一部分距离 if(tempMove > maxMoveWidth){//当前移动的距离超过最大可移动的宽度 tempMove = maxMoveWidth; } contEle.animate({ left: -tempMove }, 50); }else{//从左往右移动 console.log("从左往右移动"); var tempMove = leftWidth - halfPlace;//预留一部分距离 if(tempMove < 0){ tempMove = 0; } contEle.animate({ left: -tempMove }, 50); } } /** * 左侧菜单的样式和多级菜单的展开 */ $(".okadmin-side").find("li,dd").removeClass("layui-this").removeClass("layui-nav-itemed");//关闭所有展开的菜单 for (let i = 0; i < menuSet.length; i++) { if ($(menuSet[i]).attr('lay-id') == thatLayId) { $(menuSet[i]).parents("dd").addClass("layui-nav-itemed"); $(menuSet[i]).parents("li").addClass("layui-nav-itemed"); $(menuSet[i]).parent().removeClass("layui-nav-itemed").addClass("layui-this"); break; } } }; // 点击导航页的操作 okTab.prototype.tab = function () { var that = this; var filter = this.tabConfig.tabFilter; element.on(`tab(${filter})`, function (data) { var index = data.index;//点击的某个tab索引 var elSuper = $(".ok-tab"),//视窗元素 elMove = $(".ok-tab-title"),//移动的元素 elTabs = $(".ok-tab-title li"),//所有已存在的tab集合 thatElem = $(elTabs[index]);//当前元素 that.positionTab(elMove, thatElem); }); }; //删除tab页的操作(此处为点击关闭按钮的操作) okTab.prototype.tabDelete = function () { var that = this; var filter = this.tabConfig.tabFilter; element.on(`tabDelete(${filter})`, function (data) { // that.navMove("right"); }); }; //右侧内容nav操作添加tab页 okTab.prototype.tabAdd = function (_thisa) { var that = this; var _this = $(_thisa).clone(true);//拷贝dom(js: _this.cloneNode(true) ) var openTabNum = that.tabConfig.openTabNum; var tabFilter = that.tabConfig.tabFilter; var url = _this.attr("data-url");//选项卡的页面路径 var tabId = _this.attr("lay-id");//选项卡ID var thatTabNum = $('.ok-tab-title > li').length;//当前已经打开的选项卡的数量 var iframes = $(".ok-tab-content iframe"); var isClose = _this.attr('is-close') || "true"; _this.prepend(""); if (_this.children("i").length < 1) { _this.prepend(""); } if (_this.attr("target") == "_blank") { window.location.href = _this.attr("data-url"); } else if (url != undefined) { var title = ''; var html = _this.html(); // 去重复选项卡 /** * 这里还有一种情况就是同一选项卡页面路径不同(这个是多余的没必要了,页面不同,跳转的选项卡也应该新增) */ for (var i = 0; i < thatTabNum; i++) { if ($('.ok-tab-title > li').eq(i).attr('lay-id') == tabId) { var iframeParam = (iframes[i].src).split("?")[1]; var urlParam = url.split("?")[1]; if (urlParam == iframeParam) { element.tabChange(tabFilter, tabId); } else { //参数不一样的时候刷新并且更换参数 iframes[i].contentWindow.location.reload(true); iframes[i].src = url; element.tabChange(tabFilter, tabId); } if (event) { event.stopPropagation(); } return; } } if (thatTabNum >= openTabNum) { layer.msg('最多只能同时打开' + openTabNum + '个选项卡哦。不然系统会卡的!'); return; } element.tabAdd(tabFilter, { title: html , content: ` ` , id: tabId }); // 切换选项卡 element.tabChange(tabFilter, tabId); this.navMove("rightmax"); } }; //生成左侧菜单 var temp = ""; okTab.prototype.navBar = function (strData) { var data; if (typeof (strData) == "string") { var data = JSON.parse(strData); //有可能是字符串,转换一下 } else { data = strData; } var ulItem = ''; for (var i = 0; i < data.length; i++) { temp = ""; if (data[i].isCheck) { ulItem += '