2011-12-14 4 views
0

Я использовал следующий код, чтобы получить "нажмите снаружи", чтобы закрыть работу:Как указать .stopPropagation() в этом примере?

по щелчку дивы шоу:

$('div.topIconNew').click(
    function(){ 
     $(this).siblings('div.topTip').show(); 
     $(this).siblings('div.topDrop').slideDown(240); 

По щелчку за пределами DIVS шкурой:

$('div#wrapper').click(
    function(event){ 
     $('div.topIconNew, div.topTip, div.topDrop').hide(); 
    } 
); 
$('div.topTip, div.topDrop').click(
    function(event){ 
     event.stopPropagation(); 
    } 
); 

проблема с этим выше заключается в том, что topIconNew .stopPropagation делает так, что после того, как divs topTip и topDrop открыты, они не будут закрываться, если я снова нажму тот же самый topIconNew (т. е. переключится) или другой экземпляр topIconNew.

NEW EDIT ***

Хорошо, я думаю, через это и интересно, если решение может быть с тем, если заявления.

Так что я в конечном счете хочу следующий дополнительный код:

$('topIconNew').click(
    function(){ 
     $('div.topTip, div.topDrop').hide(); 
    } 
); 

Однако, я хочу выше также сказать, чтобы скрыть topTip и topDrop при нажатии topIconNew только если topTip и topDrop открыты И скрыть только те элементы topTip и topDiv, которые в настоящее время открыты.

Как бы я сказал выше?

ответ

1

Это не отвечает на ваш вопрос напрямую, но я только что видел, что кто-то из SO реализует метод «щелчок в любом месте, чтобы закрыть всплывающее окно» довольно элегантным способом; оговорка в том, что остальная часть вашей страницы должна использовать e.stopPropagation() экономно.

$('div.topIconNew').click(function(e){ 
    $(this).siblings('div.topTip').show(); 
    $(this).siblings('div.topDrop').slideDown(240); 

    $(document).one('click', function() { 
     $('div.topTip, div.topDrop').hide(); 
    }); 

    e.stopPropagation();   

    ... 
}); 
+0

Итак, вы добавили .one() к вещам, так что это происходит только один раз для этих элементов? Кажется, я не могу заставить его работать. Я буду продолжать и, надеюсь, это сработает. Мне нужно будет лучше понять и .one(), и посмотреть, почему это означает, что я должен использовать .stopPropagation более экономно. Спасибо за ответ. – jstacks

+0

Чтобы быть более конкретным, проблема заключается в том, что открыть начальный щелчок div, показывать и скрывать отмену друг друга все еще происходит, но только один раз. Итак, как только я это сделал, он отключит .hide() и покажет div. К сожалению, я не могу больше закрыться после щелчка снаружи ... поскольку он исчерпан, это время «.one()». – jstacks

+0

.one() просто означает, что он будет выполняться только один раз. С этим фрагментом кода выше вам не нужны остальные. Только это откроет и закроет всплывающее окно. Причина, по которой вам придется использовать stopPropagation экономно, заключается в том, что событие click должно пройти весь путь до документа до того, как всплывающее окно закроется. Обратите внимание, что .one() подключается к «документу»; и поскольку события пузырятся, если только они не заблокированы stopPropagation или «return false», это запустит это событие ... но только один раз. – rkw