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.

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


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


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


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
});

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')
});

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.


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).


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


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 .


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.


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.