Закрытие div при клике вне его

452
15 декабря 2016, 16:23

Нужно закрыть div, если клик был вне его области.

Имеем:

function backcall() { 
    var status = document.getElementById('backcallmsgdiv'); 
    status.style.height = "500px"; 
    status.style.border = "1px solid #A52629"; 
    status.style.overflow = "visible";        
} 
 
function closebc() { 
    var status = document.getElementById('backcallmsgdiv'); 
    status.style.height = "0px"; 
    status.style.border = "0px solid #A52629"; 
    status.style.overflow = "hidden"; 
    status.addEventListener("click", stopEvent, false); 
}
<div class="cl1"> 
    <a href="#" onclick="backcall()">Свяжитесь с нами</a> 
</div> 
<div id="backcallmsgdiv"> 
    <a href="#" onclick="closebc()" > 
        <div id="close">X</div> 
    </a> 
    <div class="tre"></div> 
</div>

Как закрыть блок при клике вне его? Пробовал повесить функцию на body (при клике на body закрытие блока, но он тогда просто не открывается).

Answer 1

Идея состоит в том, чтобы запретить продвижение события click по DOM вверх, если клик произведён по элементу "Свяжитесь с нами" или #backcallmsgdiv (за исключением #close). В таком случае можно закрывать окно по клику в document:

document.addEventListener('DOMContentLoaded', onDomReady); 
 
function onDomReady() { 
    var status = document.getElementById('backcallmsgdiv'); 
    var conactUs = document.getElementById('contactUs'); 
    var close = document.getElementById('close'); 
     
    conactUs.addEventListener('click', function(event) { 
        status.style.height = "500px"; 
        status.style.border = "1px solid #A52629"; 
        status.style.overflow = "visible"; 
        event.stopPropagation(); 
    }); 
     
    status.addEventListener('click', function(event) { 
        event.stopPropagation(); 
    }); 
     
    function closebc() { 
        status.style.height = "0px"; 
        status.style.border = "0px solid #A52629"; 
        status.style.overflow = "hidden"; 
    } 
     
    document.addEventListener('click', closebc); 
    close.addEventListener('click', closebc);    
};
<div class="cl1"> 
    <a id="contactUs" href="#">Свяжитесь с нами</a> 
</div> 
<div id="backcallmsgdiv"> 
    <a href="#"> 
        <div id="close">X</div> 
    </a> 
</div>

Answer 2

попробывал повесить функцию на body (при клике на боде закрытие блока, но он тогда просто не открывается)

Забыл проверить, что кликается не что-то внутри этого div'а.

READ ALSO
Как реализовать поиск слова в html файле? [закрыто]

Как реализовать поиск слова в html файле? [закрыто]

Подскажите, как реализовать поиск заданного слова на html странице?

264
Clearfix in CSS

Clearfix in CSS

Для очистки обтекания всегда пользовался следующей записью:

252
Поиск тегов без атрибутов в HTML с помощью регулярных выражений

Поиск тегов без атрибутов в HTML с помощью регулярных выражений

Стоит задача поиска всех не повторяющихся тегов без атрибутов (например, head, body) в HTML файле с помощью регулярных выражений

245
Видео на всю ширину страницы в Adobe Muse

Видео на всю ширину страницы в Adobe Muse

Доброго времени сутокЯ столкнулся с такой проблемой: не могу растянуть видео на всю ширину страницы в Adobe Muse

392