3

I have the following code that should add an active css class to the menu item if menu item url == current url:

$("#accordion a").each(function() 
{   
    if (this.href.search(window.location.hostname) != -1)
    {
        $(this).addClass("active-sidebar-link");
    }
});

but this adds the class to all the menu items. any tips?

IntricatePixels
  • 1,219
  • 6
  • 29
  • 55
  • `window.location.hostname` would return you the page hostname i.e. `stackoverflow.com`. You should instead use `location.href` or `location.pathname` to get the correct match. – kayen May 15 '12 at 04:51

4 Answers4

12

Try this:

$("#accordion a").each(function() {   
    if (this.href == window.location.href) {
        $(this).addClass("active-sidebar-link");
    }
});
Ram
  • 143,282
  • 16
  • 168
  • 197
3
$('#accordion a[href="'+ window.location.hostname +'"]').addClass('active-sidebar-link');
The System Restart
  • 2,873
  • 19
  • 28
0

If you want to do this with jQuery, you can:

$("#accordion a").addClass(function(){
  return this.href === window.location 
    ? "active-sidebar-link" 
    : "" ;
});

However, there's a far better way to style current-page links. This generally involves given the body element a classname that corresponds to your links:

<body class="home">
   <a class="home" href="foo.html">Home</a>
   <a class="contact" href="bar.html">Contact</a>
</body>

In this case, you would select the active link styles like this:

body.home a.home,
body.contact a.contact {
  color: green;
}

This method doesn't require JavaScript to set the initial styles, which is always good.

Sampson
  • 265,109
  • 74
  • 539
  • 565
0

Use a filter function:

$("#accordion a")
.filter(function(){ 
    return location.href.match($(this).attr("href"))
})
.addClass("active-sidebar-link");

Returns only filtered elements, which in this case would be the link with the current URL and adds the class active-sidebar-link to it.

kayen
  • 4,838
  • 3
  • 19
  • 20