| /** 下拉菜单模块 date:2020-05-04   License By http://easyweb.vip */ | 
| layui.define(['jquery'], function (exports) { | 
|     var $ = layui.jquery; | 
|     var openClass = 'dropdown-open'; | 
|     var disableClass = 'dropdown-disabled'; | 
|     var noScrollClass = 'dropdown-no-scroll'; | 
|     var shadeClass = 'dropdown-menu-shade'; | 
|     var dropdownClass = 'dropdown-menu'; | 
|     var dropNavClass = 'dropdown-menu-nav'; | 
|     var hoverClass = 'dropdown-hover'; | 
|     var fixedClass = 'fixed'; | 
|     var noShadeClass = 'no-shade'; | 
|     var animClass = 'layui-anim layui-anim-upbit'; | 
|     var popAnimClass = 'layui-anim layui-anim-fadein'; | 
|     var dropDirect = ['bottom-left', 'bottom-right', 'bottom-center', 'top-left', 'top-right', 'top-center', 'left-top', 'left-bottom', 'left-center', 'right-top', 'right-bottom', 'right-center']; | 
|     if ($('#ew-css-dropdown').length <= 0) { | 
|         layui.link(layui.cache.base + 'dropdown/dropdown.css'); | 
|     } | 
|   | 
|     var dropdown = { | 
|         // 绑定事件 | 
|         init: function () { | 
|             // 点击触发 | 
|             $(document).off('click.dropdown').on('click.dropdown', '.' + dropdownClass + '>*:first-child', function (event) { | 
|                 var $drop = $(this).parent(); | 
|                 if (!$drop.hasClass(hoverClass)) { | 
|                     if ($drop.hasClass(openClass)) { | 
|                         $drop.removeClass(openClass); | 
|                     } else { | 
|                         dropdown.hideAll(); | 
|                         dropdown.show($(this).parent().find('.' + dropNavClass)); | 
|                     } | 
|                 } | 
|                 event.stopPropagation(); | 
|             }); | 
|             // 点击任何位置关闭所有 | 
|             $(document).off('click.dropHide').on('click.dropHide', function (event) { | 
|                 dropdown.hideAll(); | 
|             }); | 
|             // 点击下拉菜单内容部分不关闭 | 
|             $(document).off('click.dropNav').on('click.dropNav', '.' + dropNavClass, function (event) { | 
|                 event.stopPropagation(); | 
|             }); | 
|             // hover触发 | 
|             var timer, lastDrop, hoverSelector = '.' + dropdownClass + '.' + hoverClass; | 
|             $(document).off('mouseenter.dropdown').on('mouseenter.dropdown', hoverSelector, function (event) { | 
|                 if (lastDrop && lastDrop == event.currentTarget) { | 
|                     clearTimeout(timer); | 
|                 } | 
|                 dropdown.show($(this).find('.' + dropNavClass)); | 
|             }); | 
|             $(document).off('mouseleave.dropdown').on('mouseleave.dropdown', hoverSelector, function (event) { | 
|                 lastDrop = event.currentTarget; | 
|                 timer = setTimeout(function () { | 
|                     $(event.currentTarget).removeClass(openClass); | 
|                 }, 300); | 
|             }); | 
|             // 分离式绑定 | 
|             $(document).off('click.dropStand').on('click.dropStand', '[data-dropdown]', function (event) { | 
|                 dropdown.showFixed($(this)); | 
|                 event.stopPropagation(); | 
|             }); | 
|             // 无限级子菜单 | 
|             var hoverNavSelector = '.' + dropNavClass + ' li'; | 
|             $(document).off('mouseenter.dropdownNav').on('mouseenter.dropdownNav', hoverNavSelector, function (event) { | 
|                 $(this).children('.dropdown-menu-nav-child').addClass(animClass); | 
|                 $(this).addClass('active'); | 
|             }); | 
|             $(document).off('mouseleave.dropdownNav').on('mouseleave.dropdownNav', hoverNavSelector, function (event) { | 
|                 $(this).removeClass('active'); | 
|                 $(this).find('li.active').removeClass('active'); | 
|             }); | 
|             // 气泡确认弹窗 | 
|             $(document).off('click.popconfirm').on('click.popconfirm', '.dropdown-menu-nav [btn-cancel]', function (event) { | 
|                 dropdown.hideAll(); | 
|                 event.stopPropagation(); | 
|             }); | 
|         }, | 
|         // 点击菜单关闭 | 
|         openClickNavClose: function () { | 
|             $(document).off('click.dropNavA').on('click.dropNavA', '.' + dropNavClass + '>li>a', function (event) { | 
|                 dropdown.hideAll(); | 
|                 $(this).parentsUntil('.' + dropdownClass).last().parent().removeClass(openClass); | 
|                 event.stopPropagation(); | 
|             }); | 
|         }, | 
|         // 关闭所有 | 
|         hideAll: function () { | 
|             $('.' + dropdownClass).removeClass(openClass); | 
|             // 隐藏分离式菜单 | 
|             $('.' + dropNavClass + '.' + fixedClass).addClass('layui-hide');  // 隐藏分离式菜单 | 
|             $('.' + shadeClass).remove();  // 移除遮罩层 | 
|             $('body').removeClass(noScrollClass);  // 移除禁止页面滚动 | 
|             $('.dropdown-fix-parent').removeClass('dropdown-fix-parent'); | 
|             $('[data-dropdown]').removeClass(openClass); | 
|         }, | 
|         // 展开非分离式下拉菜单 | 
|         show: function ($dropNav) { | 
|             if ($dropNav && $dropNav.length > 0 && !$dropNav.hasClass(disableClass)) { | 
|                 if ($dropNav.hasClass('dropdown-popconfirm')) { | 
|                     $dropNav.removeClass(animClass); | 
|                     $dropNav.addClass(popAnimClass); | 
|                 } else { | 
|                     $dropNav.removeClass(popAnimClass); | 
|                     $dropNav.addClass(animClass); | 
|                 } | 
|                 var position;  // 获取位置 | 
|                 for (var i = 0; i < dropDirect.length; i++) { | 
|                     if ($dropNav.hasClass('dropdown-' + dropDirect[i])) { | 
|                         position = dropDirect[i]; | 
|                         break; | 
|                     } | 
|                 } | 
|                 if (!position) {  // 没有设置位置添加默认位置 | 
|                     $dropNav.addClass('dropdown-' + dropDirect[0]); | 
|                     position = dropDirect[0]; | 
|                 } | 
|                 dropdown.forCenter($dropNav, position); | 
|                 $dropNav.parent('.' + dropdownClass).addClass(openClass); | 
|                 return position; | 
|             } | 
|             return false; | 
|         }, | 
|         // 展开分离式菜单 | 
|         showFixed: function ($trigger) { | 
|             var $dropNav = $($trigger.data('dropdown')), position; | 
|             if (!$dropNav.hasClass('layui-hide')) { | 
|                 dropdown.hideAll();  // 已经展开则隐藏 | 
|                 return; | 
|             } | 
|             dropdown.hideAll();  // 已经展开则隐藏 | 
|             position = dropdown.show($dropNav);  // 获取弹出位置 | 
|             if (position) { | 
|                 $dropNav.addClass(fixedClass);  // 设置为固定定位 | 
|                 $dropNav.removeClass('layui-hide');  // 显示下拉菜单 | 
|                 var topLeft = dropdown.getTopLeft($trigger, $dropNav, position);  // 计算坐标 | 
|                 topLeft = dropdown.checkPosition($dropNav, $trigger, position, topLeft); // 是否溢出屏幕 | 
|                 $dropNav.css(topLeft);  // 设置坐标 | 
|                 $('body').addClass(noScrollClass); // 禁止页面滚动 | 
|                 var hideShade = ($trigger.attr('no-shade') == 'true');  // 是否隐藏遮罩层 | 
|                 $('body').append('<div class="' + (hideShade ? (shadeClass + ' ' + noShadeClass) : shadeClass) + ' layui-anim layui-anim-fadein"></div>');  // 添加遮罩层 | 
|                 // 重置父元素z-index | 
|                 $trigger.parentsUntil('body').each(function () { | 
|                     var zIndex = $(this).css('z-index'); | 
|                     if (/[0-9]+/.test(zIndex)) { | 
|                         $(this).addClass('dropdown-fix-parent'); | 
|                     } | 
|                 }); | 
|                 $trigger.addClass(openClass); | 
|             } | 
|         }, | 
|         // 解决绝对定位因动画导致平移失效 | 
|         forCenter: function ($dropNav, position) { | 
|             if (!$dropNav.hasClass(fixedClass)) { | 
|                 var wTrigger = $dropNav.parent().outerWidth(), hTrigger = $dropNav.parent().outerHeight(); | 
|                 var wDrop = $dropNav.outerWidth(), hDrop = $dropNav.outerHeight(); | 
|                 var pParts = position.split('-'), dropSide = pParts[0], dropPosition = pParts[1];  // 显示方向 | 
|                 if ((dropSide == 'top' || dropSide == 'bottom') && dropPosition == 'center') { | 
|                     $dropNav.css('left', (wTrigger - wDrop) / 2); | 
|                 } | 
|                 if ((dropSide == 'left' || dropSide == 'right') && dropPosition == 'center') { | 
|                     $dropNav.css('top', (hTrigger - hDrop) / 2); | 
|                 } | 
|             } | 
|         }, | 
|         // 计算固定定位坐标 | 
|         getTopLeft: function ($trigger, $dropdown, position) { | 
|             var widthTrigger = $trigger.outerWidth(); | 
|             var heightTrigger = $trigger.outerHeight(); | 
|             var widthDropdown = $dropdown.outerWidth(); | 
|             var heightDropdown = $dropdown.outerHeight(); | 
|             var topTrigger = $trigger.offset().top - $(document).scrollTop(); | 
|             var leftTrigger = $trigger.offset().left; | 
|             var rightTrigger = leftTrigger + widthTrigger; | 
|             var top = 0, left = 0; | 
|             var positionParts = position.split('-'); | 
|             var anchorSide = positionParts[0];  // 箭头位置 | 
|             var anchorPosition = positionParts[1];  // 箭头方向 | 
|             if (anchorSide == 'top' || anchorSide == 'bottom') { | 
|                 heightDropdown += 8; // 加上margin距离 | 
|                 switch (anchorPosition) { | 
|                     case 'left': | 
|                         left = leftTrigger; | 
|                         break; | 
|                     case 'center': | 
|                         left = leftTrigger - widthDropdown / 2 + widthTrigger / 2; | 
|                         break; | 
|                     case 'right': | 
|                         left = rightTrigger - widthDropdown; | 
|                 } | 
|             } | 
|             if (anchorSide == 'left' || anchorSide == 'right') { | 
|                 widthDropdown += 8;  // 加上margin距离 | 
|                 switch (anchorPosition) { | 
|                     case 'top': | 
|                         top = topTrigger + heightTrigger - heightDropdown; | 
|                         break; | 
|                     case 'center': | 
|                         top = topTrigger - heightDropdown / 2 + heightTrigger / 2; | 
|                         break; | 
|                     case 'bottom': | 
|                         top = topTrigger; | 
|                 } | 
|             } | 
|             switch (anchorSide) { | 
|                 case 'top': | 
|                     top = topTrigger - heightDropdown; | 
|                     break; | 
|                 case 'right': | 
|                     left = leftTrigger + widthTrigger; | 
|                     break; | 
|                 case 'bottom': | 
|                     top = topTrigger + heightTrigger; | 
|                     break; | 
|                 case 'left': | 
|                     left = leftTrigger - widthDropdown; | 
|             } | 
|             return {top: top, left: left, right: 'auto', bottom: 'auto'}; | 
|         }, | 
|         // 检查是否溢出屏幕 | 
|         checkPosition: function ($dropNav, $trigger, position, topLeft) { | 
|             var aps = position.split('-'); | 
|             if ('bottom' == aps[0]) { | 
|                 if ((topLeft.top + $dropNav.outerHeight()) > dropdown.getPageHeight()) { | 
|                     topLeft = dropdown.getTopLeft($trigger, $dropNav, 'top-' + aps[1]); | 
|                     $dropNav.removeClass('dropdown-' + position); | 
|                     $dropNav.addClass('dropdown-top-' + aps[1]); | 
|                 } | 
|             } else if ('top' == aps[0]) { | 
|                 if (topLeft.top < 0) { | 
|                     topLeft = dropdown.getTopLeft($trigger, $dropNav, 'bottom-' + aps[1]); | 
|                     $dropNav.removeClass('dropdown-' + position); | 
|                     $dropNav.addClass('dropdown-bottom-' + aps[1]); | 
|                 } | 
|             } | 
|             return topLeft; | 
|         }, | 
|         // 获取浏览器高度 | 
|         getPageHeight: function () { | 
|             return document.documentElement.clientHeight || document.body.clientHeight; | 
|         }, | 
|         // 获取浏览器宽度 | 
|         getPageWidth: function () { | 
|             return document.documentElement.clientWidth || document.body.clientWidth; | 
|         } | 
|     }; | 
|   | 
|     dropdown.init(); | 
|     exports('dropdown', dropdown); | 
| }); |