Reputation: 1252
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
<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");
};
});
});
Upvotes: 1
Views: 2994
Reputation: 7380
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);
});
});
Upvotes: 1
Reputation: 12347
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");
}
});
});
Upvotes: 0
Reputation: 1252
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");
};
});
});
Upvotes: 1
Reputation: 1425
<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
Upvotes: 1
Reputation: 5134
Instead of explicitly showing and hiding your ul
s, 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/
Upvotes: 1