Переменная Ruby в блоке jquery show / hide

0

Прямо сейчас этот jquery работает отлично:

:javascript
    $( "#catExpander1" ).click(function() {
      $( "#category1" ).toggle( "fast", function() {
      });
    });

Но, конечно, у него есть большая проблема: его нельзя использовать повторно, чтобы показать/скрыть другие div. Как заменить жестко кодированные идентификаторы на переменные?

Для контекста:
В настоящее время я использую это в приложении rails для отображения/скрытия подкатегорий под их родительской категорией, которые находятся внутри списка навигации по категории боковой панели. Единственный способ, который я могу сейчас сделать, - создать отдельный блок jquery для каждой категории и подкатегории, но, конечно, это ужасный подход, потому что он требует много повторения, не может использоваться повторно и т.д.

  • 0
    Похоже, что вы можете сделать это, используя классы и функции обхода, но я думаю, что нам нужно посмотреть HTML, чтобы дать лучший ответ.
  • 0
    ".#category1" - довольно испорченный селектор, я не могу поверить, что он сейчас что-то делает для вас.
Показать ещё 1 комментарий

3 ответа

1
Лучший ответ

Если вы хотите быть умным, используйте одну из многих существующих библиотек для разворачивания. У Bootstrap есть хороший.

Если вы действительно хотите перевернуть свое собственное решение...

Как правило, вы связываете связанные узлы DOM вместе через href кнопки (при условии, что это ссылка) или data-. Важно, чтобы сам DOM передавал связь между элементами, как для семантической целостности вашего документа, так и потому, что это лучший способ выполнить это с минимальным количеством JavaScript.

Затем вы можете написать общий обработчик кликов, который знает, какой элемент отображать/скрывать на основе того, какой элемент был нажат.

Наконец, все ваши расширителя кнопок будет дан класс, как expandable, который вы бы затем использовать, чтобы связать все кнопки с одним $('.expandable').click вызов, или через один on вызов, если они динамически добавляется в DOM.

Результат будет выглядеть примерно так:

<a href="#category1" class="expandable">Expand Category 1!</a>
<div id="category1">
Item 1
Item 2
</div>

А также...

$(".expandable").click(function(e) {
  e.preventDefault();
  $($(this).attr('href')).toggle( "fast" );
});
1

Вы можете добавить общий класс css во все категории, например, в category и использовать делегирование событий:

$( "#catExpander1" ).on('click', '.category', function() {
  $(this).toggle('fast')
});
  • 0
    Это прекрасно работает. Награжден правильным ответом @meagar, однако, из-за его подробного объяснения. Ушел вперед и дал ваш голос.
1

Я предлагаю использовать атрибут данных HTML. Например, для каждого расширителя добавьте атрибут data, который ссылается на идентификатор для расширения.

Предполагая, что расширитель - это изображение.

<img src="..." data-target="category1" class="expander" />

Затем в вашем коде

$(".expander").click(function() {
  $("#" + $(this).data("target")).toggle( "fast", function() {
  });
});

Ещё вопросы

Сообщество Overcoder
Наверх
Меню