2010-02-24 7 views
37

Estoy tratando de ocultar un div si el usuario hace clic en cualquier lugar PERO en la ventana emergente O en los elementos secundarios. Este es el código que tengo hasta ahora:jQuery: ocultar ventana emergente si se detectó clic en otra parte

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

Funciona para el div .popup, pero si cualquiera de sus hijos se hace clic, se esconde de todos modos.

Respuesta

77

Realmente podría simplificar esto un poco creo:

// 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(); 
}); 

Al hacer clic en la ventana emergente, o cualquiera de sus hijos va a causar la propagación se detenga antes de que llegue al cuerpo.

demostración de detener la propagación de eventos: http://jsbin.com/ofeso3/edit

+2

Una sugerencia menor es escribir $ (". Popup: visible"). FadeOut(). RemoveClass ("activo"); - He tenido problemas donde reaparece para desaparecer nuevamente. – ehdv

+0

Esto parece una gran solución, sin embargo, estoy teniendo problemas cuando hay cosas que deben ocurrir dentro de la ventana emergente basada en el evento de clic. Específicamente, tengo una aplicación Rails y estoy usando un: remote => true en un formulario dentro de la ventana emergente. En este caso, la funcionalidad AJAX se rompe cuando se usa e.stopPropagation(). Creé http://stackoverflow.com/questions/5904602/jquerys-event-stoppropagation-causing-problems-with-rails-remote-true antes de encontrar esta pregunta. De cualquier forma alrededor de esto? – robertwbradford

+0

... Quise decir "using a: method =>: delete,: remote => true en un 'destroy' link_to dentro de la ventana emergente ..." – robertwbradford

3

¡Arregle su lógica booleana! :)

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

Hubiera esperado que '$ .fn.is' devolviera valores booleanos. ¿Cómo saca esta magia? – Matchu

+0

hmm, ¡puede que tengas razón! Fijo. – ghoppe

1

Estamos utilizando esto para mostrar una ventana emergente en clic y ocultarlo a continuación, una vez que se hace clic en el mismo botón o haga clic fuera.

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; 
} 
1
$("body").click(function(event){ 
      var $target = $(event.target); 
      if(!$target.parents().is(".popup") && !$target.is(".popup")){ 
       $("body").find(".popup").hide(); 
      } 
     }); 

Ésta es la solución para mí

1

A partir de jQuery 1.7 se encuentra el controlador on(), las siguientes obras para mí, asumiendo una ventana emergente visible contiene la clase '.activePopup':

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

Aquí hay una posible solución para ciertas situaciones. La ventana emergente debe tener tabindex configurado para que funcione y no puede tener ningún elemento "enfocable" dentro.

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

http://jsfiddle.net/d6zw3/

+0

Este código no es apropiado según la pregunta. –

6

Estoy utilizando un código muy simple para esto: -

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

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

esto también es útil el menú desplegable. si hace clic en el menú desplegable y visualiza la lista y luego hace clic en cualquier otro lugar del documento, entonces ese menú desplegable debe cerrarse. He usado el mismo código para eso también.

Gracias!

+0

mejor solución, otra detendrá todos los enlaces de clics dentro de la ventana emergente – baaroz

1

Aquí es el fragmento de código que pueden ayudar para una estructura 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> 
+0

También podemos agregar este código en jQuery (documento) .ready (función() {}); –

1

código de manera actualizada puede ser así

<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> 
3

hacer esto:

$(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 
    } 
}); 

ejemplo: http://jsfiddle.net/Acf3F/

1

Tuve problemas con todas las soluciones aquí, así que después de un poco de frustración; Abordé el problema desde una dirección ligeramente diferente.

Específicamente no me gustó adjuntar eventos de clics al cuerpo o documento y event.target no era lo suficientemente confiable. Tampoco quería usar stopPropagation() ya que no quería interferir con otros eventos.

Así es como lo resolví, creo que sirve:

marcado

<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; 
} 
Cuestiones relacionadas