Tengo un menú desplegable de Bootstrap de Twitter. Como todos los usuarios de Twitter Bootstrap saben, el menú desplegable se cierra al hacer clic (incluso haciendo clic dentro de él).
Para evitar esto, puedo adjuntar fácilmente un controlador de eventos de clic en el menú desplegable y simplemente agregar el famoso event.stopPropagation()
.
<ul class="nav navbar-nav">
<li class="dropdown mega-dropdown">
<a href="javascript:;" class="dropdown-toggle" data-toggle="dropdown">
<i class="fa fa-list-alt"></i> Menu item 1
<span class="fa fa-chevron-down pull-right"></span>
</a>
<ul class="dropdown-menu mega-dropdown-menu">
<li>
<div id="carousel" class="carousel slide" data-ride="carousel">
<ol class="carousel-indicators">
<li data-slide-to="0" data-target="#carousel"></li>
<li class="active" data-slide-to="1" data-target="#carousel"></li>
</ol>
<div class="carousel-inner">
<div class="item">
<img alt="" class="img-rounded" src="img1.jpg">
</div>
<div class="item active">
<img alt="" class="img-rounded" src="img2.jpg">
</div>
</div>
<a data-slide="prev" role="button" href="#carousel"
class="left carousel-control">
<span class="glyphicon glyphicon-chevron-left"></span>
</a>
<a data-slide="next" role="button" href="#carousel"
class="right carousel-control">
<span class="glyphicon glyphicon-chevron-right"></span>
</a>
</div>
</li>
</ul>
</li>
</ul>
Sin embargo, esto parece un comportamiento fácil y muy común, y dado que carousel-controls
(así como carousel indicators
) los controladores de eventos se delegan al document
objeto, el click
evento en estos elementos ( controles anterior / siguiente , ...) será "ignorado".
$('ul.dropdown-menu.mega-dropdown-menu').on('click', function(event){
// The event won't be propagated up to the document NODE and
// therefore delegated events won't be fired
event.stopPropagation();
});
Confiar en Twitter Bootstrap dropdown hide
/ hidden
events no es una solución por las siguientes razones:
- El objeto de evento proporcionado para ambos controladores de eventos no da referencia al elemento cliqueado
- No tengo control sobre el contenido del menú desplegable, por lo que
flag
no es posible agregar una clase o atributo
Este violín es el comportamiento normal y este violín se event.stopPropagation()
agrega.
Actualizar
Gracias a Roman por su respuesta . También encontré una respuesta que puedes encontrar a continuación .
event propagation
se detuvo.Respuestas:
Eliminar el atributo de datos
data-toggle="dropdown"
e implementar la apertura / cierre del menú desplegable puede ser una solución.Primero manejando el clic en el enlace para abrir / cerrar el menú desplegable de esta manera:
y luego escucha los clics fuera del menú desplegable para cerrarlo así:
Aquí está la demostración: http://jsfiddle.net/RomaLefrancois/hh81rhcm/2/
fuente
// PREVENT INSIDE CLICK DROPDOWN
$('.dropdown-menu').on("click.bs.dropdown", function (e) { e.stopPropagation(); e.preventDefault(); });
e.stopPropagation()
Es la mejor solución.Esto también debería ayudar
fuente
'.dropdown-menu :not(.dropdown-item)'
para que al hacer clic en undropdown-item
cierre la ventana emergente, pero al hacer clic en undropdown-header
no.Bootstrap proporciona la siguiente función:
Por lo tanto, la implementación de esta función debería poder desactivar el cierre desplegable.
fuente
target
propiedad del evento es elli.dropdown
, elrelatedTarget
es ela.dropdown-toggle
. Por lo tanto, no puede hacer referencia al elemento en el que se hizo clic en elhide
controlador de eventos.target.hasClass(".keepopen")
debería sertarget.hasClass("keepopen")
. De lo contrario, el código no funcionará.La mejor respuesta absoluta es poner una etiqueta de formulario después del menú desplegable de la clase
entonces tu código es
fuente
<li>
elemento no debe estar dentro de un<form>
elemento.También encontré una solución.
Suponiendo que los
Twitter Bootstrap Components
controladores de eventos relacionados se delegan en eldocument
objeto, repito los controladores adjuntos y verifico si el elemento en el que se hace clic (o uno de sus padres) está afectado por un evento delegado.Espero que ayude a cualquiera que busque una solución similar.
Gracias por toda tu ayuda.
fuente
Esto podría ayudar:
fuente
Esto puede funcionar para cualquier condición.
fuente
jQuery:
HTML:
Manifestación :
Genérico: https://jsfiddle.net/kerryjohnson/omefq68b/1/
Su demo con esta solución: http://jsfiddle.net/kerryjohnson/80oLdtbf/101/
fuente
Intenté esta cosa simple y funcionó a las mil maravillas.
Cambié el elemento del menú desplegable de
<div>
a<form>
y funcionó bien.fuente
Recientemente tuve un problema similar y probé diferentes formas de resolverlo eliminando el atributo de datos
data-toggle="dropdown"
y escuchandoclick
conevent.stopPropagation()
llamadas.La segunda forma parece más preferible. También los desarrolladores de Bootstrap usan de esta manera. En el archivo fuente encontré la inicialización de los elementos desplegables:
Entonces, esta línea:
sugiere que puede colocar un
form
elemento dentro del contenedor con clase.dropdown
para evitar cerrar el menú desplegable.fuente
Bootstrap ha resuelto este problema ellos mismos en su soporte para
<form>
etiquetas en menús desplegables. Su solución es bastante comprensible y puede leerla aquí: https://github.com/twbs/bootstrap/blob/v4-dev/js/src/dropdown.jsSe reduce a evitar la propagación en el elemento del documento y hacerlo solo para eventos de tipo
'click.bs.dropdown.data-api'
que coinciden con el selector'.dropdown .your-custom-class-for-keep-open-on-click-elements'
.O en código
fuente
form
enfoque de los ejemplos no funciona para ustedes: estaba usando classdropleft
, pero también es necesariodropdown
para que el selector de formularios coincida.Modifiqué la respuesta de @ Vartan para que funcione con Bootstrap 4.3. Su solución ya no funciona con la última versión, ya que la
target
propiedad siempre devuelve la raíz del menú desplegablediv
sin importar dónde se colocó el clic.Aquí está el código:
fuente
$('.dropdown-keep-open').on('hide.bs.dropdown', ev => !(ev.clickEvent && $(ev.target).has(ev.clickEvent.target).length))
return !target.closest('.dropdown-keep-open').length)
. Dicho esto, esta es una gran solución! Encontré esto necesario para resolver este problema.fuente
Lo he actualizado una vez más para que sea lo más inteligente y funcional posible. ahora se cierra cuando pasa el cursor fuera del navegador y permanece abierto mientras está dentro. Simplemente perfecto.
fuente
show
, el menú desplegable no se cierra al hacer clic afuera, y tenemos que hacer clic en el botón desplegable antes de ... +1 de todos modosbody
evento de clic ^^$('body').on('click', function (e) {
Como por ejemplo Bootstrap 4 Alpha tiene este evento de menú. ¿Por qué no usar?
fuente
e.preventDefault();
bloquea enlaces, puede omitirloPuede detener la propagación del clic en el menú desplegable y luego volver a implementar manualmente los controles del carrusel utilizando los métodos de JavaScript del carrusel .
Aquí está el jsfiddle .
fuente
Con Angular2 Bootstrap, puede usar nonInput para la mayoría de los escenarios:
https://valor-software.com/ng2-bootstrap/#/dropdowns
fuente
Sé que esta pregunta fue específicamente para jQuery, pero para cualquiera que use AngularJS que tenga este problema, puede crear una directiva que maneje esto:
Luego simplemente agregue el atributo
dropdown-prevent-close
a su elemento que está activando el menú para cerrar, y debería evitarlo. Para mí, fue unselect
elemento que cerró automáticamente el menú:fuente
<div class="dropdown-menu" ng-click="$event.stopPropagation()">
funciona para mí en 1.2.x[Bootstrap 4 Alpha 6] [Rails] para los carriles desarrollador,
e.stopPropagation()
dará lugar a un comportamiento indeseable paralink_to
condata-method
no ser igual aget
, ya que lo hará por retorno por defecto toda su petición comoget
.Para solucionar este problema, sugiero esta solución, que es universal
Mostrar fragmento de código
fuente
En lugar de escribir un código javascript o jquery (reinventando la rueda). El escenario anterior se puede administrar mediante la opción de cierre automático de bootstrap. Puede proporcionar cualquiera de los valores para cerrar automáticamente :
siempre: (predeterminado) cierra automáticamente el menú desplegable cuando se hace clic en cualquiera de sus elementos.
outsideClick: cierra el menú desplegable automáticamente solo cuando el usuario hace clic en cualquier elemento fuera del menú desplegable.
disabled: desactiva el cierre automático
Eche un vistazo al siguiente plunkr:
http://plnkr.co/edit/gnU8M2fqlE0GscUQtCWa?p=preview
Conjunto
Espero que esto ayude :)
fuente
ui-bootstrap
, lo que probablemente no sea el caso para muchas personas que ven esta pregunta.uib-dropdown auto-close="outsideClick"
. El menú cerrado al hacer clic dentro es un poco incómodo, pero el menú que no se cierra al hacer clic afuera es bastante molesto.Sé que ya hay una respuesta anterior que sugiere utilizar un formulario, pero el marcado proporcionado no es correcto / ideal. Esta es la solución más fácil, no se necesita JavaScript en absoluto y no rompe su menú desplegable. Funciona con Bootstrap 4.
<form class="dropdown-item"> <!-- Your elements go here --> </form>
fuente
Esto me ayudo
El elemento del menú desplegable debe ser así (tome nota de las clases
dropdown-menu
ykeepopen
.El código anterior evita hacer una oferta en general
<body>
, en lugar del elemento específico con la clasedropdown-menu
.Espero que esto ayude a alguien.
Gracias.
fuente
La solución de trabajo más simple para mí es:
keep-open
la clase a elementos que no debe provocar el cierre desplegablefuente
No he encontrado que ninguna de las soluciones funcionó, ya que me gustaría usar el navegador de arranque predeterminado. Aquí está mi solución a este problema:
fuente
En
.dropdown
contenido, coloque la.keep-open
clase en cualquier etiqueta así:Los casos anteriores evitaban los eventos relacionados con los objetos del contenedor, ahora el contenedor hereda la clase keep-open y check antes de cerrarse.
fuente
Lo hice con esto:
fuente
fuente
Para cerrar el menú desplegable solo si se activó un evento de clic fuera del menú desplegable de arranque, esto es lo que funcionó para mí:
Archivo JS:
Archivo HTML:
fuente
Puede tener algunos problemas si usa el método return false o stopPropagation () porque sus eventos serán interrumpidos. Pruebe este código, funciona bien:
En HTML:
Si quieres cerrar el dropdrown:
fuente
En Bootstrap 4 también puedes hacer esto:
donde
#dd-link
está el elemento de anclaje o botón que tiene ladata-toggle="drowndown"
propiedadfuente