Как закрыть модальное окно, если пользователь кликнул на затемнённую область (оверлей)?

Здравствуйте, ребята! <br/> Извините за неудачную формулировку, я не знал, как лучше задать вопрос. <br/> <br/> У меня следующая ситуация: <br/> Я хотел бы реализовать выбор атрибута товара в модальном окне, которое уже имеется в теме. Я добавил необходимые теги на обертку в цикле, и всё работает отлично. Я обнаружил скрипт, который разделяет модальные окна по индексу, но не могу правильно закрыть это окно. <br/> <pre><code class="javascript">var modalparent = document.getElementsByClassName("secondary"), 
	modal_btn_multi = document.getElementsByClassName("toggle-sidebar"), 
	span_close_multi = document.getElementsByClassName("toggle-close"), 
	overlay = document.getElementById( 'woostify-overlay' );
	html = document.documentElement;

// Когда пользователь нажимает кнопку, открывается модальное окно
function setDataIndex() {

	for (i = 0; i &lt; modal_btn_multi.length; i++)
	{
		modal_btn_multi[i].setAttribute('data-index', i);
		modalparent[i].setAttribute('data-index', i);
		span_close_multi[i].setAttribute('data-index', i);
	}
}


for (i = 0; i &lt; modal_btn_multi.length; i++)
{
	modal_btn_multi[i].onclick = function() {
		var ElementIndex = this.getAttribute('data-index');
		modalparent[ElementIndex].classList.add( 'active' );
		html.classList.add( 'sidebar-mobile-open' );
		
		if ( overlay ) {
			overlay.classList.add( 'active' );
		}
	};



	// Когда пользователь нажимает на &lt;span&gt; (x), закрывается модальное окно
	span_close_multi[i].onclick = function() {
		var ElementIndex = this.getAttribute('data-index');
		modalparent[ElementIndex].classList.remove( 'active' );
		html.classList.remove( 'sidebar-mobile-open' );
		overlay.classList.remove( 'active' );
		
	};
	
}


window.onload = function(
  • 4 апреля 2025 г. 17:25
Ответы на вопрос 2
Для реализации закрытия модального окна при клике на затемнённую область (оверлей), вам нужно добавить обработчик события на этот элемент. Я покажу, как это сделать, основываясь на вашем коде. 

Допустим, вы уже имеете оверлей с ID `woostify-overlay`, и хотите закрыть модальное окно, если пользователь кликнул на этот оверлей.

Вот обновлённый код, который добавляет такой функционал:

```javascript
var modalparent = document.getElementsByClassName("secondary"),
	modal_btn_multi = document.getElementsByClassName("toggle-sidebar"),
	span_close_multi = document.getElementsByClassName("toggle-close"),
	overlay = document.getElementById('woostify-overlay');
html = document.documentElement;

// Когда пользователь нажимает кнопку, открывается модальное окно
function setDataIndex() {
	for (i = 0; i < modal_btn_multi.length; i++) {
		modal_btn_multi[i].setAttribute('data-index', i);
		modalparent[i].setAttribute('data-index', i);
		span_close_multi[i].setAttribute('data-index', i);
	}
}

for (i = 0; i < modal_btn_multi.length; i++) {
	modal_btn_multi[i].onclick = function() {
		var ElementIndex = this.getAttribute('data-index');
		modalparent[ElementIndex].classList.add('active');
		html.classList.add('sidebar-mobile-open');
		
		if (overlay) {
			overlay.classList.add('active');
		}
	};

	// Когда пользователь нажимает на <span> (x), закрывается модальное окно
	span_close_multi[i].onclick = function() {
		var ElementIndex = this.getAttribute('data-index');
		modalparent[ElementIndex].classList.remove('active');
		html.classList.remove('sidebar-mobile-open');
		if (overlay) {
			overlay.classList.remove('active');
		}
	};
}

// Добавляем обработчик клика на оверлей
if (overlay) {
	overlay.onclick = function() {
		var activeModal = document.querySelector('.secondary.active'); // Находим активное модальное окно
		if (activeModal) {
			var ElementIndex = activeModal.getAttribute('data-index');
			modalparent[ElementIndex].classList.remove('active');
			html.classList.remove('sidebar-mobile-open');
			overlay.classList.remove('active');
		}
	};
}

window.onload = function() {
	setDataIndex(); // вызываем функцию для установки индексов
};
```

### Как это работает:
1. Добавляется обработчик события на оверлей.
2. При клике на оверлей мы проверяем, есть ли активное модальное окно.
3. Если да, то мы находим индекс этого окна и закрываем его, удаляя класс `active`.
4. Также удаляем классы у оверлей и HTML-документа, чтобы вернуть всё обратно в нормальное состояние.

Теперь, когда пользователь кликнет на затемнённую область оверлея, модальное окно закроется.
e.target возвращает нажатый элемент, а не модальное окно. 
window.onclick = function(event) {
if (event.target .closest("secondary") === modalparent[...]) {
modalparent[...].classList.remove( 'active' );
}
};
Похожие вопросы