@gpyshenko

Как правильно инвертировать event?

Хочу сделать чтобы по кнопке фильтра, например если нажал на "Спорт" то все блоки отличающиеся от блоков с классом "isSport" были скрыты. Я конечно могу написать фильтр по другому, но код длинный, но если сделать исключение по классу то код как я понял будет короче и лаконичнее)) Очень прошу помочь.
P.S HTML написан с помощью Pug.
.filters
  .filter.filterSport Спорт
  .filter.filterFood Еда
  .filter.filterWears Одежда
.wrapper
  .link.isSport
  .link.isSport
  .link.isSport
  .link.isFood
  .link.isFood
  .link.isFood
  .link.isWears
  .link.isWears
  .link.isWears

var filterSport = document.querySelector('.filterSport'),
    filterFood = document.querySelector('.filterFood'),
    filterWears = document.querySelector('.filterWears'),
    isSport = document.querySelectorAll('.isSport'),
    isFood = document.querySelectorAll('.isFood'),
    isWears = document.querySelectorAll('.isWears');

filterSport.onclick = function() {
  [].forEach.call(isSport, function(e) {
    if(e.target !== isSport) {
      e.classList.add('hide')
    }
		
	});
	// [].forEach.call(isWears, function(e) {
	// 	e.classList.add('hide')
	// });
}
  • Вопрос задан
  • 236 просмотров
Решения вопроса 2
evgeniy8705
@evgeniy8705
Повелитель вселенной
// Что то типа этого
const links = document.querySelectorAll(`.link`);

filterSport.addEventListener(`click`, () => {
  for (let link of links) {
    if (!link.classList.contains(`isSport`)) {
      link.style.display = `none`;
    }
  }
}, false);
Ответ написан
delphinpro
@delphinpro Куратор тега JavaScript
frontend developer
https://codepen.io/delphinpro/pen/oweQqg?editors=1010

<div class="filters">
  <button class="filter" data-filter="isSport">Sport</button>
  <button class="filter" data-filter="isFood">Food</button>
  <button class="filter" data-filter="isWears">Wears</button>
</div>
<div class="wrapper">
  <div class="link link_visible isSport">SPORT</div>
  <div class="link link_visible isSport">SPORT</div>
  <div class="link link_visible isSport">SPORT</div>
  <div class="link link_visible isFood">FOOD</div>
  <div class="link link_visible isFood">FOOD</div>
  <div class="link link_visible isFood">FOOD</div>
  <div class="link link_visible isWears">WEARS</div>
  <div class="link link_visible isWears">WEARS</div>
  <div class="link link_visible isWears">WEARS</div>
</div>

let filters = document.querySelector('.filters');
let filterButtons = filters.querySelectorAll('.filter');
let wrapper = document.querySelector('.wrapper');
let links = wrapper.querySelectorAll('.link');

filters.addEventListener('click', e => {
  if (e.target.dataset.filter) {

    if (e.target.classList.contains('filter_active')) {
      
      e.target.classList.remove('filter_active');
      links.forEach(item => item.classList.add('link_visible'));
    
    } else {
    
      filterButtons.forEach(btn => btn.classList.remove('filter_active'));
      e.target.classList.add('filter_active');

      links.forEach(item => {
        item.classList.toggle(
          'link_visible',
          item.classList.contains(e.target.dataset.filter)
        );
      });

    }
  }
});
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
movasyl
@movasyl
semper tiro
reactjs, а особенно vuejs + pug сделают тебе такую ​​магию, что и не снилось.
П.С: Если ужо используешь pug, то используй миксы, объекты данных и циклы, а не копипаст тегов.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы