@Dimtri

Как при клике на li передать его добавочный класс родительскому диву?

Есть такая разметка
<div class="selectboxss">
  <div class="selectboxssvalue">
    <div class="selectboxssvalue-inner">
      Верхняя строчка
    </div>
  </div>
  <div class="selectboxssmenu-wrap" style="display: none;">
    <ul class="selectboxssmenu">
      <li class="selectoption act selectoption-1">
        1 пункт
      </li>
      <li class="selectoption  selectoption-2">
       2 пункт
      </li>
      <li class="selectoption  selectoption-3">
        3 пункт
      </li>
    </ul>
  </div>
</div>

Как при клике на li.selectoption взять его добавочный класс selectoption-1 или selectoption-2 или сколько угодно, в зависимости от кол-ва , и передать обертке с классом selectboxss? И, соответственно, удалять и добавлять классы у родителя при клике на другие .

PS. Скрипт, который допиливаю, написан на Jquery. Просто тега такого не нашлось.
  • Вопрос задан
  • 129 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
О каких элементах идёт речь, как получать из них классы, и как переключать классы у их предка:

const containerSelector = '.selectboxss';
const itemClass = 'selectoption';
const itemSelector = `${containerSelector} .${itemClass}`;

const getClasses = el => Array.prototype.filter.call(el.classList, n => n !== itemClass);
//const getClass = el => el.className.match(RegExp(`${itemClass}-\\d+`))[0];

function updateClasses(item) {
  const container = item.closest(containerSelector);
  const { classList: cl } = container;
  cl.remove(...Array.prototype.flatMap.call(container.querySelectorAll(itemSelector), getClasses));
  cl.add(...getClasses(item));
  //cl.remove(...Array.from(container.querySelectorAll(itemSelector), getClass));
  //cl.add(getClass(li));
}

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

document.querySelectorAll(itemSelector).forEach(function(n) {
  n.addEventListener('click', this);
}, e => updateClasses(e.currentTarget));

Или, можем применить делегирование:

document.addEventListener('click', e => {
  const item = e.target.closest(itemSelector);
  if (item) {
    updateClasses(item);
  }
});
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
gogowq
@gogowq
Ozh domosh acha ozh
const selectboxss = document.querySelector('.selectboxss');
const liElements = document.querySelectorAll('.selectboxssmenu li');
liElements.forEach(li => {
  li.addEventListener('click', () => {
    const additionalClass = li.classList[1];
    selectboxss.classList.remove(...selectboxss.classList);
    selectboxss.classList.add(additionalClass);
  });
});
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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