Задать вопрос
@prokopn

Как применить js код к своему блоку?

Есть 2 фильтра на странице, подскажите как сделать так что-бы фильтрация применялась только к своему блоку?
  • Вопрос задан
  • 216 просмотров
Подписаться 2 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
  • Академия Эдюсон
    Fullstack-разработчик на JavaScript + ИИ
    11 месяцев
    Далее
  • ProductStar × РБК
    Профессия: Инженер по тестированию
    6 месяцев
    Далее
Решения вопроса 2
@historydev Куратор тега JavaScript
Рефакторинг на тебе.
Ответ написан
Комментировать
0xD34F
@0xD34F Куратор тега JavaScript
Куда кликаем и что фильтруем:

// такого у вас сейчас нет, сами догадайтесь, кому надо класс добавить
const containerSelector = '.container';

const buttonsSelector = `${containerSelector} .filter__navigation`;
const buttonSelector = `${buttonsSelector} > [data-filter]`;
const buttonActiveClass = '_active';

const itemsSelector = `${containerSelector} .search__body`;
const itemClass = 'filter-column';
const itemHiddenClass = '_hide';
const getItemActiveClass = ({ dataset: { filter } }) =>
  filter === 'all' ? itemClass : `filter__column_${filter}`;

Назначаем обработчик клика каждой кнопке индивидуально:

document.querySelectorAll(buttonSelector).forEach(function(n) {
  n.addEventListener('click', this);
}, function({ currentTarget: { parentNode: t } }) {
  const activeItemSelector = `.${getItemActiveClass(this)}`;

  t.querySelector(`.${buttonActiveClass}`)?.classList.remove(buttonActiveClass);
  this.classList.add(buttonActiveClass);

  while (!(t = t.parentNode).matches(containerSelector)) ;
  NodeList.prototype.forEach.call(t.querySelector(itemsSelector).children, n => {
    n.classList[n.matches(activeItemSelector) ? 'remove' : 'add'](itemHiddenClass);
  });
});

Или, применяем делегирование:

document.addEventListener('click', ({ target: t }) => {
  if (t = t.closest(buttonSelector)) {
    const activeItemClass = getItemActiveClass(t);

    for (const n of t.closest(buttonsSelector).querySelectorAll(buttonSelector)) {
      n.classList.toggle(buttonActiveClass, n === t);
    }

    for (const n of t.closest(containerSelector).getElementsByClassName(itemClass)) {
      n.classList.toggle(itemHiddenClass, !n.classList.contains(activeItemClass));
    }
  }
});
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы