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

Почему не срабатывает функция при нажатии?

Почему не срабатывает функция при нажатии .close?
Как сделать, чтобы при нажатии на .section срабатывала первая функция и при нажатии .close срабатывала вторая? Не меня при этом порядок элементов.
  • Вопрос задан
  • 68 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
Брехня, всё срабатывает.

Бегом гуглить, что такое всплытие событий.

Надо его останавливать:

const $section = $('.section').on('click', () => $section.addClass('opened'));
$section.find('.close').on('click', e => {
  e.stopPropagation();
  $section.removeClass('opened');
});

// или

const section = document.querySelector('.section');

section.addEventListener('click', () => section.classList.add('opened'));
section.querySelector('.close').addEventListener('click', e => (
  e.stopPropagation(),
  section.classList.remove('opened')
));

Или есть вариант ограничиться одним обработчиком, в котором проверять, откуда событие пришло:

const $section = $('section').click(e => {
  $section.toggleClass('opened', !$(e.target).is('.close'));
});

// или

document.querySelector('.section').addEventListener('click', e => {
  e.currentTarget.classList.toggle('opened', !e.target.matches('.close'));
});
Ответ написан
@MikUrrey
Не срабатывает потому, что клик "поднимается" до .section и его обработчик срабатывает тоже.
Нужно запретить всплывание события:

$('.close').on('click', function (e) {
  e.stopPropagation(); // вот так
  $('.section').removeClass('opened');
});


или stopImmediatePropagation, если в вашем случае первое не сработает
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
23 янв. 2025, в 17:23
200000 руб./за проект
23 янв. 2025, в 17:20
50000 руб./за проект
23 янв. 2025, в 17:12
10000 руб./за проект