123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582 |
- /**
- * 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);
- });
|