Как закрыть модальный при щелчке вне Javascript

#javascript #html #css

#javascript #HTML #css

Вопрос:

Я пытаюсь закрыть модальный при щелчке снаружи. Я пытался перебирать модалы, но не могу заставить их установить для его отображения значение none.

Вот мой HTML:

 <div class="projects">
            <div data-modal="modal1">
                <div>
                      <p>Coffee</p>
                </div>
                <img src="img/coffee.png" alt="">
            </div>
            <div data-modal="modal2">
                <div>
                       <p>Tea</p>
                </div>
                <img src="img/tea.png" alt="">
            </div>
      </div>

<div class="project-card" id="modal1">
            <button class="close">X</button>
        <div class="overlay">
            <img src="img/coffee.png" alt="">
        </div>
</div>
        
<div class="project-card" id="modal2">
            <button class="close">X</button>
        <div class="overlay">
            <img src="img/tea.png" alt="">
        </div>
</div>
 

Вот мой код для открытия модальных файлов.

 const coffeeGrounds = document.querySelectorAll('.projects > div[data-modal^=modal]');
for (var i = 0; i < coffeeGrounds.length; i  ) {
    coffeeGrounds[i].addEventListener('click', function () {
        var x = this.getAttribute('data-modal');
        var a = document.getElementById(x);
        a.setAttribute('style','display:block');
       
    });
}

 

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

 window.addEventListener('click',function(){
    
   for(var i = 0; i<coffeeGrounds.length; i  ){
         var x = coffeeGrounds[i].getAttribute('data-modal');
             var a = document.getElementById(x);
                console.log(a);
                if(a.style.display === 'block'){
                      a.setAttribute('style','display:none');
                 }
             }
        });
 

Здесь, установив для модального отображения значение none. Он также задерживается для отображения модального.

Пожалуйста, любая помощь будет оценена.

Codepen: https://codepen.io/zaidik/pen/bGwpzbE

Ответ №1:

Когда вы щелкаете за пределами модального окна, у вас не должно быть модального окна в массиве распространения событий

Другими словами, воспользуйтесь событием.свойство path

Рабочий пример (на основе предоставленной скрипки)

   window.addEventListener('click', function(e) {
  const allModals = document.querySelectorAll('.project-card');
  if (!e.path.some(x => x.className amp;amp; x.className.includes('project-card'))) {
    allModals.forEach(x => x.style.display = 'none');
  }
}, true)
 

Пример рабочей скрипки: https://jsfiddle.net/7pzs1042 /

Комментарии:

1. Можете ли вы применить это к моему примеру по какой-то причине я не могу получить доступ к path.find на событии

2. если вы создадите скрипку (пример демонстрации онлайн), тогда я мог бы взглянуть

3. большое вам спасибо. Вот codepen codepen.io/zaidik/pen/bGwpzbE

4. @ZaidKhan проверьте код еще раз, скопируйте и вставьте его в свой codepen, и он должен работать

5. Пока он работает, у меня с этим нет проблем. Но я обязательно рассмотрю это, если смогу заставить это работать по-другому. Еще раз большое спасибо.