nickola105
@nickola105
начинающий

Как распространить событие и на дочерние элементы?

Ребятушки, всем привет!

Есть такой обработчик
[].slice.call( document.querySelectorAll( '#multi-select' ) ).forEach( function(el) {
                    var dropdownList = el.querySelector('.dropdown-list');
                    
                    var dropdownBtn = el.querySelector('.dropdown-trigger');
                    function toggle() {
                        dropdownList.classList.toggle('open');
                    }
                    function remove() {
                      dropdownList.classList.remove('open');
                    }       
                    document.addEventListener('click', function (e) {
                        const target = e.target;
                        console.log(target);
                        target === dropdownBtn ? toggle() : target !== dropdownList ? remove() : false;
                    })
                } );

верстка
div.search-user__item#multi-select
                            label Язык
                            div.dropdown-trigger
                                span Не указано
                            ul.dropdown-list
                                li.dropdown-item
                                    input(type="checkbox" class="checkbox" id="English")
                                    label(for="English") English
                                li.dropdown-item
                                    input(type="checkbox" class="checkbox" id="rusian")
                                    label(for="rusian") Русский
                                li.dropdown-item
                                    input(type="checkbox" class="checkbox" id="chinese")
                                    label(for="chinese") 中國
                                li.dropdown-item
                                    input(type="checkbox" class="checkbox" id="spanish")
                                    label(for="spanish") español
                                li.dropdown-item
                                    input(type="checkbox" class="checkbox" id="italian")
                                    label(for="italian") italiano


условие target !== dropdownList ? remove() срабатывает только частично, оно не распространяется на вложенные элементы .dropdown-item. Это нормально? Как это исправить? Не перебирать же все вложенные элементы для этого?
  • Вопрос задан
  • 1095 просмотров
Решения вопроса 2
События в js всплывают а не тонут.
Могу предложить только симулировать событие.
Ответ написан
@Anatoly_Rodin
Frontend-developer at online-express.ru
Почитайте про делегирование событий: https://learn.javascript.ru/event-delegation
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@kulaeff
Front-end developer
Можно вместо условия

target !== dropdownList

попробовать

!target.contains(dropdownList) || !target.contains(dropdownItem)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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