/** 右键菜单模块 date:2019-02-08 License By http://easyweb.vip */
|
layui.define(["jquery"], function (exports) {
|
var $ = layui.jquery;
|
|
var contextMenu = {
|
// 绑定元素
|
bind: function (elem, items) {
|
$(elem).bind('contextmenu', function (e) {
|
contextMenu.show(items, e.clientX, e.clientY, e);
|
return false;
|
});
|
},
|
// 在指定坐标显示菜单
|
show: function (items, x, y, e) {
|
var xy = 'left: ' + x + 'px; top: ' + y + 'px;';
|
var htmlStr = '<div class="ctxMenu" style="' + xy + '">';
|
htmlStr += contextMenu.getHtml(items, '');
|
htmlStr += ' </div>';
|
contextMenu.remove();
|
$('body').append(htmlStr);
|
// 调整溢出位置
|
var $ctxMenu = $('.ctxMenu');
|
if (x + $ctxMenu.outerWidth() > contextMenu.getPageWidth()) {
|
x -= $ctxMenu.outerWidth();
|
}
|
if (y + $ctxMenu.outerHeight() > contextMenu.getPageHeight()) {
|
y = y - $ctxMenu.outerHeight();
|
if (y < 0) {
|
y = 0;
|
}
|
}
|
$ctxMenu.css({'top': y, 'left': x});
|
// 添加item点击事件
|
contextMenu.setEvents(items, e);
|
// 显示子菜单事件
|
$('.ctxMenu-item').on('mouseenter', function (e) {
|
e.stopPropagation();
|
$(this).parent().find('.ctxMenu-sub').css('display', 'none');
|
if (!$(this).hasClass('haveMore')) return;
|
var $item = $(this).find('>a');
|
var $sub = $(this).find('>.ctxMenu-sub');
|
var top = $item.offset().top - $('body,html').scrollTop();
|
var left = $item.offset().left + $item.outerWidth() - $('body,html').scrollLeft();
|
if (left + $sub.outerWidth() > contextMenu.getPageWidth()) {
|
left = $item.offset().left - $sub.outerWidth();
|
}
|
if (top + $sub.outerHeight() > contextMenu.getPageHeight()) {
|
top = top - $sub.outerHeight() + $item.outerHeight();
|
if (top < 0) {
|
top = 0;
|
}
|
}
|
$(this).find('>.ctxMenu-sub').css({
|
'top': top,
|
'left': left,
|
'display': 'block'
|
});
|
})/*.on('mouseleave', function () {
|
$(this).find('>.ctxMenu-sub').css('display', 'none');
|
})*/;
|
},
|
// 移除所有
|
remove: function () {
|
var ifs = parent.window.frames;
|
for (var i = 0; i < ifs.length; i++) {
|
var tif = ifs[i];
|
try {
|
tif.layui.jquery('body>.ctxMenu').remove();
|
} catch (e) {
|
}
|
}
|
try {
|
parent.layui.jquery('body>.ctxMenu').remove();
|
} catch (e) {
|
}
|
},
|
// 设置事件监听
|
setEvents: function (items, event) {
|
$('.ctxMenu').off('click').on('click', '[lay-id]', function (e) {
|
var itemId = $(this).attr('lay-id');
|
var item = getItemById(itemId, items);
|
item.click && item.click(e, event);
|
});
|
|
function getItemById(id, list) {
|
for (var i = 0; i < list.length; i++) {
|
var one = list[i];
|
if (id == one.itemId) {
|
return one;
|
} else if (one.subs && one.subs.length > 0) {
|
var temp = getItemById(id, one.subs);
|
if (temp) {
|
return temp;
|
}
|
}
|
}
|
}
|
},
|
// 构建无限级
|
getHtml: function (items, pid) {
|
var htmlStr = '';
|
for (var i = 0; i < items.length; i++) {
|
var item = items[i];
|
item.itemId = 'ctxMenu-' + pid + i;
|
if (item.subs && item.subs.length > 0) {
|
htmlStr += '<div class="ctxMenu-item haveMore" lay-id="' + item.itemId + '">';
|
htmlStr += '<a>';
|
if (item.icon) {
|
htmlStr += '<i class="' + item.icon + ' ctx-icon"></i>';
|
}
|
htmlStr += item.name;
|
htmlStr += '<i class="layui-icon layui-icon-right icon-more"></i>';
|
htmlStr += '</a>';
|
htmlStr += '<div class="ctxMenu-sub" style="display: none;">';
|
htmlStr += contextMenu.getHtml(item.subs, pid + i);
|
htmlStr += '</div>';
|
} else {
|
htmlStr += '<div class="ctxMenu-item" lay-id="' + item.itemId + '">';
|
htmlStr += '<a>';
|
if (item.icon) {
|
htmlStr += '<i class="' + item.icon + ' ctx-icon"></i>';
|
}
|
htmlStr += item.name;
|
htmlStr += '</a>';
|
}
|
htmlStr += '</div>';
|
if (item.hr == true) {
|
htmlStr += '<hr/>';
|
}
|
}
|
return htmlStr;
|
},
|
// 获取css代码
|
getCommonCss: function () {
|
var cssStr = '.ctxMenu, .ctxMenu-sub {';
|
cssStr += ' max-width: 250px;';
|
cssStr += ' min-width: 110px;';
|
cssStr += ' background: white;';
|
cssStr += ' border-radius: 2px;';
|
cssStr += ' padding: 5px 0;';
|
cssStr += ' white-space: nowrap;';
|
cssStr += ' position: fixed;';
|
cssStr += ' z-index: 2147483647;';
|
cssStr += ' box-shadow: 0 2px 4px rgba(0, 0, 0, .12);';
|
cssStr += ' border: 1px solid #d2d2d2;';
|
cssStr += ' overflow: visible;';
|
cssStr += ' }';
|
|
cssStr += ' .ctxMenu-item {';
|
cssStr += ' position: relative;';
|
cssStr += ' }';
|
|
cssStr += ' .ctxMenu-item > a {';
|
cssStr += ' font-size: 14px;';
|
cssStr += ' color: #666;';
|
cssStr += ' padding: 0 26px 0 35px;';
|
cssStr += ' cursor: pointer;';
|
cssStr += ' display: block;';
|
cssStr += ' line-height: 36px;';
|
cssStr += ' text-decoration: none;';
|
cssStr += ' position: relative;';
|
cssStr += ' }';
|
|
cssStr += ' .ctxMenu-item > a:hover {';
|
cssStr += ' background: #f2f2f2;';
|
cssStr += ' color: #666;';
|
cssStr += ' }';
|
|
cssStr += ' .ctxMenu-item > a > .icon-more {';
|
cssStr += ' position: absolute;';
|
cssStr += ' right: 5px;';
|
cssStr += ' top: 0;';
|
cssStr += ' font-size: 12px;';
|
cssStr += ' color: #666;';
|
cssStr += ' }';
|
|
cssStr += ' .ctxMenu-item > a > .ctx-icon {';
|
cssStr += ' position: absolute;';
|
cssStr += ' left: 12px;';
|
cssStr += ' top: 0;';
|
cssStr += ' font-size: 15px;';
|
cssStr += ' color: #666;';
|
cssStr += ' }';
|
|
cssStr += ' .ctxMenu hr {';
|
cssStr += ' background-color: #e6e6e6;';
|
cssStr += ' clear: both;';
|
cssStr += ' margin: 5px 0;';
|
cssStr += ' border: 0;';
|
cssStr += ' height: 1px;';
|
cssStr += ' }';
|
|
cssStr += ' .ctx-ic-lg {';
|
cssStr += ' font-size: 18px !important;';
|
cssStr += ' left: 11px !important;';
|
cssStr += ' }';
|
return cssStr;
|
},
|
// 获取浏览器高度
|
getPageHeight: function () {
|
return document.documentElement.clientHeight || document.body.clientHeight;
|
},
|
// 获取浏览器宽度
|
getPageWidth: function () {
|
return document.documentElement.clientWidth || document.body.clientWidth;
|
},
|
};
|
|
// 点击任意位置关闭菜单
|
$(document).off('click.ctxMenu').on('click.ctxMenu', function () {
|
contextMenu.remove();
|
});
|
|
// 点击有子菜单的节点不关闭菜单
|
$(document).off('click.ctxMenuMore').on('click.ctxMenuMore', '.ctxMenu-item', function (e) {
|
if ($(this).hasClass('haveMore')) {
|
if (e !== void 0) {
|
e.preventDefault();
|
e.stopPropagation();
|
}
|
} else {
|
contextMenu.remove();
|
}
|
});
|
|
$('head').append('<style id="ew-css-ctx">' + contextMenu.getCommonCss() + '</style>');
|
exports("contextMenu", contextMenu);
|
});
|