Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 03.07.2011, 13:51
Профессор
Отправить личное сообщение для (Sandr) Посмотреть профиль Найти все сообщения от (Sandr)
 
Регистрация: 14.10.2010
Сообщений: 376

Скрытие модального окна
Всем привет. Подскажите как скрыть модальное окно, кликом "пустому" пространству на сайте?
Например, на этом форуме при выставлении + или - за сообщение открывается модальное окно, чтобы его скрыть, можно кликнуть по области вне окна. Как такое же осуществить?
Я пробовал написать так <body onclick="hide()">
hide() скрывает нужный див. Но в этом случае, если нажать на содержимое самого дива, то див тоже скроется.
Ответить с цитированием
  #2 (permalink)  
Старый 03.07.2011, 15:32
Аватар для Vulkan
Профессор
Отправить личное сообщение для Vulkan Посмотреть профиль Найти все сообщения от Vulkan
 
Регистрация: 25.05.2010
Сообщений: 511

Используйте свойство объекта события 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>

Последний раз редактировалось Vulkan, 04.07.2011 в 07:39.
Ответить с цитированием
  #3 (permalink)  
Старый 03.07.2011, 15:43
Профессор
Отправить личное сообщение для (Sandr) Посмотреть профиль Найти все сообщения от (Sandr)
 
Регистрация: 14.10.2010
Сообщений: 376

Спасибо) А не подскажешь, где про него можно по подробнее прочитать?
Ответить с цитированием
  #4 (permalink)  
Старый 03.07.2011, 15:44
Профессор
Отправить личное сообщение для (Sandr) Посмотреть профиль Найти все сообщения от (Sandr)
 
Регистрация: 14.10.2010
Сообщений: 376

И ещё вопрос, откуда берётся аргумент "e" ?
Ответить с цитированием
  #5 (permalink)  
Старый 03.07.2011, 16:02
Аватар для Vulkan
Профессор
Отправить личное сообщение для Vulkan Посмотреть профиль Найти все сообщения от Vulkan
 
Регистрация: 25.05.2010
Сообщений: 511

Это стандартный аргумент любого события, в нём хранятся данные события, например для onmouseover в нём дополнительно хранятся координаты текущего положения курсора. Ответы на все свои вопросы Вы найдёте здесь.
Ответить с цитированием
  #6 (permalink)  
Старый 03.07.2011, 21:39
Профессор
Отправить личное сообщение для (Sandr) Посмотреть профиль Найти все сообщения от (Sandr)
 
Регистрация: 14.10.2010
Сообщений: 376

Получилось) Но есть одна проблема, если внутри элемента есть ещё какие-то другие, то окно можно случайно закрыть, при нажатии на него.

Сделал так if(e.target.id != 'id1' && e.target.id != 'id2' && e.target.id != 'id3' и так далее )

Но как можно сделать, чтоб код не учитывал внутренние элементы? Т.к. их может быть огромное количество, то как-то будет "некрасиво" писать для ~50 элементов..
Ответить с цитированием
  #7 (permalink)  
Старый 03.07.2011, 21:40
Профессор
Отправить личное сообщение для (Sandr) Посмотреть профиль Найти все сообщения от (Sandr)
 
Регистрация: 14.10.2010
Сообщений: 376

У меня такая ситуация
<div id="имя">
...
n'ое количество элементов
...
</div>
Ответить с цитированием
  #8 (permalink)  
Старый 03.07.2011, 22:02
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

повесь обработчик на <div id="имя"> и всё. при действии на любом вложенном в него элементе событие всплывёт к нему. и проверяй не остальные, а его-если ты не трогал настройки
Ответить с цитированием
  #9 (permalink)  
Старый 03.07.2011, 22:36
Профессор
Отправить личное сообщение для (Sandr) Посмотреть профиль Найти все сообщения от (Sandr)
 
Регистрация: 14.10.2010
Сообщений: 376

В начале так и сделал, вот и возникла проблема описаная выше.
Ответить с цитированием
  #10 (permalink)  
Старый 04.07.2011, 07:07
Аватар для Vulkan
Профессор
Отправить личное сообщение для Vulkan Посмотреть профиль Найти все сообщения от Vulkan
 
Регистрация: 25.05.2010
Сообщений: 511

Можно в принципе принимать решение скрывать или нет 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. Везде работает.

Последний раз редактировалось Vulkan, 04.07.2011 в 08:10.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[mootools] Ссылка в модальном окне = закрытие модального окна и и переход по ссылке koshmos Библиотеки/Тулкиты/Фреймворки 6 22.01.2012 16:20
Закрытие модального окна с подключенным jquery.js lukingnu jQuery 1 10.03.2011 22:37
Плавное открытие окна. Flashton Элементы интерфейса 3 20.10.2010 16:00
Открытие модального окна из фрейма lukingnu jQuery 5 30.08.2010 18:30
Вставка данных в textarea из модального окна (для Markitup) Roman Koff jQuery 0 26.08.2010 23:21