2014-01-09 5 views
0

В принципе, я пытаюсь добавить класс active в текущий пункт меню. Мне удалось использовать следующий код jQuery.Сохранить элемент меню после нажатия ссылки на текущей странице

jQuery(document).ready(function($){ 
     var path = window.location.href; 
     $('#nav-main li a').each(function() { 
      if (this.href === path) { 
       $(this).addClass('active'); 
      } 
     }); 
    }); 

Моя навигационная панель выглядит следующим образом:

<ul id="nav-main"> 
     <li> 
      <a href="/">Home</a> 
     </li> 
     <li> 
      <a href="/brands">Brands</a> 
     </li> 
     <li> 
      <a href="/users">Users</a> 
     </li> 
     <li> 
      <a href="/employees">Employees</a> 
     </li> 
    </ul> 

Который имеет следующий CSS:

ul#nav-main { 
     width: 1050px; 
     margin: 0 auto; 
     color: #fff; 
    } 
    ul#nav-main li { 
     margin: 0 5px 0 5px; 
     list-style-type: none; 
     text-align: center; 
     display: inline-block; 
     font-size: 17px; 
    } 
    ul#nav-main li a { 
     padding: 0 15px; 
     line-height: 2.692307692; 
     display: inline-block; 
     text-decoration: none; 
     color: #fff; 
    } 
    ul#nav-main li a:hover { 
     background-color: rgba(0, 0, 0, 0.3); 
    } 
    ul#nav-main li a.active { 
     background-color: rgba(0, 0, 0, 0.3); 
    } 

Теперь, когда я нажимаю на 'Пользователи' Я хожу в /users и JQuery код успешно добавляет класс active, так что «Пользователи» отображается как текущий пункт меню на панели навигации. Однако, когда я нажимаю ссылку на странице «Пользователи», которая приводит, например, к /users/view/12345 (в которой 12345 - это идентификатор пользователя), страница «Пользователи» больше не отображается в качестве текущего элемента меню.

Я думаю, что это связано с тем, что код jQuery выглядит только nav-main li a, а не другим a на странице. Есть ли что-то, что я могу добавить к моему коду jQuery, чтобы сделать эту работу?

+0

Я думаю, что это зависит от этого 'if (this.href === path)' Когда вы находитесь в '/ users/view/12345', больше нет идентификатора. Но я честен, я не совсем уверен, javascript это не мое лучшее. Не ждите, конечно, ваш код работает, только если вы нажмете ссылку в 'nav-main li'. Вы определили jquery, действуя таким образом. – maurelio79

+0

Я пытался придумать и найти обходное решение для обоих этих фактов, но не мог придумать или найти что-то, чтобы заставить его работать. – SomeCode

ответ

1

Попробуйте изменить

var path = window.location.href; 

к этому:

var path = "/" + window.location.pathname.split('/')[1]; 

pathname извлекает все после того, как (и в том числе) первый слэш. split будет разбивать строку на список строк на основе определенного разделителя ('/'), и мы собираемся выбрать элемент с индексом 1.

+0

Спасибо за ваш ответ! Но когда я изменяю его на то, что вы сказали, jQuery больше не добавляет класс 'active'. Кстати, будет ли ваш код работать, если сайт не находится в корневом каталоге, а в подкаталоге? – SomeCode

+0

Получаете ли вы какие-либо ошибки в консоли? Pathname будет извлекать все после домена, поэтому, например, если ваш сайт является 'http: // test.com/users/view/12345', то код, который я опубликовал, будет извлекать'/users'. Если ваш сайт вложен дальше, вам просто нужно указать правильный индекс в зависимости от количества подкаталогов, которые у вас есть. Например, если ваш сайт был на http: // test.com/mywebsite/something/users/view/12345', вы бы выбрали индекс из 3 вместо 1. – Goose

+0

Я не получаю никаких ошибок. Я изменил 1 на 3 и выяснил, что мне пришлось изменить ваш фрагмент кода: «var path =» http://domain.com/dir_one/dir_two/ »+ window.location.pathname.split ('/') [3]; '. Это решило проблему! Хотя он немного похож на хак, так как это нужно менять каждый раз, когда программное обеспечение, которое я пишу, используется на другом сервере в другом каталоге. – SomeCode

0

Попробуйте этот. Работал для меня. Найди его где-то в сети, но не помню источник.

var i = document.location.href.lastIndexOf("/"); 
var current = document.location.href.substr(i+1); 

    $("#nav-main a").removeClass('active'); 

    $("#nav-main a[href^='"+current+"']").each(function(){ 
     $(this).addClass('active'); 
    }); 
+0

Мне нравится идея, но она не работает в этом сценарии. Я сохраню код, чтобы использовать его, когда мне это нужно. Благодаря! – SomeCode

Смежные вопросы