¿Podemos hacer que los popovers sean descartables de la misma manera que los modales, es decir. ¿cerrarlos cuando el usuario hace clic en algún lugar fuera de ellos?
Desafortunadamente, no puedo usar modal real en lugar de popover, porque modal significa posición: fijo y eso ya no sería popover. :(
twitter-bootstrap
popover
Ante Vrli
fuente
fuente
data-trigger="hover"
ydata-trigger="focus"
son una alternativa incorporada para cerrar el popover, si no desea usar alternar. En mi opinión,data-trigger="hover"
proporciona la mejor experiencia de usuario ... no hay necesidad de escribir código .js extra ...Respuestas:
Actualización: una solución un poco más robusta: http://jsfiddle.net/mattdlockyer/C5GBU/72/
Para botones que solo contienen texto:
Para los botones que contienen iconos, use (este código tiene un error en Bootstrap 3.3.6, consulte la solución a continuación en esta respuesta)
Para popovers generados por JS Uso
'[data-original-title]'
en lugar de'[data-toggle="popover"]'
Advertencia: La solución anterior permite que se abran múltiples popovers a la vez.
Un popover a la vez, por favor:
Actualización: Bootstrap 3.0.x, ver código o violín http://jsfiddle.net/mattdlockyer/C5GBU/2/
Esto maneja el cierre de popovers ya abiertos y sin hacer clic o sus enlaces no se han hecho clic.
Actualización: Bootstrap 3.3.6, ver violín
Soluciona el problema donde, después del cierre, toma 2 clics para volver a abrir
Actualización: Utilizando el condicional de la mejora anterior, se logró esta solución. Solucione el problema de doble clic y popover fantasma:
fuente
$(document)
lugar de$('body')
ya que a vecesbody
no se extiende por toda la página.'[data-toggle="popover"]'
, que no funciona con popovers generados por JavaScript, utilicé'[data-original-title]'
como selector.Esto cierra todos los elementos emergentes si hace clic en cualquier lugar excepto en un elemento emergente
ACTUALIZACIÓN para Bootstrap 4.1
fuente
La versión más simple, más segura , funciona con cualquier versión de arranque.
Demostración: http://jsfiddle.net/guya/24mmM/
Demostración 2: no descartar al hacer clic dentro del contenido emergente http://jsfiddle.net/guya/fjZja/
Demostración 3: Popovers múltiples: http://jsfiddle.net/guya/6YCjW/
Simplemente llamando a esta línea descartará todos los popovers:
Descarta todos los popovers al hacer clic afuera con este código:
El fragmento de arriba adjunta un evento de clic en el cuerpo. Cuando el usuario hace clic en un popover, se comportará de manera normal. Cuando el usuario hace clic en algo que no es un popover, cerrará todos los popovers.
También funcionará con popovers que se inician con Javascript, a diferencia de otros ejemplos que no funcionarán. (ver la demostración)
Si no desea descartar al hacer clic dentro del contenido emergente, use este código (vea el enlace a la segunda demostración):
fuente
!$(e.target).closest('.popover.in').length
sería más eficiente que!$(e.target).parents().is('.popover.in')
.Con Bootstrap 2.3.2 puede configurar el disparador para 'enfocar' y simplemente funciona:
fuente
Básicamente, esto no es muy complejo, pero hay que hacer algunas comprobaciones para evitar problemas técnicos.
Demostración (jsfiddle)
fuente
popover()
clic en lugar de pasar el mouse por encima?stopPropagation()
al evento pasado al controlador de clics (si no, el controlador de ocultación oculta inmediatamente el popover). Demostración (jsfiddle)Ninguna de las supuestas soluciones de alta votación me funcionó correctamente. Cada uno conduce a un error cuando, después de abrir y cerrar (haciendo clic en otros elementos) el popover por primera vez, no se abre de nuevo, hasta que haga dos clics en el enlace de activación en lugar de uno.
Así que lo modifiqué un poco:
fuente
Hice un jsfiddle para mostrarle cómo hacerlo:
http://jsfiddle.net/3yHTH/
La idea es mostrar el popover cuando hace clic en el botón y ocultar el popover cuando hace clic fuera del botón.
HTML
JS
fuente
jsfiddle bootstrap
y me dio el esqueleto de bootstrap css + js en jsfiddle.simplemente agregue este atributo con el elemento
fuente
Esto se ha preguntado antes aquí . La misma respuesta que di entonces aún se aplica:
Tenía una necesidad similar, y encontré esta pequeña gran extensión del Twitter Bootstrap Popover de Lee Carmichael, llamada BootstrapX - clickover . Él también tiene algunos ejemplos de uso aquí . Básicamente, cambiará el popover a un componente interactivo que se cerrará cuando haga clic en otra parte de la página, o en un botón de cierre dentro del popover. Esto también permitirá múltiples popovers abiertos a la vez y un montón de otras características interesantes.
fuente
Esto es tarde para la fiesta ... pero pensé en compartirlo. Me encanta el popover pero tiene muy poca funcionalidad incorporada. Escribí una extensión de arranque .bubble () que es todo lo que me gustaría que fuera Popover. Cuatro formas de despedir. Haga clic afuera, active el enlace, haga clic en la X y presione escapar.
Se posiciona automáticamente para que nunca se salga de la página.
https://github.com/Itumac/bootstrap-bubble
Esta no es una autopromoción gratuita ... He tomado el código de otras personas tantas veces en mi vida que quería ofrecer mis propios esfuerzos. Dale una vuelta y mira si te funciona.
fuente
De acuerdo con http://getbootstrap.com/javascript/#popovers ,
Use el desencadenador de foco para descartar popovers en el siguiente clic que haga el usuario.
fuente
<a>
etiqueta, no la<button>
etiqueta, y también debe incluir elrole="button"
ytabindex
atributos ". ¿Lo probaste con estas especificaciones?Solución aceptada modificada. Lo que he experimentado es que después de ocultar algunos popovers, tendrían que hacer clic dos veces para volver a aparecer. Esto es lo que hice para asegurarme de que no se llamara a popover ('hide') en popovers ya ocultos.
fuente
Simplemente agregue este atributo al elemento html para cerrar popover en el siguiente clic.
referencia de https://getbootstrap.com/docs/3.3/javascript/#popovers
fuente
Esta solución funciona bien:
fuente
fuente
También puede usar el burbujeo de eventos para eliminar la ventana emergente del DOM. Está un poco sucio, pero funciona bien.
En su HTML, agregue la clase .popover-close al contenido dentro del popover que debería cerrar el popover.
fuente
Parece que el método 'ocultar' no funciona si crea el popover con delegación de selector, en su lugar, debe usarse 'destruir'.
Lo hice funcionar así:
JSfiddle aquí
fuente
Descubrimos que teníamos un problema con la solución de @mattdlockyer (¡gracias por la solución!). Al usar la propiedad de selector para el constructor de popover como este ...
... la solución propuesta para BS3 no funcionará. En su lugar, crea una segunda instancia de popover local a su
$(this)
. Aquí está nuestra solución para evitar eso:Como se mencionó
$(this).popover('hide');
, creará una segunda instancia debido al oyente delegado. La solución proporcionada solo oculta popovers que ya están instanciados.Espero poder ahorrarles algo de tiempo.
fuente
Bootstrap lo admite de forma nativa :
JS Bin Demo
fuente
esta solución elimina el molesto segundo clic al mostrar el popover por segunda vez
probado con Bootstrap v3.3.7
fuente
He intentado muchas de las respuestas anteriores, realmente nada funciona para mí, pero esta solución lo hizo:
https://getbootstrap.com/docs/3.3/javascript/#dismiss-on-next-click
Ex:
fuente
Se me ocurrió esto: mi escenario incluía más popovers en la misma página, y ocultarlos los hacía invisibles y, por eso, no fue posible hacer clic en los elementos detrás del popover. La idea es marcar el enlace de popover específico como 'activo' y luego simplemente puede 'alternar' el popover activo. Hacerlo cerrará el popover completamente $ ('. Popover-link'). Popover ({html: true, container: 'body'})
fuente
Simplemente elimino otros popovers activos antes de que se muestre el nuevo popover (bootstrap 3):
fuente
probado con 3.3.6 y el segundo clic está bien
fuente
demostración: http://jsfiddle.net/nessajtr/yxpM5/1/
}
Esta es mi solución para ello.
fuente
Este enfoque garantiza que pueda cerrar una ventana emergente haciendo clic en cualquier lugar de la página. Si hace clic en otra entidad en la que se puede hacer clic, oculta todos los demás elementos emergentes. La animación: se requiere falso; de lo contrario, obtendrá un error jquery .remove en su consola.
fuente
Ok, este es mi primer intento de responder algo en stackoverflow, así que aquí no pasa nada: P
Parece que no está del todo claro que esta funcionalidad realmente funcione de forma inmediata en el último arranque (bueno, si estás dispuesto a comprometer dónde puede hacer clic el usuario. No estoy seguro de si tienes que poner 'clic' pase el mouse 'per-se pero en un iPad, el clic funciona como una palanca.
El resultado final es que en un escritorio puede desplazarse o hacer clic (la mayoría de los usuarios se desplazarán). En un dispositivo táctil, tocar el elemento lo abrirá y tocarlo nuevamente lo derribará. Por supuesto, este es un pequeño compromiso de su requisito original, pero al menos su código ahora está más limpio :)
fuente
Tomando el código de Matt Lockyer, hice un reinicio simple para que el elemento dom no se cubra en hide.
Código de Matt: http://mattlockyer.com/2013/04/08/close-a-twitter-bootstrap-popover-when-clicking-outside/
Violín: http://jsfiddle.net/mrsmith/Wd2qS/
fuente
Prueba esto, esto se ocultará haciendo clic afuera.
fuente
Estaba teniendo problemas con la solución de mattdlockyer porque estaba configurando enlaces popover dinámicamente usando un código como este:
Así que tuve que modificarlo así. Me solucionó muchos problemas:
Recuerde que destruir elimina el elemento, por lo que la parte del selector es importante para inicializar los popovers.
fuente