Vincula una función a Twitter Bootstrap Modal Close

530

Estoy usando la biblioteca de Bootstrap de Twitter en un nuevo proyecto y quiero que parte de la página se actualice y recupere los últimos datos json en el cierre modal. No veo esto en ninguna parte de la documentación, ¿alguien puede señalarme o sugerir una solución?

Dos problemas con el uso de los métodos documentados.

 $('#my-modal').bind('hide', function () {
   // do something ...
 });

Adjunto una clase "hide" al modal ya para que no se muestre en la carga de la página, por lo que se cargaría dos veces

incluso si elimino la clase hide y configuro la identificación del elemento display:noney la agrego console.log("THE MODAL CLOSED");a la función anterior cuando presiono cerrar, no sucede nada.

BillPull
fuente

Respuestas:

1139

Bootstrap 3 y 4

$('#myModal').on('hidden.bs.modal', function () {
    // do something…
});

Bootstrap 3: getbootstrap.com/javascript/#modals-events

Bootstrap 4: getbootstrap.com/docs/4.1/components/modal/#events

Bootstrap 2.3.2

$('#myModal').on('hidden', function () {
    // do something…
});

Ver getbootstrap.com/2.3.2/javascript.html#modals → Eventos

Ricardo Lima
fuente
1
Esto parece funcionar, excepto que, por alguna razón, al pasar el mouse sobre un botón en el pie de página modal también se activa. El botón es un botón de envío normal: <input type = "submit" class = "btn btn-info" value = "Go" /> ¿Alguna idea de cómo no hacer que se active el evento hide al pasar el mouse sobre él? O, ¿cómo puedo detectar que se disparó debido al vuelo estacionario? Por cierto: aunque el evento se dispara, el diálogo modal no se cierra.
Chico
2
No veo este comportamiento con Bootstrap 3, ¿puedes hacer un violín?
sp00n
77
Esta respuesta probablemente debería mencionar la diferencia entre hidden.bs.modal y hide.bs.modal. Oculto se dispara cuando se completan las animaciones CSS, pero en mis pruebas si no hay animaciones, nunca se dispara (aunque podría ser un error). Si está trabajando con la gestión de datos, podría ser más seguro usar hide.bs.modal, que se activa tan pronto como se llama a .modal ('hide'). getbootstrap.com/javascript/#modals-usage : consulte la subsección Eventos.
Evan Steinkerchner
2
Bootstrap 3: funciona cuando hago clic en una etiqueta modal marcada como data-dismiss="modal"(como un botón de cierre), pero no funciona cuando hago clic en el área de fondo negro que rodea el modal. El modal se descarta pero no se puede volver a abrir hasta que se actualice la página. He intentado ambos 'hidden.bs.modal'y fue 'hide.bs.modal'en vano.
marquito
55
@marquito Lo que puedes hacer (lo que hago) es usarlo así: de $('#myModal').modal({ backdrop: 'static', keyboard: false });esa manera, el modal no se cerrará cuando hagas clic en el área gris, ni cuando presiones la tecla Esc.
aesede
123

Bootstrap 4

$('#my-modal').on('hidden.bs.modal', function () {
  window.alert('hidden event fired!');
});

Vea este JSFiddle para un ejemplo de trabajo:

https://jsfiddle.net/6n7bg2c9/

Vea la sección de eventos modales de los documentos aquí:

https://getbootstrap.com/docs/4.3/components/modal/#events

aar0n
fuente
1
Para cualquiera que encuentre esta publicación buscando implementar este tipo de devolución de llamada, hay un módulo de extensión para Bootstrap que incluye esta funcionalidad, así como muchas otras funciones útiles para crear dinámicamente diálogos / alertas / confirmaciones: bootboxjs.com
jkriddle
La respuesta de @Ricardo Lima a continuación es ahora el método correcto para monitorear eventos en jQuery / bootstrap
sbonami
@meatballs sigue siendo un voto positivo para el ejemplo de trabajo ... aunque bind ha quedado en desuso.
Stephen Patten
@ 100acrewood Dude, ¡eso es un hallazgo! ¡Gracias! re: bootboxjs.com
Stephen Patten
46

Al iniciar Bootstrap 3 ( editar: sigue siendo el mismo en Bootstrap 4 ) hay 2 instancias en las que puede iniciar eventos, siendo:

