/** * date:2020/02/27 * author:Mr.Chung * version:2.0 * description:layuimini tab框架扩展 */ layui.define(["element", "layer", "jquery"], function (exports) { var element = layui.element, layer = layui.layer, $ = layui.$; var miniTab = { /** * 初始化tab * @param options */ render: function (options) { options.filter = options.filter || null; options.multiModule = options.multiModule || false; options.urlHashLocation = options.urlHashLocation || false; options.maxTabNum = options.maxTabNum || 20; options.menuList = options.menuList || []; // todo 后期菜单想改为不操作dom, 而是直接操作初始化传过来的数据 options.homeInfo = options.homeInfo || {}; options.listenSwichCallback = options.listenSwichCallback || function () { }; miniTab.listen(options); miniTab.listenRoll(); miniTab.listenSwitch(options); miniTab.listenHash(options); }, /** * 新建tab窗口 * @param options.tabId * @param options.href * @param options.title * @param options.isIframe * @param options.maxTabNum */ create: function (options) { options.tabId = options.tabId || null; options.href = options.href || null; options.title = options.title || null; options.isIframe = options.isIframe || false; options.maxTabNum = options.maxTabNum || 20; if ($(".layuimini-tab .layui-tab-title li").length >= options.maxTabNum) { layer.msg('Tab窗口已达到限定数量,请先关闭部分Tab'); return false; } var ele = element; if (options.isIframe) ele = parent.layui.element; ele.tabAdd('layuiminiTab', { title: '' + options.title + '' //用于演示 , content: '' , id: options.tabId }); $('.layuimini-menu-left').attr('layuimini-tab-tag', 'add'); sessionStorage.setItem('layuiminimenu_' + options.tabId, options.title); }, /** * 切换选项卡 * @param tabId */ change: function (tabId) { element.tabChange('layuiminiTab', tabId); }, /** * 删除tab窗口 * @param tabId * @param isParent */ delete: function (tabId, isParent) { // todo 未知BUG,不知道是不是layui问题,必须先删除元素 $(".layuimini-tab .layui-tab-title .layui-unselect.layui-tab-bar").remove(); if (isParent === true) { parent.layui.element.tabDelete('layuiminiTab', tabId); } else { element.tabDelete('layuiminiTab', tabId); } }, /** * 在iframe层打开新tab方法 */ openNewTabByIframe: function (options) { options.href = options.href || null; options.title = options.title || null; var loading = parent.layer.load(0, {shade: false, time: 2 * 1000}); if (options.href === null || options.href === undefined) options.href = new Date().getTime(); var checkTab = miniTab.check(options.href, true); if (!checkTab) { miniTab.create({ tabId: options.href, href: options.href, title: options.title, isIframe: true, }); } parent.layui.element.tabChange('layuiminiTab', options.href); parent.layer.close(loading); }, /** * 在iframe层关闭当前tab方法 */ deleteCurrentByIframe: function () { var ele = $(".layuimini-tab .layui-tab-title li.layui-this", parent.document); if (ele.length > 0) { var layId = $(ele[0]).attr('lay-id'); miniTab.delete(layId, true); } }, /** * 判断tab窗口 */ check: function (tabId, isIframe) { // 判断选项卡上是否有 var checkTab = false; if (isIframe === undefined || isIframe === false) { $(".layui-tab-title li").each(function () { var checkTabId = $(this).attr('lay-id'); if (checkTabId != null && checkTabId === tabId) { checkTab = true; } }); } else { parent.layui.$(".layui-tab-title li").each(function () { var checkTabId = $(this).attr('lay-id'); if (checkTabId != null && checkTabId === tabId) { checkTab = true; } }); } return checkTab; }, /** * 开启tab右键菜单 * @param tabId * @param left */ openTabRignMenu: function (tabId, left) { miniTab.closeTabRignMenu(); var menuHtml = '
\n' + '
\n' + '
关 闭 当 前
\n' + '
关 闭 其 他
\n' + '
关 闭 全 部
\n' + '
\n' + '
'; var makeHtml = '
'; $('.layuimini-tab .layui-tab-title').after(menuHtml); $('.layuimini-tab .layui-tab-content').after(makeHtml); }, /** * 关闭tab右键菜单 */ closeTabRignMenu: function () { $('.layuimini-tab-mousedown').remove(); $('.layuimini-tab-make').remove(); }, /** * 查询菜单信息 * @param href * @param menuList */ searchMenu: function (href, menuList) { var menu; for (key in menuList) { var item = menuList[key]; if (item.href === href) { menu = item; break; } if (item.child) { newMenu = miniTab.searchMenu(href, item.child); if (newMenu) { menu = newMenu; break; } } } return menu; }, /** * 监听 * @param options */ listen: function (options) { options = options || {}; options.maxTabNum = options.maxTabNum || 20; /** * 打开新窗口 */ $('body').on('click', '[layuimini-href]', function () { var loading = layer.load(0, {shade: false, time: 2 * 1000}); var tabId = $(this).attr('layuimini-href'), href = $(this).attr('layuimini-href'), title = $(this).text(), target = $(this).attr('target'); var el = $("[layuimini-href='" + href + "']", ".layuimini-menu-left"); layer.close(window.openTips); if (el.length) { $(el).closest(".layui-nav-tree").find(".layui-this").removeClass("layui-this"); $(el).parent().addClass("layui-this"); } if (target === '_blank') { layer.close(loading); window.open(href, "_blank"); return false; } if (tabId === null || tabId === undefined) tabId = new Date().getTime(); var checkTab = miniTab.check(tabId); if (!checkTab) { miniTab.create({ tabId: tabId, href: href, title: title, isIframe: false, maxTabNum: options.maxTabNum, }); } element.tabChange('layuiminiTab', tabId); layer.close(loading); }); /** * 在iframe子菜单上打开新窗口 */ $('body').on('click', '[layuimini-content-href]', function () { var loading = parent.layer.load(0, {shade: false, time: 2 * 1000}); var tabId = $(this).attr('layuimini-content-href'), href = $(this).attr('layuimini-content-href'), title = $(this).attr('data-title'), target = $(this).attr('target'); if (target === '_blank') { parent.layer.close(loading); window.open(href, "_blank"); return false; } if (tabId === null || tabId === undefined) tabId = new Date().getTime(); var checkTab = miniTab.check(tabId, true); if (!checkTab) { miniTab.create({ tabId: tabId, href: href, title: title, isIframe: true, maxTabNum: options.maxTabNum, }); } parent.layui.element.tabChange('layuiminiTab', tabId); parent.layer.close(loading); }); /** * 关闭选项卡 **/ $('body').on('click', '.layuimini-tab .layui-tab-title .layui-tab-close', function () { var loading = layer.load(0, {shade: false, time: 2 * 1000}); var $parent = $(this).parent(); var tabId = $parent.attr('lay-id'); if (tabId !== undefined || tabId !== null) { miniTab.delete(tabId); } layer.close(loading); }); /** * 选项卡操作 */ $('body').on('click', '[layuimini-tab-close]', function () { var loading = layer.load(0, {shade: false, time: 2 * 1000}); var closeType = $(this).attr('layuimini-tab-close'); $(".layuimini-tab .layui-tab-title li").each(function () { var tabId = $(this).attr('lay-id'); var id = $(this).attr('id'); var isCurrent = $(this).hasClass('layui-this'); if (id !== 'layuiminiHomeTabId') { if (closeType === 'all') { miniTab.delete(tabId); } else { if (closeType === 'current' && isCurrent) { miniTab.delete(tabId); } else if (closeType === 'other' && !isCurrent) { miniTab.delete(tabId); } } } }); layer.close(loading); }); /** * 禁用网页右键 */ $(".layuimini-tab .layui-tab-title").unbind("mousedown").bind("contextmenu", function (e) { e.preventDefault(); return false; }); /** * 注册鼠标右键 */ $('body').on('mousedown', '.layuimini-tab .layui-tab-title li', function (e) { var left = $(this).offset().left - $('.layuimini-tab ').offset().left + ($(this).width() / 2), tabId = $(this).attr('lay-id'); if (e.which === 3) { miniTab.openTabRignMenu(tabId, left); } }); /** * 关闭tab右键菜单 */ $('body').on('click', '.layui-body,.layui-header,.layuimini-menu-left,.layuimini-tab-make', function () { miniTab.closeTabRignMenu(); }); /** * tab右键选项卡操作 */ $('body').on('click', '[layuimini-tab-menu-close]', function () { var loading = layer.load(0, {shade: false, time: 2 * 1000}); var closeType = $(this).attr('layuimini-tab-menu-close'), currentTabId = $('.layuimini-tab-mousedown').attr('data-tab-id'); $(".layuimini-tab .layui-tab-title li").each(function () { var tabId = $(this).attr('lay-id'); var id = $(this).attr('id'); if (id !== 'layuiminiHomeTabId') { if (closeType === 'all') { miniTab.delete(tabId); } else { if (closeType === 'current' && currentTabId === tabId) { miniTab.delete(tabId); } else if (closeType === 'other' && currentTabId !== tabId) { miniTab.delete(tabId); } } } }); miniTab.closeTabRignMenu(); layer.close(loading); }); }, /** * 监听tab切换 * @param options */ listenSwitch: function (options) { options.filter = options.filter || null; options.multiModule = options.multiModule || false; options.urlHashLocation = options.urlHashLocation || false; options.listenSwichCallback = options.listenSwichCallback || function () { }; element.on('tab(' + options.filter + ')', function (data) { var tabId = $(this).attr('lay-id'); if (options.urlHashLocation) { location.hash = '/' + tabId; } if (typeof options.listenSwichCallback === 'function') { options.listenSwichCallback(); } // 判断是否为新增窗口 if ($('.layuimini-menu-left').attr('layuimini-tab-tag') === 'add') { $('.layuimini-menu-left').attr('layuimini-tab-tag', 'no') } else { $("[layuimini-href]").parent().removeClass('layui-this'); if (options.multiModule) { miniTab.listenSwitchMultiModule(tabId); } else { miniTab.listenSwitchSingleModule(tabId); } } miniTab.rollPosition(); }); }, /** * 监听hash变化 * @param options * @returns {boolean} */ listenHash: function (options) { options.urlHashLocation = options.urlHashLocation || false; options.maxTabNum = options.maxTabNum || 20; options.homeInfo = options.homeInfo || {}; options.menuList = options.menuList || []; if (!options.urlHashLocation) return false; var tabId = location.hash.replace(/^#\//, ''); if (tabId === null || tabId === undefined || tabId ==='') return false; // 判断是否为首页 if(tabId ===options.homeInfo.href) return false; // 判断是否为右侧菜单 var menu = miniTab.searchMenu(tabId, options.menuList); if (menu !== undefined) { miniTab.create({ tabId: tabId, href: tabId, title: menu.title, isIframe: false, maxTabNum: options.maxTabNum, }); $('.layuimini-menu-left').attr('layuimini-tab-tag', 'no'); element.tabChange('layuiminiTab', tabId); return false; } // 判断是否为快捷菜单 var isSearchMenu = false; $("[layuimini-content-href]").each(function () { if ($(this).attr("layuimini-content-href") === tabId) { var title = $(this).attr("data-title"); miniTab.create({ tabId: tabId, href: tabId, title: title, isIframe: false, maxTabNum: options.maxTabNum, }); $('.layuimini-menu-left').attr('layuimini-tab-tag', 'no'); element.tabChange('layuiminiTab', tabId); isSearchMenu = true; return false; } }); if (isSearchMenu) return false; // 既不是右侧菜单、快捷菜单,就直接打开 var title = sessionStorage.getItem('layuiminimenu_' + tabId) === null ? tabId : sessionStorage.getItem('layuiminimenu_' + tabId); miniTab.create({ tabId: tabId, href: tabId, title: title, isIframe: false, maxTabNum: options.maxTabNum, }); element.tabChange('layuiminiTab', tabId); return false; }, /** * 监听滚动 */ listenRoll: function () { $(".layuimini-tab-roll-left").click(function () { miniTab.rollClick("left"); }); $(".layuimini-tab-roll-right").click(function () { miniTab.rollClick("right"); }); }, /** * 单模块切换 * @param tabId */ listenSwitchSingleModule: function (tabId) { $("[layuimini-href]").each(function () { if ($(this).attr("layuimini-href") === tabId) { // 自动展开菜单栏 var addMenuClass = function ($element, type) { if (type === 1) { $element.addClass('layui-this'); if ($element.hasClass('layui-nav-item') && $element.hasClass('layui-this')) { $(".layuimini-header-menu li").attr('class', 'layui-nav-item'); } else { addMenuClass($element.parent().parent(), 2); } } else { $element.addClass('layui-nav-itemed'); if ($element.hasClass('layui-nav-item') && $element.hasClass('layui-nav-itemed')) { $(".layuimini-header-menu li").attr('class', 'layui-nav-item'); } else { addMenuClass($element.parent().parent(), 2); } } }; addMenuClass($(this).parent(), 1); return false; } }); }, /** * 多模块切换 * @param tabId */ listenSwitchMultiModule: function (tabId) { $("[layuimini-href]").each(function () { if ($(this).attr("layuimini-href") === tabId) { // 自动展开菜单栏 var addMenuClass = function ($element, type) { if (type === 1) { $element.addClass('layui-this'); if ($element.hasClass('layui-nav-item') && $element.hasClass('layui-this')) { var moduleId = $element.parent().attr('id'); $(".layuimini-header-menu li").attr('class', 'layui-nav-item'); $("#" + moduleId + "HeaderId").addClass("layui-this"); $(".layuimini-menu-left .layui-nav.layui-nav-tree").attr('class', 'layui-nav layui-nav-tree layui-hide'); $("#" + moduleId).attr('class', 'layui-nav layui-nav-tree layui-this'); } else { addMenuClass($element.parent().parent(), 2); } } else { $element.addClass('layui-nav-itemed'); if ($element.hasClass('layui-nav-item') && $element.hasClass('layui-nav-itemed')) { var moduleId = $element.parent().attr('id'); $(".layuimini-header-menu li").attr('class', 'layui-nav-item'); $("#" + moduleId + "HeaderId").addClass("layui-this"); $(".layuimini-menu-left .layui-nav.layui-nav-tree").attr('class', 'layui-nav layui-nav-tree layui-hide'); $("#" + moduleId).attr('class', 'layui-nav layui-nav-tree layui-this'); } else { addMenuClass($element.parent().parent(), 2); } } }; addMenuClass($(this).parent(), 1); return false; } }); }, /** * 自动定位 */ rollPosition: function () { var $tabTitle = $('.layuimini-tab .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); }, /** * 点击滚动 * @param direction */ rollClick: function (direction) { var $tabTitle = $('.layuimini-tab .layui-tab-title'); var left = $tabTitle.scrollLeft(); if ('left' === direction) { $tabTitle.animate({ scrollLeft: left - 450 }, 200); } else { $tabTitle.animate({ scrollLeft: left + 450 }, 200); } } }; exports("miniTab", miniTab); });