layui.define(["jquery", "element", "dropdown"], function (exports) { "use strict"; var MOD_NAME = "tabPage", $ = layui.jquery, dropdown = layui.dropdown, element = layui.element; var tabPage = function (opt) { this.option = opt; }; var tabData = new Array(); var tabDataCurrent = 0; var contextTabDOM; tabPage.prototype.render = function (opt) { var option = { elem: opt.elem, data: opt.data, index: opt.index, tool: opt.tool || true, roll: opt.roll || true, success: opt.success ? opt.success : function (id) {}, session: opt.session ? opt.session : false, preload: opt.preload ? opt.preload : false, height: opt.height || "100%", width: opt.width || "100%", closeEvent: opt.closeEvent, tabMax: opt.tabMax, }; if (option.session) { if (sessionStorage.getItem(option.elem + "-pear-tab-page-data") != null) { tabData = JSON.parse( sessionStorage.getItem(option.elem + "-pear-tab-page-data"), ); option.data = JSON.parse( sessionStorage.getItem(option.elem + "-pear-tab-page-data"), ); tabDataCurrent = sessionStorage.getItem( option.elem + "-pear-tab-page-data-current", ); tabData.forEach(function (item, index) { if (item.id == tabDataCurrent) { option.index = index; } }); } else { tabData = opt.data; } } var lastIndex; var tab = createTab(option); $("#" + option.elem).html(tab); $(".layui-tab[lay-filter='" + option.elem + "'] .layui-tab-prev").click( function () { rollPage("left", option); }, ); $(".layui-tab[lay-filter='" + option.elem + "'] .layui-tab-next").click( function () { rollPage("right", option); }, ); element.init(); $("#" + option.elem).width(opt.width); $("#" + option.elem).height(opt.height); $("#" + option.elem).css({ position: "relative", }); closeEvent(option); option.success( sessionStorage.getItem(option.elem + "-pear-tab-page-data-current"), ); dropdown.render({ elem: `#${option.elem} .layui-tab-control > .layui-icon-down`, trigger: "hover", data: [ { title: "关 闭 当 前", id: 1, }, { title: "关 闭 其 他", id: 2, }, { title: "关 闭 全 部", id: 3, }, ], click: function (obj) { const id = obj.id; if (id === 1) { var currentTab = $( ".layui-tab[lay-filter='" + option.elem + "'] .layui-tab-title .layui-this", ); if (currentTab.find("span").is(".able-close")) { var currentId = currentTab.attr("lay-id"); tabDelete(option.elem, currentId, option.closeEvent, option); } else { layer.msg("当前页面不允许关闭", { icon: 3, time: 1000, }); } } else if (id === 2) { var currentId = $( ".layui-tab[lay-filter='" + option.elem + "'] .layui-tab-title .layui-this", ).attr("lay-id"); var tabtitle = $( ".layui-tab[lay-filter='" + option.elem + "'] .layui-tab-title li", ); $.each(tabtitle, function (i) { if ($(this).attr("lay-id") != currentId) { if ($(this).find("span").is(".able-close")) { tabDelete( option.elem, $(this).attr("lay-id"), option.closeEvent, option, ); } } }); } else { var currentId = $( ".layui-tab[lay-filter='" + option.elem + "'] .layui-tab-title .layui-this", ).attr("lay-id"); var tabtitle = $( ".layui-tab[lay-filter='" + option.elem + "'] .layui-tab-title li", ); $.each(tabtitle, function (i) { if ($(this).find("span").is(".able-close")) { tabDelete( option.elem, $(this).attr("lay-id"), option.closeEvent, option, ); } }); } }, }); $("body .layui-tab[lay-filter='" + option.elem + "'] .layui-tab-title").on( "contextmenu", "li", function (e) { var top = e.clientY; var left = e.clientX; var menuWidth = 100; var currentId = $(this).attr("lay-id"); var menu = ``; contextTabDOM = $(this); var isOutsideBounds = left + menuWidth > $(window).width(); if (isOutsideBounds) { left = $(window).width() - menuWidth; } layer.open({ type: 1, title: false, shade: false, skin: "pear-tab-page-menu", closeBtn: false, area: [menuWidth + "px", "108px"], fixed: true, anim: false, isOutAnim: false, offset: [top, left], content: menu, success: function (layero, index) { layer.close(lastIndex); lastIndex = index; menuEvent(option, index); var timer; $(layero).on("mouseout", function () { timer = setTimeout(function () { layer.close(index); }, 30); }); $(layero).on("mouseover", function () { clearTimeout(timer); }); $(layero).on("contextmenu", function () { return false; }); }, }); return false; }, ); mousewheelAndTouchmoveHandler(option); return new tabPage(option); }; tabPage.prototype.click = function (callback) { var option = this.option; var elem = this.option.elem; element.on("tab(" + this.option.elem + ")", function (data) { var id = $("#" + elem + " .layui-tab-title .layui-this").attr("lay-id"); sessionStorage.setItem(option.elem + "-pear-tab-page-data-current", id); callback(id); }); }; tabPage.prototype.positionTab = function () { var $tabTitle = $( ".layui-tab[lay-filter=" + this.option.elem + "] .layui-tab-title", ); var autoLeft = 0; $tabTitle.children("li").each(function () { if ($(this).hasClass("layui-this")) { return false; } else { autoLeft += $(this).outerWidth(); } }); $tabTitle.animate( { scrollLeft: autoLeft - $tabTitle.width() / 3, }, 200, ); }; tabPage.prototype.clear = function () { sessionStorage.removeItem(this.option.elem + "-pear-tab-page-data"); sessionStorage.removeItem(this.option.elem + "-pear-tab-page-data-current"); }; var index = 0; // 根据过滤 fliter 标识, 重置选项卡标题 tabPage.prototype.changeTabTitleById = function (elem, id, title) { var currentTab = $( ".layui-tab[lay-filter='" + elem + "'] .layui-tab-title [lay-id='" + id + "'] .title", ); currentTab.html(title); }; // 根据过滤 filter 标识, 删除指定选项卡 tabPage.prototype.delTabByElem = function (elem, id, callback) { var currentTab = $( ".layui-tab[lay-filter='" + elem + "'] .layui-tab-title [lay-id='" + id + "']", ); if (currentTab.find("span").is(".able-close")) { tabDelete(elem, id, callback); } }; // 根据过滤 filter 标识, 删除其他选项卡 tabPage.prototype.delOtherTabByElem = function (elem, callback) { var currentId = $( ".layui-tab[lay-filter='" + elem + "'] .layui-tab-title .layui-this", ).attr("lay-id"); var tabtitle = $( ".layui-tab[lay-filter='" + elem + "'] .layui-tab-title li", ); $.each(tabtitle, function (i) { if ($(this).attr("lay-id") != currentId) { if ($(this).find("span").is(".able-close")) { tabDelete(elem, $(this).attr("lay-id"), callback); } } }); }; // 根据过滤 filter 标识, 删除全部选项卡 tabPage.prototype.delAllTabByElem = function (elem, callback) { var currentId = $( ".layui-tab[lay-filter='" + elem + "'] .layui-tab-title .layui-this", ).attr("lay-id"); var tabtitle = $( ".layui-tab[lay-filter='" + elem + "'] .layui-tab-title li", ); $.each(tabtitle, function (i) { if ($(this).find("span").is(".able-close")) { tabDelete(elem, $(this).attr("lay-id"), callback); } }); }; // 根据过滤 filter 标识, 删除当前选项卡 tabPage.prototype.delCurrentTabByElem = function (elem, callback) { var currentTab = $( ".layui-tab[lay-filter='" + elem + "'] .layui-tab-title .layui-this", ); if (currentTab.find("span").is(".able-close")) { var currentId = currentTab.attr("lay-id"); tabDelete(elem, currentId, callback); } }; /** * @since Pear Admin 4.0 */ tabPage.prototype.addTabOnly = function (opt, time) { var title = ` ${ opt.title } `; if ( $( ".layui-tab[lay-filter='" + this.option.elem + "'] .layui-tab-title li[lay-id]", ).length <= 0 ) { var that = this; if (opt.type === "_iframe") { element.tabAdd(this.option.elem, { id: opt.id, title: title, content: ``, }); } else { $.ajax({ url: opt.url, type: "get", dataType: "html", async: false, success: function (data) { element.tabAdd(that.option.elem, { id: opt.id, title: title, content: `
${data}
`, }); }, error: function (xhr, textstatus, thrown) { return layer.msg( "Status:" + xhr.status + "," + xhr.statusText + ",请稍后再试!", ); }, }); } tabData.push(opt); sessionStorage.setItem( that.option.elem + "-pear-tab-page-data", JSON.stringify(tabData), ); sessionStorage.setItem( that.option.elem + "-pear-tab-page-data-current", opt.id, ); } else { var isData = false; $.each( $( ".layui-tab[lay-filter='" + this.option.elem + "'] .layui-tab-title li[lay-id]", ), function () { if ($(this).attr("lay-id") == opt.id) { isData = true; } }, ); if (isData == false) { if (this.option.tabMax != false) { if ( $( ".layui-tab[lay-filter='" + this.option.elem + "'] .layui-tab-title li[lay-id]", ).length >= this.option.tabMax ) { layer.msg("最多打开" + this.option.tabMax + "个标签页", { icon: 2, time: 1000, shift: 6, }); return false; } } var that = this; if (opt.type === "_iframe") { element.tabAdd(this.option.elem, { id: opt.id, title: title, content: ``, }); } else { $.ajax({ url: opt.url, type: "get", dataType: "html", async: false, success: function (data) { element.tabAdd(that.option.elem, { id: opt.id, title: title, content: `
${data}
`, }); }, error: function (xhr, textstatus, thrown) { return layer.msg( "Status:" + xhr.status + "," + xhr.statusText + ",请稍后再试!", ); }, }); } tabData.push(opt); sessionStorage.setItem( that.option.elem + "-pear-tab-page-data", JSON.stringify(tabData), ); sessionStorage.setItem( that.option.elem + "-pear-tab-page-data-current", opt.id, ); } } element.tabChange(this.option.elem, opt.id); sessionStorage.setItem( this.option.elem + "-pear-tab-page-data-current", opt.id, ); }; // 刷 新 指 定 的 选 项 卡 tabPage.prototype.refresh = function (time) { var $iframe = $( ".layui-tab[lay-filter='" + this.option.elem + "'] .layui-tab-content .layui-show > *", ); var $iframeLoad; if (time != false && time != 0) { $iframe .parent() .append( `
`, ); $iframeLoad = $("#" + this.option.elem).find( "#pear-tab-page-loading" + index++, ); $iframeLoad.css({ display: "block", }); } if ($iframe.attr("type") === "_iframe") { $iframe.attr("src", $iframe.attr("src")); $iframe.on("load", function () { $iframeLoad.fadeOut(1000, function () { $iframeLoad.remove(); }); }); } else { $.ajax({ url: $iframe.attr("src"), type: "get", dataType: "html", success: function (data) { $iframe.html(data); if ($iframeLoad != undefined) { $iframeLoad.fadeOut(1000, function () { $iframeLoad.remove(); }); } }, error: function (xhr) { return layer.msg( "Status:" + xhr.status + "," + xhr.statusText + ",请稍后再试!", ); }, }); } }; function tabDelete(elem, id, callback, option) { var tabTitle = $(".layui-tab[lay-filter='" + elem + "']").find( ".layui-tab-title", ); var removeTab = tabTitle.find("li[lay-id='" + id + "']"); var nextNode = removeTab.next("li"); if (!removeTab.hasClass("layui-this")) { removeTab.remove(); var tabContent = $(".layui-tab[lay-filter='" + elem + "']") .find("*[id='" + id + "']") .parent(); tabContent.remove(); tabData = JSON.parse( sessionStorage.getItem(elem + "-pear-tab-page-data"), ); tabDataCurrent = sessionStorage.getItem( elem + "-pear-tab-page-data-current", ); tabData = tabData.filter(function (item) { return item.id != id; }); sessionStorage.setItem( elem + "-pear-tab-page-data", JSON.stringify(tabData), ); return false; } var currId; if (nextNode.length) { nextNode.addClass("layui-this"); currId = nextNode.attr("lay-id"); $("#" + elem + " [id='" + currId + "']") .parent() .addClass("layui-show"); } else { var prevNode = removeTab.prev("li"); prevNode.addClass("layui-this"); currId = prevNode.attr("lay-id"); $("#" + elem + " [id='" + currId + "']") .parent() .addClass("layui-show"); } callback(currId); tabData = JSON.parse(sessionStorage.getItem(elem + "-pear-tab-page-data")); tabDataCurrent = sessionStorage.getItem( elem + "-pear-tab-page-data-current", ); tabData = tabData.filter(function (item) { return item.id != id; }); sessionStorage.setItem( elem + "-pear-tab-page-data", JSON.stringify(tabData), ); sessionStorage.setItem(elem + "-pear-tab-page-data-current", currId); removeTab.remove(); // 删除 content var tabContent = $(".layui-tab[lay-filter='" + elem + "']") .find("*[id='" + id + "']") .parent(); // 删除 tabContent.remove(); } /** * @since Pear Admin 4.0 */ function createTab(option) { var type = ""; if (option.roll == true) { type = "layui-tab-roll"; } if (option.tool != false) { type = "layui-tab-tool"; } if (option.roll == true && option.tool != false) { type = "layui-tab-rollTool"; } var tab = '
'; var title = '"; content += "
"; tab += title; tab += control; tab += content; tab += ""; tab += ""; return tab; } function rollPage(d, option) { var $tabTitle = $("#" + option.elem + " .layui-tab-title"); var left = $tabTitle.scrollLeft(); if ("left" === d) { $tabTitle.animate( { scrollLeft: left - 450, }, 200, ); } else { $tabTitle.animate( { scrollLeft: left + 450, }, 200, ); } } function closeEvent(option) { $(".layui-tab[lay-filter='" + option.elem + "']").on( "click", ".layui-tab-close", function () { var layid = $(this).parent().attr("lay-id"); tabDelete(option.elem, layid, option.closeEvent, option); }, ); } function menuEvent(option, index) { $("#" + option.elem + "closeThis").click(function () { var currentTab = contextTabDOM; if (currentTab.find("span").is(".able-close")) { var currentId = currentTab.attr("lay-id"); tabDelete(option.elem, currentId, option.closeEvent, option); } else { layer.msg("当前页面不允许关闭", { icon: 3, time: 800, }); } layer.close(index); }); $("#" + option.elem + "closeOther").click(function () { var currentId = contextTabDOM.attr("lay-id"); var tabtitle = $( ".layui-tab[lay-filter='" + option.elem + "'] .layui-tab-title li", ); $.each(tabtitle, function (i) { if ($(this).attr("lay-id") != currentId) { if ($(this).find("span").is(".able-close")) { tabDelete( option.elem, $(this).attr("lay-id"), option.closeEvent, option, ); } } }); layer.close(index); }); $("#" + option.elem + "closeAll").click(function () { var tabtitle = $( ".layui-tab[lay-filter='" + option.elem + "'] .layui-tab-title li", ); $.each(tabtitle, function (i) { if ($(this).find("span").is(".able-close")) { tabDelete( option.elem, $(this).attr("lay-id"), option.closeEvent, option, ); } }); layer.close(index); }); } function mousewheelAndTouchmoveHandler(option) { var $bodyTab = $( "body .layui-tab[lay-filter='" + option.elem + "'] .layui-tab-title", ); var $tabTitle = $("#" + option.elem + " .layui-tab-title"); var mouseScrollStep = 100; // 鼠标滚轮 $bodyTab.on("mousewheel DOMMouseScroll", function (e) { e.originalEvent.preventDefault(); var delta = (e.originalEvent.wheelDelta && (e.originalEvent.wheelDelta > 0 ? "top" : "down")) || // chrome & ie (e.originalEvent.detail && (e.originalEvent.detail > 0 ? "down" : "top")); // firefox var scrollLeft = $tabTitle.scrollLeft(); if (delta === "top") { scrollLeft -= mouseScrollStep; } else if (delta === "down") { scrollLeft += mouseScrollStep; } $tabTitle.scrollLeft(scrollLeft); }); // 触摸移动 var touchX = 0; $bodyTab.on("touchstart", function (e) { var touch = e.originalEvent.targetTouches[0]; touchX = touch.pageX; }); $bodyTab.on("touchmove", function (e) { var event = e.originalEvent; if (event.targetTouches.length > 1) return; event.preventDefault(); var touch = event.targetTouches[0]; var distanceX = touchX - touch.pageX; var scrollLeft = $tabTitle.scrollLeft(); touchX = touch.pageX; $tabTitle.scrollLeft((scrollLeft += distanceX)); }); } exports(MOD_NAME, new tabPage()); });