Reputation: 13
this is my html code with nesting li tags
<ul class="nav">
<li class="menu">
<ul class="sub_nav">
<li class="sub_menu"></li>
<li class="sub_menu"></li>
</ul>
</li>
<li class="menu">
<ul class="sub_nav">
<li class="sub_menu"></li>
<li class="sub_menu"></li>
</ul>
</li>
</ul>
how select only li tag with class menu and deselect children with class sub_menu
jQuery("li.menu :not('li.sub_menu')").click(function(
jQuery(this).toggleClass("active")
})
Upvotes: 1
Views: 74
Reputation: 5967
You can do something like this where you check if the item clicked is the selector element. If it isn't, you return false thereby stopping the event from bubbling up to the parent.
$("li.menu").click(function(event) {
if (event.target !== this) {
return false;
}
$(this).toggleClass("active");
});
li.menu.active {
color: red;
}
li.sub_menu {
color: initial;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul class="nav">
<li class="menu">
menu
<ul class="sub_nav">
<li class="sub_menu">submenu</li>
<li class="sub_menu">submenu</li>
</ul>
</li>
<li class="menu">
menu
<ul class="sub_nav">
<li class="sub_menu">submenu</li>
<li class="sub_menu">submenu</li>
</ul>
</li>
</ul>
Upvotes: 2
Reputation: 14031
I think you will have to define a default colour for the sub-menus via your CSS, like:
.menu, .sub_nav, .active .sub_nav{
color: #555;
}
And then apply the active class only to the direct child of .nav
.
That, and combining the JS code from @H77 (with targeting the click
event to the top-level li
) should do the trick.
See demo below:
$(function() {
$(".nav > li.menu").click(function() {
if (event.target !== this) {
return false;
}
$(this).toggleClass("active");
});
});
li.active.menu {
color: red;
}
.menu,
.sub_nav,
.active .sub_nav {
color: #555;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul class="nav">
<li class="menu">
menu
<ul class="sub_nav">
<li class="sub_menu">submenu</li>
<li class="sub_menu">submenu</li>
</ul>
</li>
<li class="menu">
menu
<ul class="sub_nav">
<li class="sub_menu">submenu</li>
<li class="sub_menu">submenu</li>
</ul>
</li>
</ul>
Upvotes: 1
Reputation: 199
A simple solution:
$(".nav > li").click(function(){
jQuery(this).toggleClass("active")
});
You will still be selecting the other li
nodes, but only as children of the parent li
, which I don't imagine is problematic.
Upvotes: 2