【问题标题】:jQuery expanding menu bugjQuery扩展菜单错误
【发布时间】:2011-01-07 14:30:27
【问题描述】:

我编写了一个导航菜单,其中包含嵌套的下拉菜单 - 我编写了菜单以在悬停时向下滑动,效果很好。

但是,还有一个“显示全部”链接,单击该链接会展开所有子菜单并将新类应用于容器以填充菜单。

单击可以很好地扩展菜单,但是再次单击会改变外观,因为它应该通过删除类来改变外观,就好像它再次触发了该功能一样。我的代码如下 - 任何帮助将不胜感激!安迪

// == 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);
});

编辑:扩展菜单,将链接悬停,然后返回并单击“显示所有”链接确实会恢复菜单 - 但是单击“显示全部”链接一次以再次展开以缩小而不导航似乎重新触发函数

【问题讨论】:

    标签: jquery navigation toggle jquery-animate


    【解决方案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 上看到这一切。

    如果需要,我可以详细说明这个答案并把它分成几部分。如果有人对如何改进有任何建议或想法,我会全力以赴。

    【讨论】:

    • @tbwcf,如果您可以将jsFiddle 上的测试用例与您的代码放在一起,这将有很大帮助。我仍然建议您为此使用 jQuery 插件。
    • 谢谢 Marcus,我在 jsFiddle 上放了一个模型:jsfiddle.net/tbwcf/EKLJx - 任何进一步的帮助将不胜感激 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-01
    相关资源
    最近更新 更多