¶Ô±ÈÐÂÎļþ |
| | |
| | | /** |
| | | * 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: '<span class="layuimini-tab-active"></span><span>' + options.title + '</span><i class="layui-icon layui-unselect layui-tab-close">á</i>' //ç¨äºæ¼ç¤º |
| | | , content: '<iframe width="100%" height="100%" frameborder="no" border="0" marginwidth="0" marginheight="0" src="' + options.href + '"></iframe>' |
| | | , 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 = '<div class="layui-unselect layui-form-select layui-form-selected layuimini-tab-mousedown layui-show" data-tab-id="' + tabId + '" style="left: ' + left + 'px!important">\n' + |
| | | '<dl>\n' + |
| | | '<dd><a href="javascript:;" layuimini-tab-menu-close="current">å
³ é å½ å</a></dd>\n' + |
| | | '<dd><a href="javascript:;" layuimini-tab-menu-close="other">å
³ é å
¶ ä»</a></dd>\n' + |
| | | '<dd><a href="javascript:;" layuimini-tab-menu-close="all">å
³ é å
¨ é¨</a></dd>\n' + |
| | | '</dl>\n' + |
| | | '</div>'; |
| | | var makeHtml = '<div class="layuimini-tab-make"></div>'; |
| | | $('.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); |
| | | }); |