/** 下拉菜单模块 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);  
 | 
});  
 |