Actualmente estoy usando popovers con Twitter Bootstrap, iniciado así:
$('.popup-marker').popover({
html: true,
trigger: 'manual'
}).click(function(e) {
$(this).popover('toggle');
e.preventDefault();
});
Como puede ver, se activan manualmente, y al hacer clic en .popup-marker (que es un div con una imagen de fondo) alterna un popover. Esto funciona muy bien, pero me gustaría poder cerrar el popover con un clic en cualquier otro lugar de la página (¡pero no en el popover mismo!).
He intentado algunas cosas diferentes, incluidas las siguientes, pero sin resultados que mostrar:
$('body').click(function(e) {
$('.popup-marker').popover('hide');
});
¿Cómo puedo cerrar el popover con un clic en cualquier otro lugar de la página, pero no con un clic en el popover?
javascript
jquery
twitter-bootstrap
Travis Northcutt
fuente
fuente
Respuestas:
Suponiendo que solo se puede ver un popover en cualquier momento, puede usar un conjunto de banderas para marcar cuando hay un popover visible, y solo luego ocultarlos.
Si configura el detector de eventos en el cuerpo del documento, se activará cuando haga clic en el elemento marcado con 'marcador emergente'. Entonces tendrás que llamar
stopPropagation()
al objeto de evento. Y aplique el mismo truco al hacer clic en el popover.A continuación hay un código JavaScript que funciona que hace esto. Utiliza jQuery> = 1.7
http://jsfiddle.net/AFffL/539/
La única advertencia es que no podrás abrir 2 popovers al mismo tiempo. Pero creo que eso sería confuso para el usuario, de todos modos :-)
fuente
Esto es aún más fácil:
fuente
html
a causa dee.stopPropagation();
su lugar he usado algo parecido a$('.popup-marker').on('show', function(event) { $('.popup-marker').filter(function(index, element) { return element != event.target; }).popover('hide'); });
lo que hizo el buen trabajo también (no sé si hay una diferencia de rendimiento sin embargo)$(this).popover('toggle');
la parte Entonces, si tiene varios objetos 'popup-marcadoras', haciendo clic en cada uno se cerrará los otros..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 agradables.
El complemento se puede encontrar aquí .
Ejemplo de uso
javascript:
fuente
La solución aceptada me dio algunos problemas (al hacer clic en el elemento '.popup-marker' del popover abierto, los popovers no funcionaron después). Se me ocurrió esta otra solución que funciona perfectamente para mí y es bastante simple (estoy usando Bootstrap 2.3.1):
ACTUALIZACIÓN: ¡Este código también funciona con Bootstrap 3!
fuente
if (!$(e.target).is('.popup-marker') && !$(e.target).parents('.popover').length > 0)
de esa manera la ventana emergente no se cerrará incluso si se trata tiene contenido HTMLif (!$(e.target).is('.popup-marker') && $(e.target).closest('.popover').length === 0)
lea "Descartar en el siguiente clic" aquí http://getbootstrap.com/javascript/#popovers
Puede usar el desencadenador de foco para descartar los popovers en el siguiente clic, pero debe usar la
<a>
etiqueta, no la<button>
etiqueta, y también debe incluir untabindex
atributo ...Ejemplo:
fuente
tooltip
, incluso si no se menciona claramente en el documento real.Todas las respuestas existentes son bastante débiles, ya que dependen de capturar todos los eventos del documento y luego encontrar popovers activos o modificar la llamada a
.popover()
.Un enfoque mucho mejor es escuchar los
show.bs.popover
eventos en el cuerpo del documento y luego reaccionar en consecuencia. A continuación se muestra un código que cerrará las ventanas emergentes cuando se haga clic en el documento o escse presione, solo vincula los oyentes de eventos cuando se muestran las ventanas emergentes:fuente
$(event.target).data("bs.popover").inState.click = false;
a la función onPopoverHide para que no necesite hacer clic dos veces para volver a abrir después de cerrar.https://github.com/lecar-red/bootstrapx-clickover
Es una extensión de popover de arranque de twitter y resolverá el problema de manera muy simple.
fuente
Por alguna razón, ninguna de las otras soluciones aquí funcionó para mí. Sin embargo, después de mucha resolución de problemas, finalmente llegué a este método que funciona perfectamente (al menos para mí).
En mi caso, estaba agregando un popover a una mesa y colocándolo absolutamente encima / debajo del
td
que se hizo clic. La selección de la tabla fue manejada por jQuery-UI Seleccionable, así que no estoy seguro de si eso estaba interfiriendo. Sin embargo, cada vez que hacía clic dentro del popover, mi controlador de clics dirigido$('.popover')
nunca funcionaba y el manejo de eventos siempre se delegaba al$(html)
controlador de clics. Soy bastante nuevo en JS, ¿tal vez solo me falta algo?De todos modos, ¡espero que esto ayude a alguien!
fuente
Doy todos mis anclas popovers la clase
activate_popover
. Los activo todos a la vez$('body').popover({selector: '.activate-popover', html : true, container: 'body'})
para que funcione la funcionalidad de clics de distancia que uso (en script de café):
Que funciona perfectamente bien con bootstrap 2.3.1
fuente
.prev()
la primeraif
cláusula. Estoy usando Bootstrap 3.2.0.2, ¿tal vez hay una diferencia? Además, puede omitir toda la segundaif
cláusula si desea poder abrir varias ventanas emergentes al mismo tiempo. Simplemente haga clic en cualquier lugar que no sea un elemento activador de popover (clase 'activar-popover' en este ejemplo) para cerrar todos los popovers abiertos. ¡Funciona genial!Aunque hay muchas soluciones aquí, me gustaría proponer la mía también, no sé si hay alguna solución que resuelva todo, pero probé 3 de ellas y tuvieron problemas, como hacer clic en el popover en sí mismo, lo oculta, otros que si tuviera otros botones de popover haciendo clic en ambos / múltiples popovers todavía aparecerían (como en la solución seleccionada), Sin embargo, este lo solucionó todo
fuente
Establecería el foco en la ventana emergente recién creada y la eliminaría en el desenfoque. De esa manera, no es necesario verificar en qué elemento del DOM se ha hecho clic y se puede hacer clic en el elemento emergente, y también se puede seleccionar: no perderá su foco y no desaparecerá.
El código:
fuente
Aquí está la solución que funcionó muy bien para mí, si puede ayudar:
fuente
Aquí está mi solución, por lo que vale:
fuente
Tuve algún problema para que funcione en bootstrap 2.3.2. Pero lo he querido de esta manera:
fuente
modificó ligeramente la solución de @David Wolever:
fuente
Esta pregunta también se hizo aquí y mi respuesta proporciona no solo una forma de comprender los métodos de recorrido de jQuery DOM sino también 2 opciones para manejar el cierre de popovers haciendo clic afuera.
Abra múltiples popovers a la vez o un popover a la vez.
¡Además, estos pequeños fragmentos de código pueden manejar el cierre de botones que contienen iconos!
https://stackoverflow.com/a/14857326/1060487
fuente
Este funciona como un encanto y lo uso.
Abrirá el popover cuando haga clic y, si vuelve a hacer clic, se cerrará; también, si hace clic fuera del popover, el popover se cerrará.
Esto también funciona con más de 1 popover.
fuente
Otra solución, cubrió el problema que tuve al hacer clic en los descendientes del popover:
fuente
Lo hago como abajo
¡Espero que esto ayude!
fuente
Si estás intentando usar popover bootstrap de twitter con pjax, esto funcionó para mí:
fuente
@RayOnAir, tengo el mismo problema con las soluciones anteriores. También me acerco a la solución @RayOnAir. Una cosa que mejoró es cerrar el popover ya abierto al hacer clic en otro marcador de popover. Entonces mi código es:
fuente
Encontré que esta es una solución modificada de la sugerencia de pbaron anterior, porque su solución activó el popover ('ocultar') en todos los elementos con la clase 'popup-marker'. Sin embargo, cuando usa popover () para contenido html en lugar del contenido de datos, como lo hago a continuación, cualquier clic dentro de esa ventana emergente html realmente activa el popover ('hide'), que cierra rápidamente la ventana. El siguiente método itera a través de cada elemento .popup-marker y descubre primero si el padre está relacionado con la identificación del marcador .popup en el que se hizo clic, y si es así, no lo oculta. Todos los demás divs están ocultos ...
fuente
Se me ocurrió esto:
Mi escenario incluyó más popovers en la misma página, y ocultarlos los hizo 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 'alternar' el popover activo. Hacerlo cerrará el popover por completo.
fuente
Estaba tratando de hacer una solución simple para un problema simple. Las publicaciones anteriores son buenas pero muy complicadas para un problema simple. Entonces hice una cosa simple. Acabo de agregar un botón de cierre. Es perfecto para mi.
fuente
Me gusta esto, simple pero efectivo.
fuente
Agregue
btn-popover
clase a su botón / enlace de popover que abre el popover. Este código cerrará los popovers al hacer clic fuera de él.fuente
Una solución aún más fácil, solo recorre todos los popovers y oculta si no
this
.fuente
Para que quede claro, solo activa el popover
fuente
Esto debería funcionar en Bootstrap 4:
Explicación:
fuente
Intenta en
data-trigger="focus"
lugar de"click"
.Esto resolvió mi problema.
fuente