Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Определение куда пошел клик при событии на body (https://javascript.ru/forum/misc/41495-opredelenie-kuda-poshel-klik-pri-sobytii-na-body.html)

Esigns 16.09.2013 17:05

Определение куда пошел клик при событии на body
 
Привет.
По клику на кнопку возле нее появляется маленькое окошко.
Как сделать так, чтобы по клику на любую часть на сайте(кроме окна) пряталось окно?
Может как-то повесить событие на body и ловить клик?
Реализация желательно на jquery, если это возможно.
Спасибо.

Яростный Меч 16.09.2013 17:15

обычно при появлении такого окошка клик вешается на документ, и в функции проверяется event.target и его паренты, если один из парентов - окно, то не будем его скрывать.
другой вариант - повесить клик ещё и на окно, в нем сделать stopPropagation(), чтобы до документа событие не дошло, а в обработчике клика документа просто скрывать окно.

ну и при скрытии окна обработчик с документа убирается.

ruslan_mart 16.09.2013 17:18

Примерно так:

$(document).on('click', function(e) {
   if(e.target.className != 'класс окошка') {
      //...
   }
});

Яростный Меч 16.09.2013 17:19

Цитата:

Сообщение от Ruslan_xDD
if(e.target.className != 'класс окошка')

target может быть дочерним элементом окошка

ruslan_mart 16.09.2013 17:21

Яростный Меч, это да.

Есть ещё такая идея:

$('body *').click(function() {
   if(!$(this).parents('класс окошка').length) {
      //...
   }
});


Но лучше так делать не стоит, так как при клике на любой элемент будет срабатывать этот код.

Esigns 16.09.2013 17:26

О, спасибо большое!

ruslan_mart 16.09.2013 17:35

Самый нормальный вариант:

.display {
   display: none;
   height: 100%;
   left: 0%;
   top: 0%;
   position: fixed;
   width: 100%;
   z-index: 1;
}


<div class="display"></div>


var display;

$(function() {
   display = $('.display');
   display.click(function() {
      this.style.display = 'none';
   });
});

function winOpen() {
   /*Тут код для открытия окна*/
   display.css('display', 'block');
}

function winClose() {
   /*Тут код для закрытия окна*/
   display.css('display', 'none');
}

danik.js 16.09.2013 18:30

Цитата:

Сообщение от Ruslan_xDD
Но лучше так делать не стоит, так как при клике на любой элемент будет срабатывать этот код.

Дык что мешает навешивать обработчик только при открытии окна и затем снимать его? И про делегирование обработки событий не слышал? Поди почитай.


Часовой пояс GMT +3, время: 02:55.