/** 右键菜单模块 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 = '
'; htmlStr += contextMenu.getHtml(items, ''); htmlStr += '
'; 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 += '
'; htmlStr += ''; if (item.icon) { htmlStr += ''; } htmlStr += item.name; htmlStr += ''; htmlStr += ''; htmlStr += ''; } else { htmlStr += '
'; htmlStr += ''; if (item.icon) { htmlStr += ''; } htmlStr += item.name; htmlStr += ''; } htmlStr += '
'; if (item.hr == true) { htmlStr += '
'; } } 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(''); exports("contextMenu", contextMenu); });