Problem
What I’m trying to do is to change the background color when a link is clicked (in this case a list item). When it is no longer clicked, it should revert back to its normal color.
I was able to get this to work via the jQuery addClass
and removeClass
methods, but this seems to be hardcoding it.
$(document).ready(function() {
$(".nav > li:first-child").click(function(){
$(this).addClass("highlighted");
$(".nav > li:nth-child(2), .nav > li:nth-child(3), .nav > li:last-child").removeClass("highlighted");
});
$(".nav > li:nth-child(2)").click(function(){
$(this).addClass("highlighted");
$(".nav > li:first-child, .nav > li:nth-child(3), .nav > li:last-child").removeClass("highlighted");
});
$(".nav > li:nth-child(3)").click(function(){
$(this).addClass("highlighted");
$(".nav > li:first-child, .nav > li:nth-child(2), .nav > li:last-child").removeClass("highlighted");
});
$(".nav > li:last-child").click(function(){
$(this).addClass("highlighted");
$(".nav > li:first-child, .nav > li:nth-child(2), .nav > li:nth-child(3)").removeClass("highlighted");
});
});
Solution
The opening and closing tags don’t match in your JSFiddle.
It’s not a good idea to use presentational like highlighted
for a CSS class name. It would be better to use current
or selected
, and let the stylesheet decide how to indicate which item is currently selected — whether by highlighting, underlining, or whatever visual hint it chooses.
It would be a lot simpler if you removed the highlighted
class from all items, then added it back for just the selected item.
$(document).ready(function() {
$(".nav > li").click(function() {
$(".nav > li").removeClass('current');
$(this).addClass('current');
});
});
* {
margin: 0px;
padding: 0px;
}
nav {
background-color: #e4801c;
height: 100%;
}
.nav > li {
text-align: center;
text-transform: uppercase;
}
.current {
background: #faaf5e;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
<nav class="navbar navbar-default" role="navigation">
<ul class="nav navbar-nav">
<li>Clients</li>
<li>Services</li>
<li>Add</li>
<li>Time</li>
</ul>
</nav>
In addition, I suggest using text-transform: uppercase
to make the text all caps, as that is also a presentation style choice.
I know this isn’t doing it “in javascript”, but you seriously should take advantage of all native code that you possibly can —
Just do this in CSS.
Make them all links, and add a class, such as
a.mylink:active { font-style: bold }
Instead of having one handler for each element, you can have one for all, that first removes the class on any of the elements that has it, than adds it on the right element:
$(document).ready(function() {
$(".nav > li").click(function(){
$(".nav > li.highlighted").removeClass("highlighted");
$(this).addClass("highlighted");
});
});