Добавить класс ко всем элементам с определенным классом
Я немного новичок в javascript и jquery, и у меня есть некоторые проблемы, делающие то, что я хочу, "красивым" способом.
У меня есть веб-страница HTML, например:
<div class="list-group">
<a href="#all" id="category-all" class="list-group-item active">All</a>
<a href="#" id="category-0" class="list-group-item">Foo</a>
<a href="#" id="category-1" class="list-group-item">Bar</a>
<a href="#" id="category-2" class="list-group-item">FooBar</a>
</div>
<div class="row">
<div class="category-0">element 1</div>
<div class="category-1">element 1</div>
<div class="category-1">element 1</div>
<div class="category-0">element 1</div>
<div class="category-2">element 1</div>
<div class="category-0">element 1</div>
<div class="category-2">element 1</div>
</div>
Я хотел бы добавить какой-то "фильтр", где, если вы нажмете ссылку на определенную категорию, все элементы из других категорий исчезнут.
Мне удалось сделать это, добавив класс в мой css под названием invis с "display: none", а затем написал следующее:
$( ".list-group-item" ).click(function() {
$(".list-group-item").removeClass('active');
$( this ).toggleClass("active");
var test = "." + event.target.id;
$(".category-0").addClass('invis');
$(".category-1").addClass('invis');
$(".category-2").addClass('invis');
if (test == ".category-0")
$(".category-0").removeClass('invis');
if (test == ".category-1")
$(".category-1").removeClass('invis');
if (test == ".category-2")
$(".category-2").removeClass('invis');
if (test == ".category-all") {
$(".category-0").removeClass('invis');
$(".category-1").removeClass('invis');
$(".category-2").removeClass('invis');
}
});
Это делает эту работу, но я бы хотел найти "более чистый" способ сделать это. Как я могу улучшить его?
Спасибо!
Ответы
Ответ 1
Один из способов сделать это с помощью jQuery - это скрыть все <div>
при щелчке элемента управления фильтром, а затем отобразить те, которые вы хотите показать.
Таким образом вам не понадобится ваш дополнительный класс invis
.
вы заметите символ "^ =" в приведенном ниже коде, это просто селектор, который буквально означает "начинается с".
$('a[id^="category"]').click(function() {
// when an <a> element is click THAT has an ID that starts with "category" ...
$('div[class^="category"]').hide();
// hide every <div> that ID starts with "category" ...
$('div.' + this.id).show();
// re-show every <div> that CLASS matches the original <a> ID ...
});
$('a[id="show-all"]').click(function() {
// if the "all" is clicked, show them ALL again.
$('div[class^="category"]').show();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="list-group">
<a href="#all" id="show-all" class="list-group-item active">All</a>
<a href="#" id="category-0" class="list-group-item">Foo</a>
<a href="#" id="category-1" class="list-group-item">Bar</a>
<a href="#" id="category-2" class="list-group-item">FooBar</a>
</div>
<div class="row">
<div class="category-0">Foo</div>
<div class="category-1">Bar</div>
<div class="category-1">Bar</div>
<div class="category-0">Foo</div>
<div class="category-2">FooBar</div>
<div class="category-0">Foo</div>
<div class="category-2">FooBar</div>
</div>
Ответ 2
Скрыть все элементы с классом "строка", а затем скрыть все элементы с классом [id того, что было нажато] в классе "строка".
$('.list-group-item').click(function(event) {
$('.row').addClass('invis');
$('.row.' + event.target.id).removeClass('invis');
});
Ответ 3
Просто добавив ко всем вашим категориям .category-all
, вы сделали половину работы.
Теперь вы можете легко управлять отношениями id
→ > class
.
jsBin demo
Если вам нужно, чтобы по крайней мере одна категория была видна достаточно просто:
var $btns = $(".list-group-item");
var $ctgs = $("[class^='category-']");
$ctgs.addClass("category-all"); // Job done! :D :D
$btns.click(function(e) {
$ctgs.hide(); // Hide all
$("."+this.id).show(); // Show realated
});
В противном случае, приведенный ниже код позволит вам получить любую комбинацию, которую вы желаете,
И даже скрыть/переключить активные:
jsBin demo
var $btns = $(".list-group-item");
var $ctgs = $("[class^='category-']");
$ctgs.addClass("category-all"); // Job done! :D :D
$btns.click(function(e) {
$ctgs.not("."+this.id).hide(); // Hide all (not this...)
$("."+this.id).toggle( $(this).hasClass("active") ); // Toggle realated
});
Ответ 4
Отказ от ответственности: не проверен.
$('.list-group-item').click(function() {
$('.list-group-item').removeClass('active');
$(this).addClass('active');
var id = $(this).attr('id');
if(id == 'category-all') {
$('div.row > div').show();
} else {
$('div.row > div.' + id).show();
$('div.row > div:not(.' + id + ')').hide();
}
});
Ответ 5
Здесь другая версия. Добавлена цветовая кодировка для видимости.
* Редактировать обновление, чтобы иметь правильное поведение.
http://codepen.io/anon/pen/NPrGJp
$( ".list-group-item" ).click(function() {
$('.active').removeClass('active');
$(this).addClass('active');
$('.row > div').show();
$('.' + $(this).attr('id')).hide();
});