Проблемы с addClass в jQuery

#jquery #ruby-on-rails #addclass

#jquery #ruby-on-rails #addclass

Вопрос:

У меня проблемы с селекторами в jQuery. Или (что я не думаю) с моим кодом jQuery.

Позвольте мне рассказать о моей проблеме. У меня есть проект Rails, и я хочу вставить в свое меню класс «active», если текущая страница в меню такая же.

Например:

Текущая страница: Публикует мое меню:

  • Страницы (класс: отсутствует)
  • Пользователи (класс: нет)
  • Сообщения (класс: «активный»)
  • Блаблабла …

Мой HTML-код / Rails / jQuery (если вы разработчик Rails, это мой макет):

Меню:

 <ul id="nav">
  <li id="dashboard"><%= link_to "Dashboard", admin_index_path %></li>
  <li id="notes"><%= link_to "Notes", admin_notes_path %>
   <ul>
    <li><a href="#">List notes</a></li>
    <li><a href="#">Add note</a></li>
   </ul>
  </li>
  <li id="projects"><a href="#">Projects</a>
   <ul>
    <li><a href="#">List projects</a></li>
    <li><a href="#">Add project</a></li>
   </ul>
  </li>
  <li id="users"><a href="#">Users</a></li>
</ul>
  

Скрипт:

 <script>
 $("#hld #wrapper #header #nav li").addClass(function() {
   var addedClass;

   if ($(this).attr('id') === "<%= content_for(:title).downcase %>") {
    return "active";
   }

   return addedClass;
 });
</script>

<!--[if IE]><script type="text/javascript" src="/assets/excanvas.js"></script><![endif]-->  
<script type="text/javascript" src="/assets/jquery.js"></script>
<script type="text/javascript" src="/assets/jquery.img.preload.js"></script>
<script type="text/javascript" src="/assets/jquery.filestyle.mini.js"></script>
<script type="text/javascript" src="/assets/jquery.wysiwyg.js"></script>
<script type="text/javascript" src="/assets/jquery.date_input.pack.js"></script>
<script type="text/javascript" src="/assets/facebox.js"></script>
<script type="text/javascript" src="/assets/jquery.visualize.js"></script>
<script type="text/javascript" src="/assets/jquery.visualize.tooltip.js"></script>
<script type="text/javascript" src="/assets/jquery.select_skin.js"></script>
<script type="text/javascript" src="/assets/jquery.tablesorter.min.js"></script>
<script type="text/javascript" src="/assets/ajaxupload.js"></script>
<script type="text/javascript" src="/assets/jquery.pngfix.js"></script>
<script type="text/javascript" src="/assets/custom.js"></script>
  

Найдите скрипт, и там, конечно, будет мой скрипт на jQuery.
Итак, в чем проблема?

Спасибо за помощь, я пытался быть понятным. Лукас Морейра.

Комментарии:

1. Можете ли вы показать нам фактически сгенерированную страницу, чтобы мы могли видеть реальный javascript, а не страницу Rails перед обработкой. Например, я понятия не имею, во что это на самом деле превращается: "<%= content_for(:title).downcase %>" .

2. Кроме того, есть ли какая-либо причина, по которой вы используете: #hld #wrapper #header #nav li вместо просто #nav li в качестве селектора. Идентификаторы уникальны на странице, поэтому вам не нужно использовать несколько идентификаторов в селекторе для назначения одного.

3. Я сделал то, что вы сказали (изменил ‘#hld #wrapper #header #nav li’ на ‘#nav li’) и все еще не работает.

4. Кроме того, когда я захожу на сайт, я просматриваю исходный код: ‘<script> $(«#nav li»).addClass(function() { var addedClass; if ($(this).attr(‘id’) === «dashboard») { возвращает «active»; } возвращает addedClass; }); </script>’

5. Как вы можете видеть из этого jsFiddle, концепция работает, если ваш код выполняет то, что вы пытаетесь сделать: jsfiddle.net/jfriend00/jwg3S . Не видя вашей функционирующей веб-страницы, я не уверен, что мы действительно можем рассказать вам больше о том, что не так.

Ответ №1:

Как указал Jfriend00, ваш селектор излишне длинный. '#nav li' будет достаточно.
А еще лучше, поскольку вы только (предположительно) ищете прямого потомка для использования #nav '#nav > li' .

Также (кто-нибудь, пожалуйста, поправьте меня, если я ошибаюсь), но я думаю, что ваш скрипт должен идти ниже, где вы загружаете внешние скрипты. Попытка использовать jQuery до его загрузки может вызвать проблемы 😉

Комментарии:

1. Боже мой. хахаха, проблема заключалась в том, что я запускал код перед загрузкой jQuery. Еще раз спасибо за все!