Открытие меню по клику (jQuery)

Есть вот такой исходный код одного jQuery-модуля, который открывает меню при наведении:

var selfActive = false;

function mm_doMenu(){
    var windowWidth = $(window).width();
    if( windowWidth <= 768) {
        $("ul.mm > li.hover").unbind('mouseenter mouseleave');
        mm_mobWidthSubmenu();
        mm_click();
    } else {
        $( "ul.mm > li.hover").unbind( "click" );
        mm_hover();
        mm_baseWidthSubmenu();
    }
}

function setSmmBody(psmmf, smmf) {
    var windowWidth = $(window).width();
    if( windowWidth <= 768) {

    } else {
        if( psmmf && smmf.length > 0) {
            $( '#mm-smm-body', psmmf).html(smmf.get(0).outerHTML);
            $( '#mm-smm-body', psmmf).children('.mm-submenu-menu').show();
            $( '#mm-smm-body', psmmf).find('.mm-submenu-menu > .content').show();

            $('.mm-submenu-menu li').unbind('mouseenter');
            $('.mm-submenu-menu li').mouseenter(function(){
                var imageData = $(this).attr('data-image');
                var imageLink = $(this).attr('data-link');
                var imageCounter = $(this).attr('data-counter');
                if( typeof imageData !== typeof undefined && imageData !== false && imageData !== '') {
                    var attr = $(this).attr('name');
                    if (typeof attr !== typeof undefined && attr !== false) {
                        $("#mm-banner img#mmi-c" + imageCounter, $(this).closest('.mm-submenu-menu')).attr("data-src", imageData);
                    } else {
                        $("#mm-banner img#mmi-c" + imageCounter, $(this).closest('.mm-submenu-menu')).attr("src", imageData);
                    }
                }
                if( typeof imageLink !== typeof undefined && imageLink !== false && imageLink !== '') {
                    $("#mm-banner a#mma-c" + imageCounter, $(this).closest('.mm-submenu-menu')).attr("href", imageLink);
                }
            });
        }
    }

}

function mm_showSubmenu(self) {
    var submenu_menu_class = '';
    if( typeof $(self).children(".mm-submenu").prop("tagName") !== typeof undefined) {
        submenu_menu_class = '.mm-submenu';
        setSmmBody( $(self).children(submenu_menu_class), $(self).find(".mm-submenu-menu:first"));
    }
    else if( typeof $(self).children(".mm-submenu-menu").prop("tagName") !== typeof undefined)
        submenu_menu_class = '.mm-submenu-menu';
    else
        return;

    selfActive = $(self);
    var animationType = $(self).closest(".mm").data("animationtype");
    var animationTime = $(self).closest(".mm").data("animationtime");

    var ulMmLi = $("li");
    ulMmLi.removeClass("active");
    ulMmLi.children(submenu_menu_class).hide();
    ulMmLi.find( submenu_menu_class + " > .content").hide();

    if( submenu_menu_class !== '.mm-submenu-menu') {
        $(self).addClass("active");
        $(self).children(submenu_menu_class).show();
        if (animationType == 1) {
            $(self).find(submenu_menu_class + " > .content").show();
            $(self).find(submenu_menu_class + " > .content").css("height", "auto");
            var contentHeight = $(self).find(".mm-submenu > .content").height();
            $(self).find(submenu_menu_class + " > .content").css("height", 0);
            $(self).find(submenu_menu_class + " > .content").stop(true, true).animate({height: contentHeight}, animationTime);
        } else if (animationType == 2) {
            $(self).find(submenu_menu_class + " > .content").fadeIn(animationTime);
        } else {
            $(self).find(submenu_menu_class + " > .content").show();
        }
    } else {
        $(self).addClass("active");
        var smmf = $(self).find(".mm-submenu-menu");
        if( smmf ) {
            var pssmf = smmf.closest('.mm-submenu');
            setSmmBody( pssmf, smmf);
        }
    }

    $(self).children(submenu_menu_class).css("right", "auto");
    var submenu = $(self).children(submenu_menu_class);
    if( submenu ) {
        var submenuSub = $(submenu).closest('ul.mm');
        if ($("html").css("direction").toLowerCase() == "rtl") {
            if (submenu.offset().left < submenuSub.offset().left) {
                $(self).children(submenu_menu_class).css("right", "0");
            }
        } else {
            var submenuEnding = ($(window).width() - (submenu.offset().left + submenu.outerWidth()));
            var submenuSubEnding = ($(window).width() - (submenuSub.offset().left + submenuSub.outerWidth()));
            if (submenuSubEnding > submenuEnding) {
                $(self).children(submenu_menu_class).css("right", "0");
            }
        }
    }
}

