Прямо сейчас этот jquery работает отлично:
:javascript
$( "#catExpander1" ).click(function() {
$( "#category1" ).toggle( "fast", function() {
});
});
Но, конечно, у него есть большая проблема: его нельзя использовать повторно, чтобы показать/скрыть другие div. Как заменить жестко кодированные идентификаторы на переменные?
Для контекста:
В настоящее время я использую это в приложении rails для отображения/скрытия подкатегорий под их родительской категорией, которые находятся внутри списка навигации по категории боковой панели. Единственный способ, который я могу сейчас сделать, - создать отдельный блок jquery для каждой категории и подкатегории, но, конечно, это ужасный подход, потому что он требует много повторения, не может использоваться повторно и т.д.
Если вы хотите быть умным, используйте одну из многих существующих библиотек для разворачивания. У 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" );
});
Вы можете добавить общий класс css во все категории, например, в category
и использовать делегирование событий:
$( "#catExpander1" ).on('click', '.category', function() {
$(this).toggle('fast')
});
Я предлагаю использовать атрибут данных HTML. Например, для каждого расширителя добавьте атрибут data, который ссылается на идентификатор для расширения.
Предполагая, что расширитель - это изображение.
<img src="..." data-target="category1" class="expander" />
Затем в вашем коде
$(".expander").click(function() {
$("#" + $(this).data("target")).toggle( "fast", function() {
});
});
".#category1"
- довольно испорченный селектор, я не могу поверить, что он сейчас что-то делает для вас.