Проблема всплытия, паттерн Модуль
Доброго времени суток! Появилась проблема всплытия события. Т.е. по клику на оборачивающий блок fixed-wrap должно закрываться модальное окно modal. Сейчас modal закрывается куда бы я не кликнул.
Ко всему прочему паттрен отрабатывает только со второго клика, судя по всему в каком-то месте по первому клику я только подписываюсь на событие, а по второму обрабатываю. Пока до конца не разобрался, но есть предположение что происходит это в приватной функции _initModal. Возникли трудности т.к. в данном примере используется паттерн Модуль и нет ясности в каком месте и какой метод использовать для остановки распространения события по DOM:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Index</title>
</head>
<body>
<div class="fixed-wrap fixed-wrap__modal">
<div class="modal">
<div class="modal-container">
<div class="move-container"></div>
<input class="modal__input" type="text" placeholder="Введите название цели">
</div>
</div>
</div>
<button class="tasks__btn" type="submit">+ добавить задачу</button>
<style>
.fixed-wrap {
display: block;
position: fixed;
overflow: auto;
left: 0;
top: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, .6);
opacity: 0;
visibility: hidden;
transition: 1000ms;
}
.fixed-wrap._show {
opacity: 1;
visibility: visible;
}
.fixed-wrap__modal {
text-align: center;
white-space: nowrap;
}
.fixed-wrap__modal::after {
display: inline-block;
vertical-align: middle;
height: 100%;
content: '';
}
.modal {
display: inline-block;
vertical-align: middle;
}
.modal-container {
background-color: #fff;
padding: 20px;
color: #000;
height: 500px;
width: 710px;
text-align: left;
white-space: normal;
}
.move-container {
width: 100%;
height: 53px;
}
.modal__input {
display: block;
width: 80%;
min-height: 40px;
padding: 12px;
margin: 0 auto 20px;
font: 16px "Roboto-Regular", sans-serif;
border: 1px solid #acadaf;
box-sizing: border-box;
outline: none;
}
</style>
<script>
var modalBtn = document.querySelector(".tasks__btn");
var modalOverlay = document.querySelector(".fixed-wrap");
var modalWnd = (function() {
var _init = function() {
_eventListener();
_initModal();
_closeModal();
};
var _eventListener = function() {
modalBtn.addEventListener("click", _initModal, false);
};
var _initModal = function() {
var modal = document.querySelector(".fixed-wrap");
modal.classList.add("_show");
};
var _closeModal = function() {
var modal = document.querySelector(".fixed-wrap");
modal.classList.remove("_show");
}
return {
init: _init,
close: _closeModal
};
})();
modalBtn.onclick = function() {
modalWnd.init();
};
modalOverlay.onclick = function() {
modalWnd.close();
};
/*
var modalBtn = document.querySelector(".tasks__btn");
var modalOverlay = document.querySelector(".fixed-wrap");
var handlerInit = function() {
modalWnd.init();
};
var handlerClose = function() {
modalWnd.close();
};
var modalWnd = (function() {
var _init = function() {
_eventListener();
_initModal();
_closeModal();
};
var _eventListener = function() {
modalBtn.addEventListener("click", _initModal);
};
var _initModal = function() {
var modal = document.querySelector(".fixed-wrap");
modal.classList.add("_show");
};
var _closeModal = function() {
var modal = document.querySelector(".fixed-wrap");
modal.classList.remove("_show");
}
return {
init: _init,
close: _closeModal
};
})();
modalOverlay.addEventListener("click", handlerInit, false);
modalBtn.addEventListener("click", handlerClose, false);
*/
</script>
</body>
</html>
Буду благодарен за обратную связь, спасибо :) |
phoenix200689,
делали бы пример полностью |
Дополнил.
p.s. код в комментариях это попытка перейти с onclick на eventListeners. |
phoenix200689,
<!DOCTYPE html>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<style type="text/css">
.fixed-wrap{
position: fixed;
left: 0;
top: 0;
right: 0;
bottom: 0;
background-color: #DCDCDC;
display: none;
}
.fixed-wrap._show{
display: block;
}
.modal{
background: #fff;
width: 520px;
margin: 10% auto;
padding: 5px 20px 13px 20px;
border: 10px solid #ddd;
position: relative;
/*--CSS3 Тени для Блока--*/
-webkit-box-shadow: 0px 0px 20px #000;
-moz-box-shadow: 0px 0px 20px #000;
box-shadow: 0px 0px 20px #000;
/*--CSS3 Скругленные углы--*/
-webkit-border-radius: 15px;
-moz-border-radius: 15px;
border-radius: 15px;
}
</style>
</head>
<body>
<div class="fixed-wrap fixed-wrap__modal">
<div class="modal">
<div class="modal-container">
<div class="move-container"></div>
<input class="modal__input" type="text" placeholder="Введите название цели">
</div>
</div>
</div>
<input class="tasks__btn" type="button" value="go">
<script>
var modalWnd = (function() {
var _init = function() {
_eventListener();
};
var modal = document.querySelector(".modal");
var modalBtn = document.querySelector(".tasks__btn");
var modalOverlay = document.querySelector(".fixed-wrap");
var _eventListener = function() {
modalBtn.addEventListener("click", _initModal, false);
modalOverlay.addEventListener("click", _closeModal, false);
modal.addEventListener("click", function(event) {
event.stopPropagation()
}, false);
};
var _initModal = function() {
modalOverlay.classList.add("_show");
};
var _closeModal = function() {
modalOverlay.classList.remove("_show");
}
return {
init: _init,
close: _closeModal,
show : _initModal
};
})();
modalWnd.init();
modalWnd.show()
</script>
</body>
</html>
|
Это работает, спасибо :) Ушел разбираться как оно работает и что я делал не так
|
| Часовой пояс GMT +3, время: 09:41. |