function mm_baseWidthSubmenu() {
    $('.vertical .mm-submenu').each(function(){
        var submenuwidth = $(this).data("submenuwidth");
        if( submenuwidth){
            var fullWidth = $('.container').width() - $('.vertical').width();
            var calcWidth = (fullWidth * submenuwidth) / 100;
            $(this).css( 'width', calcWidth + 'px');
        }
    });
}

function mm_mobWidthSubmenu() {
    $('.vertical .mm-submenu').each(function(){
        $(this).css('width','100%');
    });
}

function mm_doAnimation(self, active) {
    var submenu_menu_class = '';
    if( typeof $(self).children(".mm-submenu").prop("tagName") !== typeof undefined) {
        submenu_menu_class = '.mm-submenu';
    }
//    else if( typeof $(self).children(".mm-submenu-menu").prop("tagName") !== typeof undefined)
//        submenu_menu_class = '.mm-submenu-menu';
    else
        return;

    var animationType = $(self).closest(".mm").data("animationtype");
    var animationTime = $(self).closest(".mm").data("animationtime");
    if(animationType == 1) {
        $(self)
            .find(submenu_menu_class + " > .content")
            .stop(true, true)
            .animate(
                { height:"hide" },
                animationTime,
                function() {
                    $(active).removeClass("active");
                    $(active).children(submenu_menu_class).hide();
                });
    } else if(animationType == 2) {
        $(active).removeClass("active");
        $(self).find(submenu_menu_class + " > .content").fadeOut(animationTime, function() {
            $(active).children(submenu_menu_class).hide();
        });
    } else {
        $(self).removeClass("active");
        $(self).children(submenu_menu_class).hide();
        $(self).find(submenu_menu_class + " > .content").hide();
    }
}

function submenuLoadContent( self, fncCallback = function(){}) {
    let mmid = $(self).data('mmid');
    if( mmid ) {
        $(self).children('.mm-submenu').load("index.php?route=extension/module/oc_megamenu/submenuIndex&mmid=" + mmid, function() {
            $(this).children('.content').show();
            doEvents();
            mm_doMenu();
            if( $(self).hasClass( "active" ) ){
                setSmmBody( $(self).children( '.mm-submenu'), $(self).find(".mm-submenu-menu:first"));
            }
            fncCallback();
        });
        $(self).removeData('mmid');
        $(self).removeAttr('data-mmid');
    } else {
        fncCallback();
    }
}

function activateRowMenu( row) {
    submenuLoadContent(row);
    mm_showSubmenu(row);
}
function deactivateRowMenu( row) {
    var rel = $(row).attr("title");
    if( rel == 'hover-intent') {
        setTimeout(function (){
            mm_doAnimation(row, row);
        }, 500);
    } else {
        mm_doAnimation(row, selfActive);
    }
}

function mm_hover() {
    var menus = $(".mm");
    for( let m = 0; m < menus.length; ++m) {
        let menu = $(menus[m]);
        menu.menuAim({
            activate: activateRowMenu,
            deactivate: deactivateRowMenu,
            exitMenu: function(row){ return true; },
        });
    }
}

function mm_click(){
    $("ul.mm > li.hover").off('click');
    $("ul.mm > li.hover").click(function () {
        if($(this).find(".content").is(':visible')) { return true; }
        submenuLoadContent(this);
        mm_showSubmenu(this);
    });
}

function setDefaultBannerImage() {
    var submenus = $(  'div .mm-submenu');
    if(  submenus) {
        for( var i = 0; i < submenus.length; ++i ) {
            var banners = $( 'div#mm-banner', submenus[i]);
            if( banners.length < 2) continue;
            for( var b = 0; b < banners.length; ++b) {
                var parentTag = $(banners[b]).parent();
                if( parentTag) {
                    var allLinks =  $( 'li', parentTag);
                    if( allLinks.length > 0) {
                        var firstLink = allLinks[0];
                        var imageData = $(firstLink).attr('data-image');
                        var imageLink = $(firstLink).attr('data-link');
                        var imageCounter = $(firstLink).attr('data-counter');
                        $("a#mma-c" + imageCounter, banners[b]).attr("href", imageLink);;
                        $("img#mmi-c" + imageCounter, banners[b]).attr("data-src", imageData);
                        $("img#mmi-c" + imageCounter, banners[b]).attr("src", imageData);
                    }
                }
            }
        }
    }
}

