Así que tengo un menú desplegable que se muestra con un clic, según los requisitos comerciales. El menú se vuelve a ocultar después de alejar el mouse de él.
Pero ahora se me pide que lo mantenga en su lugar hasta que el usuario haga clic en cualquier parte del documento. ¿Cómo se puede lograr esto?
Esta es una versión simplificada de lo que tengo ahora:
$(document).ready(function() {
$("ul.opMenu li").click(function(){
$('#MainOptSubMenu',this).css('visibility', 'visible');
});
$("ul.opMenu li").mouseleave(function(){
$('#MainOptSubMenu',this).css('visibility', 'hidden');
});
});
<ul class="opMenu">
<li id="footwo" class="">
<span id="optImg" style="display: inline-block;"> <img src="http://localhost.vmsinfo.com:8002/insight/images/options-hover2.gif"/> </span>
<ul id="MainOptSubMenu" style="visibility: hidden; top: 25px; border-top: 0px solid rgb(217, 228, 250); background-color: rgb(217, 228, 250); padding-bottom: 15px;">
<li>some</li>
<li>nav</li>
<li>links</li>
</ul>
</li>
</ul>
Intenté algo como esto $('document[id!=MainOptSubMenu]').click(function()
pensando que se activaría en cualquier cosa que no fuera el menú, pero no funcionó.
Respuestas:
Eche un vistazo al enfoque que utilizó esta pregunta:
¿Cómo detecto un clic fuera de un elemento?
fuente
La respuesta es correcta, pero agregará un oyente que se activará cada vez que se produzca un clic en su página. Para evitar eso, puede agregar el oyente solo una vez:
Editar: si desea evitar el
stopPropagation()
botón inicial, puede usar estefuente
e.stopPropagation()
en Chrome para evitar que el primer evento se disparara en elone()
controladorLas
stopPropagation
opciones son malas porque pueden interferir con otros controladores de eventos, incluidos otros menús que podrían haber adjuntado controladores cercanos al elemento HTML.Aquí hay una solución simple basada en la respuesta de user2989143 :
fuente
Si el uso de un complemento está bien en su caso, le sugiero que el complemento clickoutside de Ben Alman se encuentra aquí :
su uso es tan simple como esto:
espero que esto ayude.
fuente
2 opciones que puedes investigar:
fuente
He encontrado una variante de la solución de Grsmto y solución de Dennis fijo mi problema.
fuente
Utilizo esta solución con múltiples elementos con el mismo comportamiento en la misma página:
stopPropagation () es una mala idea, esto rompe el comportamiento estándar de muchas cosas, incluidos los botones y enlaces.
fuente
$target.closest('#menu-container, #menu-activator').length === 0
Recientemente me he enfrentado al mismo problema. Escribí el siguiente código:
Me ha funcionado perfectamente.
fuente
que hay de esto
fuente
Encuentro más útil usar mousedown-event en lugar de click-event. El evento de clic no funciona si el usuario hace clic en otros elementos de la página con eventos de clic. En combinación con el método one () de jQuery, se ve así:
fuente
Incluso me encontré con la misma situación y uno de mis mentores me expuso esta idea.
paso: 1 al hacer clic en el botón en el que deberíamos mostrar el menú desplegable. luego agregue el siguiente nombre de clase "more_wrap_background" a la página activa actual como se muestra a continuación
paso 2 luego agregue un clic para la etiqueta div como
donde hideDropDown es la función que se llamará para ocultar el menú desplegable
El paso 3 y un paso importante mientras oculta el menú desplegable es eliminar esa clase que agregó anteriormente como
Estoy eliminando usando su identificación en el código anterior
fuente
Y es mejor configurar el oyente solo cuando su menú está visible y siempre eliminar el oyente después de que el menú se oculte.
fuente
Creo que necesitas algo como esto: http://jsfiddle.net/BeenYoung/BXaqW/3/
¡Espero que te sea de utilidad!
fuente
Utilice el selector ': visible'. Donde .menuitem es el (los) elemento (s) a ocultar ...
O si ya tiene el (los) elemento (s) .menuitem en una var ...
fuente
No tiene por qué ser complicado.
fuente