document. body. addEventListener ('click', closeAll, false);
И тут проверяю открыто ли окно, если да закрываю, если нет иду дальше
и так все выпадающие меню...
function clickOutside (el) {
$(document).on('click', function(event) {
event.stopPropagation();
if ($(event.target).is(el)) return;
console.log('Клик мимо меня');
});
}
upd:
function clickOutside (selector) {
document.addEventListener('click', function (event) {
event.stopPropagation();
var el = document.querySelector(selector);
if (event.target === el) return;
console.log('Не попал =)');
});
}
upd:
function findParentBySelector(elm, selector) {
var all = document.querySelectorAll(selector);
var cur = elm.parentNode;
while(cur && !collectionHas(all, cur)) {
cur = cur.parentNode;
}
return cur;
}
function clickOutside (selector) {
document.addEventListener('click', function (event) {
event.stopPropagation();
var el = document.querySelector(selector);
if (event.target == el) return;
// Проверка на то что это дочерний элемент
if (event.target == findParentBySelector(selector)) return;
console.log('Не попал =)');
});
}
e.stopPropagation()
— плохая идея. Читайтеtarget
сделанного клика элементом меню или чем-то другим. Если это не меню — закрывать меню.var el = document.getElementById('el');
document.addEventListener('click', outsideEvtListener);
function outsideEvtListener(evt) {
if (evt.target === el || el.contains(evt.target)) {
// клик внутри
return;
}
// код для закрытия меню, например el.classList.add('hidden')
// не забыть убрать слушатель событий (не для каждой имплементации требуется)
document.removeEventListener(outsideEvtListener);
}