function showPopover() {

    var pp = $('[data-toggle="mm-stiker"]').popover();
    pp.popover('show');

    $('.popover').each(function() {
        var currentTop = parseInt($(this).css('top'));
        $(this).css({
            top: (currentTop + 6) + 'px',
            left: '12px'
        });
    });

    $('.popover .arrow').each(function() {
        $(this).css({
            left: '15px'
        });
    });

    $('[data-toggle="mm-stiker"]').each(function() {
        var idPopover = $(this).attr('aria-describedby');
        var stikerColor = $(this).attr('data-stiker-color');
        var stikerFontColor = $(this).attr('data-stiker-fontcolor');
        var stikerType = $(this).attr('data-stiker-type');
        var stikerKind = $(this).attr('data-stiker-kind');

        if(stikerType==1)
            $(this).popover('hide');

        var borderRadius = '7px';
        if(stikerKind==1)
            borderRadius = '0';

        $('#'+idPopover).css({
            'background-color': stikerColor,
            'border': '1px solid ' +  stikerColor,
            //'box-shadow': '0 3px 5px ' + stikerColor,
            'color': stikerFontColor,
            'border-radius': borderRadius
        });
        $('#'+idPopover+'.top > .arrow').css({
            'border-top-color': stikerColor
        });
    });

    /*
    $('[data-toggle="mm-stiker"]').on('shown.bs.popover', function () {
        var currentTop = parseInt($(this).parent().css('top'));
        $(this).next().css({
            top: (currentTop) + 'px',
            left: '12px'
        });

    });
     */
}

function doEvents() {
    $(window).resize(function() {
        mm_doMenu();
    });

    $('#clickModalDlg').off('show.bs.modal');
    $('#clickModalDlg').on('show.bs.modal', function (event) {
        mm_doMenu();
        mm_showSubmenu( $(this).find('#mmd-clickmodal'));

        $('.popover').popover('hide');

        $("#mmd-clickmodal ul.mm > li").click(function () {
            return false;
        });
    });

    $('#clickModalDlg').off('hide.bs.modal');
    $('#clickModalDlg').on('hide.bs.modal', function (event) {
        showPopover();
    });

    $("ul.mm > li.click-modal").off('click');
    $("ul.mm > li.click-modal").click(function () {
        let self = this;
        submenuLoadContent( this, function () {
            const tmms = $(self).find('.mm-submenu');
            $('#mmd-clickmodal').html(tmms.get(0).outerHTML);
            $('#clickModalDlg').modal('show');
        });
        return false;
    });

    $('.mm-submenu li').unbind('mouseenter');
    $('.mm-submenu li').mouseenter(function(){
        var imageData = $(this).attr('data-image');
        var imageLink = $(this).attr('data-link');
        var imageCounter = $(this).attr('data-counter');
        if( typeof imageData !== typeof undefined && imageData !== false && imageData !== '') {
            var attr = $(this).attr('name');
            if (typeof attr !== typeof undefined && attr !== false) {
                $("#mm-banner img#mmi-c" + imageCounter, $(this).closest('.mm-submenu')).attr("data-src", imageData);
            } else {
                $("#mm-banner img#mmi-c" + imageCounter, $(this).closest('.mm-submenu')).attr("src", imageData);
            }
        }
        if( typeof imageLink !== typeof undefined && imageLink !== false && imageLink !== '') {
            $("#mm-banner a#mma-c" + imageCounter, $(this).closest('.mm-submenu')).attr("href", imageLink);
        }
    });

    $("ul.mm li .mm-submenu .content .mm-submenu-hover ul li").off('hover');
    $("ul.mm li .mm-submenu .content .mm-submenu-hover ul li").hover(
        function () {
            $(this).children("ul").show();
        },
        function () {
            $(this).children("ul").hide();
        });

    $("ul.mm > li.click").off('click');
    $("ul.mm > li.click").click(function () {
        if($(this).find(".content").is(':visible')) { return false; }
        mm_showSubmenu(this);
        return false;
    });

    $(".mm-navbar #mmb-horizontal-show").off('click');
    $(".mm-navbar #mmb-horizontal-show").click(function () {
        if($('.mm-wrapper').hasClass('mm-megamenu-active'))
            $('.mm-wrapper').removeClass('mm-megamenu-active');
        else
            $('.mm-wrapper').addClass('mm-megamenu-active');
    });
    $('.mm-navbar #mm-remove-horizontal').off('click');
    $('.mm-navbar #mm-remove-horizontal').click(function() {
        $('.mm-wrapper').removeClass('mm-megamenu-active');
        return false;
    });

    $(".mm-navbar #mmb-vertical-show").off('click');
    $(".mm-navbar #mmb-vertical-show").click(function () {
        if($('.mm-wrapper-vertical').hasClass('mm-vertical-active'))
            $('.mm-wrapper-vertical').removeClass('mm-vertical-active');
        else
            $('.mm-wrapper-vertical').addClass('mm-vertical-active');
    });
    $('.mm-navbar #mm-remove-vertical').off('click');
    $('.mm-navbar #mm-remove-vertical').click(function() {
        $('.mm-wrapper-vertical').removeClass('mm-vertical-active');
        return false;
    });

    $('html').off('click');
    $('html').on('click', function () {
        $("ul.mm > li.click").removeClass("active");
        $("ul.mm > li.click").children(".mm-submenu").hide();
        $("ul.mm > li.click").find(".content").hide();
    });
    $('.mm-close').off('click');
    $('.mm-close').on('click', function () {
        if( $(this).parent().find(".content").is(':visible')) {
            $(this).parent().removeClass("active");
            $(this).parent().children(".mm-submenu").hide();
            $(this).parent().find(".content").hide();
        } else {
            const smmf = $(this).parent().find( '.mm-submenu-menu');
            if( smmf) {
                $(smmf).parent().addClass("active");
                $(smmf).show();
                $(smmf).children(".content").show();
            }
        }
        return false;
    });
}

