@lagudal

Как на чистом js закрыть элемент по клику вне его?

Есть скрипт, ниже пен, по клику на кнопку - lg-hotspot__button - добавляет класс lg-hotspot--selected к элементу lg-hotspot, таким образом делает видимым элемент lg-hotspot__label.
Как сделать, чтобы класс этот - lg-hotspot--selected - удалялся также если кликнуть на пустое место, кроме элемента lg-hotspot__label, когда он он видим?
На jquery знаю как, но тут весь скрипт на чистом js написан, вот что то не могу сообразить, как сделать на чистом js.
  • Вопрос задан
  • 366 просмотров
Решения вопроса 2
Kozack
@Kozack Куратор тега JavaScript
Thinking about a11y
Вот вам общий принцип для всех подобных задач:
  1. При открытии элемента — повесить обработчик на body
  2. Внутри обработчика проверить, был ли клик внутри элемента
  3. Если нет — скрыть элемент, удалить обработчик.
Ответ написан
Комментировать
0xD34F
@0xD34F Куратор тега JavaScript
const containerSelector = '.lg-container';
const itemSelector = `${containerSelector} .lg-hotspot`;
const buttonSelector = `${itemSelector} .lg-hotspot__button`;
const activeClass = 'lg-hotspot--selected';

document.addEventListener('click', ({ target: t }) => {
  const button = t.closest(buttonSelector);
  const item = t.closest(itemSelector);

  if (button) {
    item.closest(containerSelector).querySelectorAll(itemSelector).forEach(n => {
      n.classList[n === item ? 'toggle' : 'remove'](activeClass);
    });
  } else if (!item?.classList.contains(activeClass)) {
    document.querySelectorAll(itemSelector).forEach(n => {
      n.classList.remove(activeClass);
    });
  }
});

Если не должно быть так, что одновременно могут быть видимы всплывающие окна в разных контейнерах, тогда item.closest(containerSelector) надо заменить на document.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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