583 lines
23 KiB
JavaScript
583 lines
23 KiB
JavaScript
/**
|
||
* 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);
|
||
});
|