1. Cuando comienza el evento modal "hide"

$('#myModal').on('hide.bs.modal', function () { 
    console.log('Fired at start of hide event!');
});  

2. Cuando finaliza el evento modal "ocultar"

$('#myModal').on('hidden.bs.modal', function () {
    console.log('Fired when hide event has finished!');
});

Ref: http://getbootstrap.com/javascript/#js-events

aesede
fuente
1
Esto me ayudó a corregir mi error modal Bootstrap donde agregaría 15px de relleno derecho al cuerpo al cerrar cualquier modal. ¡Gracias!
Sam Malayek
2
Bueno para mostrar los 2 eventos. Es mejor que los principiantes como yo tengan en cuenta que esto debe colocarse debajo del modal para que el evento sea despedido.
Lynnell Emmanuel Neri
18

En lugar de "en vivo" debe usar el evento "on", pero asignarlo al objeto del documento:

Utilizar:

$(document).on('hidden.bs.modal', '#Control_id', function (event) {
// code to run on closing
});
Oscar
fuente
1
Así es como debe hacerlo si el modal se agrega dinámicamente. Me ahorró un montón de tiempo.
Dylan Vander Berg
15
$(document.body).on('hidden.bs.modal', function () {
    $('#myModal').removeData('bs.modal')
});
SUNny.K
fuente
6

Bootstrap proporciona eventos que puede enganchar en modal , como si deseaactivarun evento cuando el modal ha terminado de ocultarse para el usuario, puede usar elevento hidden.bs.modal como este

    /* hidden.bs.modal event example */
    $('#myModal').on('hidden.bs.modal', function () {
          window.alert('hidden event fired!');
    })

Verifique un violín de trabajo aquí. Lea más sobre métodos modales y eventos aquí en Documentación.

Subodh Ghulaxe
fuente
4

Bootstrap 4:

$('#myModal').on('hidden.bs.modal', function (e) {
   // call your method
})

hide.bs.modal : este evento se activa inmediatamente cuando se llama al método de instancia de hide.

hidden.bs.modal : este evento se activa cuando el modal ha terminado de ocultarse al usuario (esperará a que se completen las transiciones CSS).

sendon1982
fuente
Esta forma también es válida para BS3. Consulte la respuesta aceptada para BS2 (en desuso).
Roland
3

Lo haría así:

$('body').on('hidden.bs.modal', '#myModal', function(){ //this call your method });

El resto ya ha sido escrito por otros. También recomiendo leer la documentación: jquery - en el método

tkartas
fuente
2

He visto muchas respuestas con respecto a los eventos bootstrap, como hide.bs.modalqué se dispara cuando se cierra el modal.

Hay un problema con esos eventos: cualquier ventana emergente en el modal (popovers, información sobre herramientas, etc.) activará ese evento.

Hay otra forma de atrapar el evento cuando se cierra un modal.

$(document).on('hidden','#modal:not(.in)', function(){} );

Bootstrap usa la inclase cuando el modal está abierto. Es muy importante usar el hiddenevento ya que la clase intodavía está definida cuando hidese desencadena el evento .

Esta solución no funcionará en IE8 ya que IE8 no es compatible con el :not()selector Jquery .

Tortus
fuente
2

Estaba teniendo los mismos problemas que algunos con

$('#myModal').on('hidden.bs.modal', function () {
// do something… })

Debe colocar esto en la parte inferior de la página, y colocarlo en la parte superior nunca activa el evento.

Michael Granger
fuente
En efecto. Es bueno que hayas mencionado que debe colocarse debajo del modal para activar el evento.
Lynnell Emmanuel Neri
Definiría las reglas un poco más estrictas que eso. Cuando $("#myModal")se invoca el selector jQuery, el elemento HTML con un ID de myModalnecesidades debe existir en el DOM. Por lo tanto, podría tener este código en la parte superior de la página pero ubicado dentro de una $(document).on("ready", function(){ ... });(o función similar que se llama después de que el DOM se llena con el elemento).
Andy Gee
0

si desea activar una función en cada cierre modal, puede usar este método,

$(document).ready(function (){
    $('.modal').each(function (){
        $(this).on('hidden.bs.modal', function () {
            //fires when evey popup close. Ex. resetModal();
        });
    });
});

Por lo tanto, no necesita especificar identificadores modales cada vez.

Sahan
fuente