Estoy usando este código:
$('body').click(function() {
$('.form_wrapper').hide();
});
$('.form_wrapper').click(function(event){
event.stopPropagation();
});
Y este HTML :
<div class="form_wrapper">
<a class="agree" href="javascript:;">I Agree</a>
<a class="disagree" href="javascript:;">Disagree</a>
</div>
El problema es que tengo enlaces dentro div
y cuando ya no funcionan cuando se hace clic.
$('html')
o$(document)
sería mejor que$('body')
Respuestas:
Tuve el mismo problema, se me ocurrió esta solución fácil. Incluso funciona de forma recursiva:
fuente
$("YOUR CONTAINER SELECTOR").unbind( 'click', clickDocument );
justo al lado.hide()
. Asídocument
que no sigas escuchando los clics.$(document).on("mouseup.hideDocClick", function () { ... });
en la función que abre el contenedor y$(document).off('.hideDocClick');
en la función ocultar. Usando espacios de nombres no estoy eliminando otros posiblesmouseup
oyentes adjuntos al documento.Será mejor que vayas con algo como esto:
fuente
hover
controlador de eventos, que abre muchas posibilidades.(function() { // ... code })();
No recuerdo el nombre de este patrón, ¡pero es muy útil! Todas las variables declaradas residirán dentro de la función y no contaminarán el espacio de nombres global.Este código detecta cualquier evento de clic en la página y luego oculta el
#CONTAINER
elemento si y solo si el elemento seleccionado no era el#CONTAINER
elemento ni uno de sus descendientes.fuente
Es posible que desee verificar el destino del evento de clic que se dispara para el cuerpo en lugar de confiar en stopPropagation.
Algo como:
Además, el elemento del cuerpo puede no incluir todo el espacio visual que se muestra en el navegador. Si observa que sus clics no se registran, es posible que deba agregar el controlador de clics para el elemento HTML.
fuente
e.stopPropagation();
si tienes otro oyente de clicsform_wrapper
cuando hace clic en uno de sus elementos secundarios, que no es el comportamiento deseado. Utilice la respuesta de prc322 en su lugar.Demo en vivo
El área de clic de verificación no está en el elemento de destino o en su elemento secundario
ACTUALIZAR:
jQuery detener la propagación es la mejor solución
Demo en vivo
fuente
clicked
uno. De lo contrario,stopPropagation
haría posible que se abran múltiples menús desplegables al mismo tiempo.fuente
Se actualizó la solución a:
var mouseOverActiveElement = false;
fuente
.live
ahora está en desuso ; utilizar.on
en su lugar.Una solución sin jQuery para la respuesta más popular :
MDN: https://developer.mozilla.org/en/docs/Web/API/Node/contains
fuente
bind
No funciona. ¿Podría arreglar la función para que funcione?Demostración en vivo con ESCfuncionalidad
Funciona tanto en computadoras de escritorio como en dispositivos móviles
Si en algún caso necesita asegurarse de que su elemento sea realmente visible cuando haga clic en el documento:
if($pop.is(':visible') && (notH||e.which==27)) $pop.hide();
fuente
¿No funcionaría algo como esto?
o
fuente
.form_wrapper
cuando haga clic en sus elementos secundarios (entre otros problemas).Incluso aguijón:
fuente
.wrapper
no importa dónde haga clic en la página, que no es lo que se le solicitó.En lugar de escuchar cada clic en el DOM para ocultar un elemento específico, puede establecer
tabindex
el elemento primario<div>
y escuchar losfocusout
eventos.La configuración
tabindex
se asegurará de que elblur
evento se active en<div>
(normalmente no lo haría).Entonces su HTML se vería así:
Y tu JS:
fuente
Y para dispositivos táctiles como IPAD e IPHONE podemos usar el siguiente código
fuente
Aquí hay un jsfiddle que encontré en otro hilo, también funciona con la clave esc: http://jsfiddle.net/S5ftb/404
fuente
Creado a partir de la increíble respuesta de prc322.
Esto agrega un par de cosas ...
¡Espero que esto ayude a alguien!
fuente
Si tiene problemas con iOS, el mouseup no funciona en dispositivos Apple.
¿mousedown / mouseup en jquery funciona para el ipad?
yo uso esto:
fuente
(Solo agregando a la respuesta de prc322).
En mi caso, estoy usando este código para ocultar un menú de navegación que aparece cuando el usuario hace clic en la pestaña correspondiente. Descubrí que era útil agregar una condición adicional, que el objetivo del clic fuera del contenedor no es un enlace.
Esto se debe a que algunos de los enlaces de mi sitio agregan contenido nuevo a la página. Si este nuevo contenido se agrega al mismo tiempo que desaparece el menú de navegación, puede ser desorientador para el usuario.
fuente
Tantas respuestas, debe ser un derecho de paso para haber agregado una ... No vi una respuesta actual (jQuery 3.1.1), así que:
fuente
fuente
p
es el nombre del elemento Donde se puede pasar la identificación o clase o nombre del elemento también.fuente
Devuelve falso si hace clic en .form_wrapper:
fuente
Adjunte un evento de clic a elementos de nivel superior fuera del contenedor del formulario, por ejemplo:
Esto también funcionará en dispositivos táctiles, solo asegúrese de no incluir un padre de .form_wrapper en su lista de selectores.
fuente
VIOLÍN
fuente
fuente
Copiado de https://sdtuts.com/click-on-not-specified-element/
Demostración en vivo http://demos.sdtuts.com/click-on-specified-element
fuente
Lo hice así:
fuente
fuente
Al usar este código, puede ocultar tantos elementos como desee
fuente
Lo que puede hacer es vincular un evento de clic al documento que ocultará el menú desplegable si se hace clic en algo fuera del menú desplegable, pero no lo ocultará si se hace clic en algo dentro del menú desplegable, por lo que su evento "show" (o menú desplegable o lo que sea muestra el menú desplegable)
Luego, al ocultarlo, desvincula el evento de clic
fuente
Según los documentos ,
.blur()
funciona para más que la<input>
etiqueta. Por ejemplo:fuente
div
nunca se difumina: los eventos de desenfoque ni siquiera pueden burbujearles de sus hijos. Finalmente, incluso si lo anterior no fuera cierto, esto solo funcionaría si se asegurara de que.form_wrapper
estuviera enfocado antes de que el usuario lo apagara.