Скрытие модального окна
Всем привет. Подскажите как скрыть модальное окно, кликом "пустому" пространству на сайте?
Например, на этом форуме при выставлении + или - за сообщение открывается модальное окно, чтобы его скрыть, можно кликнуть по области вне окна. Как такое же осуществить? Я пробовал написать так <body onclick="hide()"> hide() скрывает нужный див. Но в этом случае, если нажать на содержимое самого дива, то див тоже скроется. |
Используйте свойство объекта события target
<head>
<script type="text/javascript">
window.onload = function () {
document.onclick = function (e) {
e = e || window.event;
if((e.target || e.srcElement).id != 'window') {
document.getElementById('window').style.display = 'none';
}
}
}
</script>
</head>
<body>
<div id="window" style="position: absolute; top: 50px; left: 50px; background: red; width: 50px; height: 50px;"></div>
</body>
|
Спасибо) А не подскажешь, где про него можно по подробнее прочитать?
|
И ещё вопрос, откуда берётся аргумент "e" ?
|
Это стандартный аргумент любого события, в нём хранятся данные события, например для onmouseover в нём дополнительно хранятся координаты текущего положения курсора. Ответы на все свои вопросы Вы найдёте здесь.
|
Получилось) Но есть одна проблема, если внутри элемента есть ещё какие-то другие, то окно можно случайно закрыть, при нажатии на него.
Сделал так if(e.target.id != 'id1' && e.target.id != 'id2' && e.target.id != 'id3' и так далее ) Но как можно сделать, чтоб код не учитывал внутренние элементы? Т.к. их может быть огромное количество, то как-то будет "некрасиво" писать для ~50 элементов.. |
У меня такая ситуация
<div id="имя"> ... n'ое количество элементов ... </div> |
повесь обработчик на <div id="имя"> и всё. при действии на любом вложенном в него элементе событие всплывёт к нему. и проверяй не остальные, а его-если ты не трогал настройки
|
В начале так и сделал, вот и возникла проблема описаная выше.
|
Можно в принципе принимать решение скрывать или нет div, анализируя атрибуты parentNode:
<head>
<script type="text/javascript">
window.onload = function () {
document.onclick = function (e) {
e = e || window.event;
var a = false,
node = (e.target || e.srcElement);
while(node.parentNode) {
if(node.id == 'window') {
a = true;
break;
}
node = node.parentNode;
}
if(!a) {
document.getElementById('window').style.display = 'none';
}
}
}
</script>
</head>
<body>
<div id="window" style="position: absolute; top: 50px; left: 50px; background: red; width: 150px; height: 150px;"><div style="background: green; width: 50px; height: 50px;"></div><div style="background: blue; width: 50px; height: 50px;"></div></div>
</body>
или сравнивая координаты места клика и положения элемента:
<head>
<script type="text/javascript">
window.onload = function () {
document.onclick = function (e) {
e = e || window.event;
var div = document.getElementById('window'),
coords = getOffset(div);
if (e.clientX < coords.left || e.clientX > coords.left + div.offsetWidth || e.clientY < coords.top || e.clientY > coords.top + div.offsetHeight) {
div.style.display = 'none';
}
}
}
function getOffset(elem) {
if (elem.getBoundingClientRect) {
return getOffsetRect(elem)
} else {
return getOffsetSum(elem)
}
}
function getOffsetSum(elem) {
var top=0, left=0
while(elem) {
top = top + parseInt(elem.offsetTop)
left = left + parseInt(elem.offsetLeft)
elem = elem.offsetParent
}
return {top: top, left: left}
}
function getOffsetRect(elem) {
var box = elem.getBoundingClientRect()
var body = document.body
var docElem = document.documentElement
var scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop
var scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft
var clientTop = docElem.clientTop || body.clientTop || 0
var clientLeft = docElem.clientLeft || body.clientLeft || 0
var top = box.top + scrollTop - clientTop
var left = box.left + scrollLeft - clientLeft
return { top: Math.round(top), left: Math.round(left) }
}
</script>
</head>
<body>
<div id="window" style="position: absolute; top: 50px; left: 50px; background: red; width: 150px; height: 150px;"><div style="background: green; width: 50px; height: 50px;"></div><div style="background: blue; width: 50px; height: 50px;"></div></div>
</body>
Проверял в 5 браузерах - Opera, FireFox, IE, Chrome, Safari. Везде работает. |
| Часовой пояс GMT +3, время: 11:46. |