Ошибка расширения меню jQuery - PullRequest
1 голос
/ 07 января 2011

Я закодировал навигационное меню, в котором есть вложенные выпадающие списки - я закодировал меню, чтобы скользить вниз при наведении, и это нормально работает.

Однако есть также ссылка «показать все», которая, когдаclicked расширяет все подменю и применяет новый класс к контейнеру, чтобы дополнить меню.

Нажатие расширяет меню, но затем повторное нажатие во второй раз изменяет внешний вид на доли секунды, удаляякласс как если бы он снова вызывал функцию.Мой код ниже - любая помощь будет принята с благодарностью!Andy

// == MENU SHOW ALL TOGGLE
// show pointer
$('#menu li#show-all').hover(function(){
    $(this).css({'cursor' : 'pointer'});
});
$('#menu-container').addClass('show-single');

function toggleheight(){
    if ($('#menu-container').hasClass('show-single')) {
        $('#menu li').not('#show-all').fadeOut(function(){

            $('#menu').animate({
                height : '300px'
            }, function(){
                $('#menu-container').removeClass('show-single').addClass('show-all');
                $('#menu li').not('#show-all').fadeIn();
            });
        });
    }else {
        $('#menu li').not('#show-all').fadeOut(function(){
            $('#menu-container').removeClass('show-all').addClass('show-single');
            $('#menu').animate({
                height : '16px'
            }, function(){
                $('#menu li').not('#show-all').fadeIn();
            });

        });
    }
}

$('#menu li#show-all').click(function(){
        $(toggleheight);
});

РЕДАКТИРОВАТЬ: расширение меню, наведение ссылки, затем возврат назад и щелчок по ссылке «показать все» действительно возвращают меню, как и должно быть - однако, если щелкнуть ссылку «показать все» один раз, чтобы развернуть ещепохоже, что повторная активация функций

1 Ответ

1 голос
/ 07 января 2011

Я решил не копаться в вашем коде и попытаться исправить его, потому что я думаю, что есть гораздо лучший подход к созданию навигационных меню с простым плагином jQuery.Тем не менее, это не поможет вам решить вашу проблему с помощью кода, но, надеюсь, вы все равно найдете это полезным.

Итак, вот что я придумал.

HTML:

<ul class="nav-menu">
    <li>
        <a href="#">Menu 1</a>
        <ul>
            <li><a href="#">Submenu 1</a></li>
            <li><a href="#">Submenu 2</a>
                <ul>
                    <li><a href="#">Subsubmenu 1</a></li>
                    <li><a href="#">Subsubmenu 2</a></li>
                    <li><a href="#">Subsubmenu 3</a></li>
                    <li><a href="#">Subsubmenu 4</a></li>
                </ul>
            </li>
            <li><a href="#">Submenu 3</a></li>
            <li><a href="#">Submenu 4</a></li>
        </ul>
    </li>
    <li>
        <a href="#">Menu 2</a>
        <ul>
            <li><a href="#">Submenu 1</a></li>
            <li><a href="#">Submenu 2</a></li>
            <li><a href="#">Submenu 3</a></li>
            <li><a href="#">Submenu 4</a></li>
        </ul>
    </li>
</ul>

Код плагина:

(function($){

    function traverseItems($items) {
        $items.each(function(){
            var $item = $(this),
                $submenu = $item.children("ul").hide();
            if ($submenu.length) {
                $item.children("a").click(function(){
                    $submenu.toggle();
                    return false;
                }).append(" \>");
                traverseItems($submenu.children("li"));
            }
        });
    }

    $.fn.navMenu = function (options){
        var defaults = {
            showAllToggle: true
        };
        options = $.extend({}, defaults, options);

        return this.each(function(){
            var $this = $(this)
                    .addClass("nav-menu"),
                $items = $this.children("li");

            traverseItems($items);

            if (options.showAllToggle) {
                $showAll = $("<a></a>")
                    .attr("href", "#")
                    .addClass("show-all")
                    .text("Toggle all")
                    .toggle(function(){
                        $this.find("ul").show();
                        return false;
                    }, function(){
                        $this.find("ul").hide();
                        return false;
                    })
                    .wrap("<li></li>")
                    .parent()
                    .prependTo($this);
            }
        });
    };

})(jQuery);

Использование:

$(function(){
    $(".nav-menu").navMenu();
});

ВыЯ могу видеть все это в действии на jsFiddle .

Я могу развить этот ответ и разрезать его на куски, если потребуется.Если у кого-то есть какие-либо предложения или идеи о том, как это можно улучшить, я весь в ушах.

...