Reputation: 6752
In my menu, I want to show only ul
-s which are active. Meaning if I click a different link, the previously active element should be hidden. In my example below, if Item-1
is active and I click on Item-2
, the Item-1
should be hidden.
$(document).ready(function () {
$('#main-menu').on('click', function (event) {
$(event.target).parent().children('ul').toggleClass('hidden');
$(event.target).parent().children('ul').addClass('is_open');
$('#main-menu').toggleClass('is_closed');
if ($(event.target).parent().children().length <= 1) {
$('#main-menu .is_open').toggleClass('hidden');
$('#main-menu ul').removeClass('is_open');
$('#main-menu').addClass('is_closed');
}
});
});
.sm ul {
display: block;
}
.sm .hidden {
display: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<ul id="main-menu" class="sm sm-simple">
<li><a href="#">Item 1</a>
<ul class="hidden">
<li><a href="#">Item 1-1</a>
<ul class="hidden">
<li><a href="#">Item 1-1-1</a></li>
<li><a href="#">Item 1-1-2</a></li>
<li><a href="#">Item 1-1-3</a></li>
</ul>
</li>
<li><a href="#">Item 1-2</a></li>
<li><a href="#">Item 1-3</a></li>
</ul>
</li>
<li><a href="#">Item 2</a>
<ul class="hidden">
<li><a href="#">Item 2-1</a>
<ul class="hidden">
<li><a href="#">Item 2-1-1</a></li>
<li><a href="#">Item 2-1-2</a></li>
<li><a href="#">Item 2-1-3</a></li>
</ul>
</li>
<li><a href="#">Item 2-2</a></li>
<li><a href="#">Item 2-3</a></li>
</ul>
</li>
<li><a href="#">Item 3</a>
<ul class="hidden">
<li><a href="#">Item 3-1</a>
<ul class="hidden">
<li><a href="#">Item 3-1-1</a></li>
<li><a href="#">Item 3-1-2</a></li>
<li><a href="#">Item 3-1-3</a></li>
</ul>
</li>
<li><a href="#">Item 3-2</a></li>
<li><a href="#">Item 3-3</a></li>
</ul>
</li>
</ul>
Upvotes: 2
Views: 2891
Reputation: 122077
You can just toggle $(this)
and hide siblings DEMO
$('#main-menu > li > a').click(function() {
$(this).next('.hidden').toggle();
$('#main-menu > li > a').not($(this)).next('.hidden').hide();
})
You can alsotoggleClass
DEMO
$('#main-menu > li > a').click(function() {
$(this).next('.hidden').toggleClass('active');
$('#main-menu > li > a').not($(this)).next('.hidden').removeClass('active');
})
For nested ul
inside li
you can do this DEMO
$('ul li a').click(function() {
$(this).next('.hidden').slideToggle();
$(this).parent().siblings().find('ul').slideUp();
})
Upvotes: 1
Reputation: 6264
Changes made
Added the below piece of code to hide all the ul
$('ul').addClass('hidden');
For optimisation purpose I used
$('#main-menu .is_open').toggleClass('hidden is_open is_closed');
$(event.target).parent().children('ul').toggleClass('hidden is_open');
Working Demo
$(document).ready(function () {
$('#main-menu').on('click', function (event) {
$('ul').addClass('hidden');
$(event.target).parent().children('ul').toggleClass('hidden is_open');
$('#main-menu').toggleClass('is_closed');
if ($(event.target).parent().children().length <= 1) {
$('#main-menu .is_open').toggleClass('hidden is_open is_closed');
}
});
});
.sm ul {
display: block;
}
.sm .hidden {
display: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<ul id="main-menu" class="sm sm-simple">
<li><a href="#">Item 1</a>
<ul class="hidden">
<li><a href="#">Item 1-1</a>
<ul class="hidden">
<li><a href="#">Item 1-1-1</a></li>
<li><a href="#">Item 1-1-2</a></li>
<li><a href="#">Item 1-1-3</a></li>
</ul>
</li>
<li><a href="#">Item 1-2</a></li>
<li><a href="#">Item 1-3</a></li>
</ul>
</li>
<li><a href="#">Item 2</a>
<ul class="hidden">
<li><a href="#">Item 2-1</a>
<ul class="hidden">
<li><a href="#">Item 2-1-1</a></li>
<li><a href="#">Item 2-1-2</a></li>
<li><a href="#">Item 2-1-3</a></li>
</ul>
</li>
<li><a href="#">Item 2-2</a></li>
<li><a href="#">Item 2-3</a></li>
</ul>
</li>
<li><a href="#">Item 3</a>
<ul class="hidden">
<li><a href="#">Item 3-1</a>
<ul class="hidden">
<li><a href="#">Item 3-1-1</a></li>
<li><a href="#">Item 3-1-2</a></li>
<li><a href="#">Item 3-1-3</a></li>
</ul>
</li>
<li><a href="#">Item 3-2</a></li>
<li><a href="#">Item 3-3</a></li>
</ul>
</li>
</ul>
Upvotes: 2