1

我有以下菜单 - 它工作正常。我让它在单击列表项时会下拉。单击另一个列表项时,旧的会关闭,而单击的会打开。但是 - 单击已打开的列表项时(关闭它)。它关闭然后重新打开。我怎样才能让它关闭而不重新打开。请参阅下面的 jsfiddle 和代码。谢谢

http://jsfiddle.net/Bx5cu/15/

<nav id="global_nav">
   <ul class="no-js">
     <li><a href="#">ABOUT US</a>
     <ul>
        <li><a href="#">About Us</a></li>
     </ul>
     </li>
     <li><a href="#">PRODUCTS</a>
     <ul>
        <li><a href="#">Products</a></li>
        <li><a href="#">Tractor</a></li>
        <li><a href="#">Organic</a></li>
    </ul>
    </li>
  </ul>
</nav>

JS

$(document).ready(function(){
$('#global_nav > ul').toggleClass('no-js js');

var menuList = $("#global_nav").find(".js").find("li");
menuList.find("ul").hide();
menuList.on("click", function(){

menuList.removeClass("selected");
menuList.find("ul").slideUp(400);
$(this).find("ul").slideDown(400);
$(this).addClass("selected");


});

});

编辑 感谢所有输入

得到它与以下工作 - 我使用了一个人提交的条件,该人首先回答了这个问题,但现在找不到他们的答案 - 我只是稍微调整了一下,但继承了 jsfiddle:链接- 现在一切都很好 - 谢谢:)

新JS

$(document).ready(function(){
$('#global_nav > ul').toggleClass('no-js js');

var menuList = $(".js").find("li");
menuList.find("ul").hide();
menuList.on("click", function(){
    menuList.find("ul").slideUp(400);
    if (!($(this).find("ul").is(":visible"))) {
        menuList.removeClass("selected");
        $(this).find("ul").slideDown(400);
        $(this).addClass("selected");       
    };  
});

});
4

5 回答 5

1

Here's the JS that worked after some tweaking and valid input:

$(document).ready(function(){
$('#global_nav > ul').toggleClass('no-js js');

var menuList = $(".js").find("li");
menuList.find("ul").hide();
menuList.on("click", function(){
menuList.find("ul").slideUp(400);
if (!($(this).find("ul").is(":visible"))) {
    menuList.removeClass("selected");
    $(this).find("ul").slideDown(400);
    $(this).addClass("selected");       
};  
});

});

http://jsfiddle.net/Bx5cu/25/

于 2013-07-26T11:21:46.700 回答
1

您可以像这样切换它们,而不是显式显示和隐藏您ul的 s:

$(this).find("ul").slideToggle(400);
$(this).toggleClass("selected");

编辑

如果您希望一次只打开一个菜单,请在切换之前添加以下行:

menuList.find("ul").slideUp(400);

http://jsfiddle.net/D3edP/1/

于 2013-07-26T10:42:14.270 回答
1

更新答案

在这里查看,演示http://jsfiddle.net/yeyene/Bx5cu/29/

$(document).ready(function () {
    $('li ul').slideUp();

    $('.no-js li a').on("click", function () {
        $('ul ul').slideUp(400);
        if($(this).siblings('ul').is(":visible"))
            $(this).siblings('ul').slideUp(400);
        else
            $(this).siblings('ul').slideDown(400);
    });
});
于 2013-07-26T10:46:49.413 回答
1
        <script type="text/javascript">
        $(function () {

            var menu_ul = $('.no-js" > li > ul'),
                   menu_a = $('.no-js" > li > a');

            menu_ul.hide();

            menu_a.click(function (e) {
                e.preventDefault();
                if (!$(this).hasClass('active')) {
                    menu_a.removeClass('active');
                    menu_ul.filter(':visible').slideUp('normal');
                    $(this).addClass('active').next().stop(true, true).slideDown('normal');
                } else {
                    $(this).removeClass('active');
                    $(this).next().stop(true, true).slideUp('normal');
                }
            });

        });

使用上面的代码

于 2013-07-26T10:46:34.067 回答
0

好吧,只需更改您的点击侦听器:我在这里更新了您的小提琴

$(document).ready(function(){
    $('#global_nav > ul').toggleClass('no-js js');

    var menuList = $(".js").find("li");
    menuList.find("ul").hide();
    menuList.on("click", function(){

        menuList.find("ul").slideUp(400);
        if(!$(this).is(".selected")){
                console.log("ok");
                $(this).find("ul").slideDown(400);
                menuList.removeClass("selected");// <-- simply add this to fix the issue
                $(this).addClass("selected");
        }else{
                menuList.removeClass("selected");
        }       
    });

});
于 2013-07-26T11:06:24.207 回答