Подтвердить что ты не робот

JQuery: скрыть всплывающее окно, если щелчок обнаружен в другом месте

Я пытаюсь скрыть div, если пользователь нажимает нигде, НО всплывающее окно или это дети. Это код, который у меня есть до сих пор:

$("body").click(function(){
    var $target = $(event.target);
    if(!$target.is(".popup") || !$target.is(".popup").children()){
        $("body").find(".popup").fadeOut().removeClass('active');
    }
});

Он работает для .popup div, но если кто-либо из них будет нажат, то он все равно скрывает его.

4b9b3361

Ответ 1

Вы действительно можете немного упростить это:

// If an event gets to the body
$("body").click(function(){
  $(".popup").fadeOut().removeClass("active");
});

// Prevent events from getting pass .popup
$(".popup").click(function(e){
  e.stopPropagation();
});

Нажатие на всплывающее окно или любой из его дочерних элементов приведет к остановке распространения до того, как он достигнет тела.

Демонстрация остановки распространения события: http://jsbin.com/ofeso3/edit

Ответ 2

Я использую для этого простой код: -

$(document).click(function(e){

   if($(e.target).closest('#popupdivID').length != 0) return false;
   $('#popupdivID').hide();
});

это также полезно для выпадающего меню. если вы нажмете на раскрывающееся меню и просмотрите список, а затем щелкните в другом месте документа, тогда выпадающее меню должно быть закрыто. Я также использовал для этого тот же код.

Спасибо!!

Ответ 3

Нарисуйте свою логическую логику!:)

if(!$target.is(".popup") && !$target.parents().is(".popup"))

Ответ 4

Сделайте это:

$(document).click(function (e) {
    // show_alerts is the class of the link to display the popup
    if (!$(e.target).parents().andSelf().is('.show_alerts')) {
        // hide your popup
    }
});

example: http://jsfiddle.net/Acf3F/

Ответ 5

Здесь потенциальное решение для определенных ситуаций. Всплывающее окно должно иметь tabindex, чтобы это работало и не могло содержать никаких "настраиваемых" элементов внутри.

$('a').click(function() {
    $('.popup').show().focus();
});
$('.popup').blur(function() {
    $(this).hide();
});

http://jsfiddle.net/d6zw3/

Ответ 6

Мы используем это, чтобы отображать всплывающее окно по щелчку, а затем скрыть его, как только вы снова нажмете ту же кнопку или нажмете на нее.

function togglePopup(){
  var selector = '#popup',
    $popup = $(selector),
    callback = function(e) {
      if (!$(e.target).parents().andSelf().is(selector)) {
        $popup.hide();
        $(document).off('click', callback);
      }
    };

  $popup.toggle();
  if ($popup.is(':visible')) {
    $(document).on('click', callback);
  }
  return false;
}

Ответ 7

$("body").click(function(event ){
            var $target = $(event.target);
            if(!$target.parents().is(".popup") && !$target.is(".popup")){
                $("body").find(".popup").hide();
            }
        });

это решение для меня

Ответ 8

Как и в jQuery 1.7, есть обработчик on(), для меня работает следующее: предполагается, что видимое всплывающее окно содержит класс .activePopup:

$('body').on('click', ":not(.activePopup)", function(e){
  e.stopPropagation();
  //do your hiding stuff
});

Ответ 9

Вот фрагмент кода, который может помочь для структуры html

<script>
jQuery(document).click(function() {
        jQuery(".main-div-class .content").css("display","none");
    });

    jQuery(".main-div-class .content").click(function (e) {
        e.stopPropagation();
        //do redirect or any other action on the content
    });     
    jQuery(".main-div-class h4").click(function(e) {
        e.stopPropagation();
        jQuery(this).parent().find(".content").show();
    });
</script>
<div class="main-div-class">
<h4>click here</h4>
<div class='content'>to show content here like this "<a href="http://stackoverflow.com/questions/2329816/jquery-hide-popup-if-click-detected-elsewhere#new-answer">Click</a>" or any other type of content</div>
</div>

Ответ 10

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

<script type="text/javascript">
jQuery(document).ready(function(e) {
jQuery(document).click(function() {
        jQuery(".main-div-class .content").css("display","none");
    });

    jQuery(".main-div-class .content").click(function (e) {
        e.stopPropagation();
        //do redirect or any other action on the content
    });     
    jQuery(".main-div-class h4").click(function(e) {
        e.stopPropagation();
        jQuery(this).parent().find(".content").show();
    });
});
</script>
<div class="main-div-class">
<h4>click here</h4>
<div class='content'>to show content here like this "<a href="http://stackoverflow.com/questions/2329816/jquery-hide-popup-if-click-detected-elsewhere#new-answer">Click</a>" or any other type of content</div>
</div>

Ответ 11

У меня были проблемы со всеми решениями здесь, поэтому после некоторого разочарования; Я подошел к проблеме в несколько другом направлении.

Мне особо не понравилось прикреплять события click к телу или документу, а event.target не был достаточно надежным. Я также не хотел использовать stopPropagation(), поскольку я не хотел вмешиваться в другие события.

Вот как я решил это, надеюсь, что это поможет:

Разметка

<div id="ModalBG"></div>
<div id="Modal">Content Here</div>


JavaScript

function showModal(){ $("#Modal, #ModalBG").show(); }

$("#ModalBG").click(function () { $("#Modal, #ModalBG").hide() });


CSS

#Modal{
    z-index: 99;
}


#ModalBG{
    opacity: 0;
    position: fixed;
    top: 0px;
    left: 0px;
    bottom: 0px;
    right: 0px;
    width: 100%;
    height: 100%;
    z-index: 98;
    display: none;
}

Ответ 12

Я сделал что-то вроде следующего. Надеюсь, это поможет кому-то

$('body').click(function(e) {
    $('className').click(function(){
         e.stopPropagation();
         $(this).data('clicked', true);
    })
if(!$('.className').data('clicked')){
    // do sth
 } else {
    // do sth else
 }
$('.className').data('clicked', false);