jQuery扩展菜单错误

时间:2011-01-07 14:30:27

标签: jquery navigation toggle jquery-animate

我编写了一个导航菜单,里面有嵌套的下拉菜单 - 我编写了菜单,在悬停时向下滑动,并且工作正常。

然而,还有一个'show all'链接,当点击它时会扩展所有子菜单并将新类应用于容器以填充菜单。

单击会轻松展开菜单,但是再次单击会通过删除类来改变外观,因为它会再次触发该功能。我的代码如下 - 任何帮助将不胜感激!安迪

// == 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);
});
编辑:扩展菜单,悬停链接然后向后移动并单击show all链接确实还原菜单 - 但是点击“全部显示”链接一次再展开以缩小而不导航似乎重新触发功能

1 个答案:

答案 0 :(得分:1)

我决定不深入研究您的代码并尝试修复它,因为我认为使用简单的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上看到这一切。

我可以详细说明这个答案,并根据要求将其剪切成碎片。如果有人对如何改进这方面有任何建议或想法,我会全力以赴。