Question

I have the following menu - it works ok. I have it working that when clicking on a list item it drops down. When clicking on another list item, the old one closes and the clicked one opens. However - when clicking on a list item that is already open (to close it). It closes and then re-opens again. How can I get it to just close and not re-open again. Please see jsfiddle and code below. Thanks

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");


});

});

EDIT Thanks for all the input

Got it working with the following - I used a condition submitted by someone that answered the question first off but now can't find their answer - I just tweaked it a little but heres the jsfiddle: link - all works great now - Thanks :)

New 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");       
    };  
});

});
Was it helpful?

Solution 3

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/

OTHER TIPS

Instead of explicitly showing and hiding your uls, you can toggle them like this:

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

EDIT

When you want only one menu open at any one time, add the following line before toggling:

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

See http://jsfiddle.net/D3edP/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');
                }
            });

        });

use the above code

Update answer

Check here , DEMO 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);
    });
});

All right simply change your click listener: I have updated your fiddle here

$(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");
        }       
    });

});
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top