Это более общее решение: позволяет наблюдать за несколькими элементами, а также динамически добавлять и удалять элементы из очереди .
Содержит глобальную очередь ( autoCloseQueue ) - контейнер объектов для элементов, которые должны быть закрыты при внешних щелчках.
Каждый ключ объекта очереди должен быть идентификатором элемента DOM, а значение должно быть объектом с 2 функциями обратного вызова:
{onPress: someCallbackFunction, onOutsidePress: anotherCallbackFunction}
Поместите это в ваш документ, готовый обратный вызов:
window.autoCloseQueue = {}
$(document).click(function(event) {
for (id in autoCloseQueue){
var element = autoCloseQueue[id];
if ( ($(e.target).parents('#' + id).length) > 0) { // This is a click on the element (or its child element)
console.log('This is a click on an element (or its child element) with id: ' + id);
if (typeof element.onPress == 'function') element.onPress(event, id);
} else { //This is a click outside the element
console.log('This is a click outside the element with id: ' + id);
if (typeof element.onOutsidePress == 'function') element.onOutsidePress(event, id); //call the outside callback
delete autoCloseQueue[id]; //remove the element from the queue
}
}
});
Затем, когда элемент DOM с идентификатором ' menuscontainer ' создан, просто добавьте этот объект в очередь:
window.autoCloseQueue['menuscontainer'] = {onOutsidePress: clickOutsideThisElement}