$(document).ready(function() {

    doEvents();
    setDefaultBannerImage();
    mm_doMenu();

    showPopover();

    var dd = $('.mm-dynamic-data');
    for( var n = 0; n < dd.length; ++n) {
        var dynamicData = dd[n];
        var menubar_orientation = $(dynamicData).data('menubar_orientation');

        if (menubar_orientation == 1) {
            var menubar_vertical_item_count = $(dynamicData).data('menubar_vertical_item_count');
            var text_more_category = $(dynamicData).data('text_more_category');
            var text_close_category = $(dynamicData).data('text_close_category');
            var menubar_uuid = $(dynamicData).data('menubar_uuid');

            if (menubar_vertical_item_count <= $( '#' + menubar_uuid + ' .mm-vertical ul.mm >li').length)
                $( '#' + menubar_uuid + ' .mm-vertical ul.mm').append('<li class="mm-loadmore" data-menubar_uuid=' + menubar_uuid + ' data-menubar_vertical_item_count=' + menubar_vertical_item_count + '><i class="fa fa-plus-square-o"></i><span class="mm-viewmore">' + text_more_category + '</span></li>');
            $( '#' + menubar_uuid + ' .mm-horizontal ul.mm li.mm-loadmore').remove();

            menubar_vertical_item_count = menubar_vertical_item_count - 1;

            $( '#' + menubar_uuid + ' ul.mm > li.mm-vertical-item').each(function (i) {
                if (i > menubar_vertical_item_count) {
                    $(this).css('display', 'none');
                }
            });

            $('#' + menubar_uuid + ' ul.mm .mm-loadmore').click(function () {
                var local_vic = $(this).data('menubar_vertical_item_count');
                local_vic = local_vic - 1;
                var local_uuid = $(this).data('menubar_uuid');
                if( $(this).hasClass('open')) {
                    $( '#' + local_uuid + ' ul.mm li.mm-vertical-item').each( function( i) {
                        if( i > local_vic) {

                            $(this).slideUp(200);
                            $(this).css('display', 'none');
                        }
                    });
                    $(this).removeClass('open');
                    $( '#' + local_uuid + ' .mm-loadmore').html('<i class="fa fa-plus-square-o"></i><span class="mm-viewmore">' + text_more_category + '</span>');
                } else {
                    $( '#' + local_uuid + ' ul.mm li.mm-vertical-item').each( function( i) {
                        if (i > local_vic) {
                            $(this).slideDown(200);
                        }
                    });
                    $(this).addClass('open');
                    $( '#' + local_uuid + ' .mm-loadmore').html('<i class="fa fa-minus-square-o"></i><span class="mm-viewmore">' + text_close_category + '</span>');
                }
            });
        }

        $('a[href="' + window.location.href + '"]').each(function () {
            $(this).parents('.mm-submenu-exist').addClass('sub-active');
        });
    }
});

Уже пару дней не могу сделать так, чтобы все элементы появлялись и исчезали по клику. Код реализован на сайте https://dev.mebel-ts.com.ua/ua/ в меню "Каталог товаров"

Буду благодарен за помощь, т.к. скоро дедлайн


Ответы (0 шт):