DpOLEGapx
@DpOLEGapx
HTML-Верстальщик

Как при клике на элемент добавить ему класс, а у всех соседей удалить?

Как при клике удалять класс selected у соседей кликнутого элемента?
https://jsfiddle.net/9Lufhat3/163/

P.S JQ не предлагать, про .siblings() в курсе.
  • Вопрос задан
  • 2267 просмотров
Решения вопроса 4
0xD34F
@0xD34F Куратор тега JavaScript
Где элементы находятся, что за элементы, и какой класс будем им добавлять/убирать:

const container = document.querySelector('nav');
const itemSelector = '.sidebar-item';
const className = 'selected';

Вариант раз, делегируем обработку клика контейнеру. При клике ищем элемент с нужным классом, снимаем класс, устанавливать класс кликнутому:

container.addEventListener('click', function(e) {
  const item = e.target.closest(itemSelector);
  if (item) {
    const activeItem = this.querySelector(`.${className}`);
    if (activeItem) {
      activeItem.classList.remove(className);
    }

    item.classList.add(className);
  }
});

Вариант два, тоже с делегированием. Перебираем все элементы, переключаем класс в зависимости от того, является ли текущий элемент кликнутым:

container.addEventListener('click', e => {
  const item = e.target.closest(itemSelector);
  if (item) {
    for (const n of e.currentTarget.querySelectorAll(itemSelector)) {
      n.classList.toggle(className, n === item);
    }
  }
});

Вариант три, назначаем обработчик клика каждому элементу индивидуально, перебираем элементы аналогично предыдущему варианту:

const items = container.querySelectorAll(itemSelector);
const onClick = e => items.forEach(n => n.classList.toggle(className, n === e.currentTarget));
items.forEach(n => n.addEventListener('click', onClick));
Ответ написан
Комментировать
rockon404
@rockon404
Frontend Developer
Вариант без делегирования.
Ответ написан
Комментировать
coderisimo
@coderisimo Куратор тега JavaScript
по клику на кнопке
$('.sidebar-item').removeClass('selected');
$(this).addClass('selected');


БЕЗ jQ ваш код (идея та же):
var menuItems = document.getElementsByClassName("sidebar-item");
  for (var i = 0; i < menuItems.length; i++) {
            menuItems[i].addEventListener("click", function() { 
            var x = document.getElementsByClassName("sidebar-item");
            Array.prototype.forEach.call(x, function(el) {
            el.classList.remove("selected");
});
           this.classList.add('selected');
         });
  }
Ответ написан
Комментировать
bubandos
@bubandos
bash'у, javascript'ую, php'лю, css'аю, html'каю
Например так: https://jsfiddle.net/anton4ept/3gsgyxon/
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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