Associa una funzione a Twitter Bootstrap Modal Close


530

Sto usando la libreria Twitter Bootstrap su un nuovo progetto e voglio che parte della pagina aggiorni e recuperi gli ultimi dati json alla chiusura modale. Non vedo questo da nessuna parte nella documentazione qualcuno può indicarmelo o suggerire una soluzione.

Due problemi con l'utilizzo dei metodi documentati

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

Allego una classe "nascondi" al modale già in modo che non venga visualizzato al caricamento della pagina in modo che venga caricato due volte

anche se rimuovo la classe hide e imposto l'id element su display:nonee aggiungo console.log("THE MODAL CLOSED");alla funzione sopra quando premo close non succede nulla.

Risposte:


1139

Bootstrap 3 e 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…
});

Vedi getbootstrap.com/2.3.2/javascript.html#modals → Eventi


1
Questo sembra funzionare tranne che, per qualche motivo, quando passa sopra un pulsante nel piè di pagina modale si attiva anche. Il pulsante è un pulsante di invio regolare: <input type = "submit" class = "btn btn-info" value = "Go" /> Qualche idea su come non attivare l'evento hide quando ci si passa sopra? Oppure, come posso rilevare che è stato sparato a causa dell'hover? A proposito: anche se l'evento viene generato la finestra di dialogo modale non si chiude.
Guy

2
Non vedo questo comportamento con Bootstrap 3, puoi fare un violino?
sp00n,

7
Questa risposta dovrebbe probabilmente menzionare la differenza tra hidden.bs.modal e hide.bs.modal. Nascosto viene generato quando le animazioni CSS sono complete, ma nei miei test se non ci sono animazioni, non si attiva mai (potrebbe essere solo un bug). Se lavori con la gestione dei dati, potrebbe essere più sicuro usare hide.bs.modal, che viene attivato non appena viene chiamato .modal ('hide'). getbootstrap.com/javascript/#modals-usage - Vedi sottosezione Eventi.
Evan Steinkerchner,

2
Bootstrap 3: funziona quando faccio clic su un tag modale contrassegnato come data-dismiss="modal"(come un pulsante di chiusura), ma non funziona quando faccio clic sull'area di sfondo nero che circonda il modale. Il modale viene respinto ma non può essere riaperto fino a quando la pagina non viene aggiornata. Ho provato entrambi 'hidden.bs.modal'e 'hide.bs.modal'senza successo .
marquito

5
@marquito Quello che puoi fare (quello che faccio) è usarlo in questo modo: in $('#myModal').modal({ backdrop: 'static', keyboard: false });questo modo, il modale non si chiuderà quando fai clic sull'area grigia, né quando premi il tasto Esc.
aesede,

123

Bootstrap 4

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

Vedi questo JSFiddle per un esempio funzionante:

https://jsfiddle.net/6n7bg2c9/

Consulta la sezione Eventi modali dei documenti qui:

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


1
Per chiunque trovi questo post cercando di implementare questo tipo di callback, c'è un modulo di estensione per Bootstrap che include questa funzionalità e molte altre utili funzioni per creare dinamicamente dialoghi / avvisi / conferme: bootboxjs.com
jkriddle

La risposta di @Ricardo Lima di seguito è ora il metodo corretto per monitorare gli eventi in jQuery / bootstrap
sbonami il

@meatballs ha ancora un voto positivo per l'esempio funzionante ... anche se il bind è stato deprecato.
Stephen Patten,

@ 100acrewood Dude, ora è una scoperta! Grazie! re: bootboxjs.com
Stephen Patten,

46

Avvio di Bootstrap 3 ( modifica: sempre lo stesso in Bootstrap 4 ) ci sono 2 istanze in cui è possibile avviare eventi, essendo:

1. Quando inizia l'evento "nascondi" modale

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

2. Al termine dell'evento modale "nascondi"

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

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


1
Questo mi ha aiutato a correggere il mio bug modale Bootstrap in cui avrebbe aggiunto 15px di padding, proprio al corpo alla chiusura di qualsiasi modale. Grazie!
Sam Malayek,

2
Buono per mostrare i 2 eventi. Meglio per i principianti come me notare che questo deve essere posizionato al di sotto del modale affinché l'evento venga attivato.
Lynnell Emmanuel Neri,

18

Invece di "live" devi usare l'evento "on", ma assegnalo all'oggetto documento:

Uso:

$(document).on('hidden.bs.modal', '#Control_id', function (event) {
// code to run on closing
});

1
Ecco come devi farlo se il modale viene aggiunto in modo dinamico. Mi ha salvato un sacco di tempo.
Dylan Vander Berg,

15
$(document.body).on('hidden.bs.modal', function () {
    $('#myModal').removeData('bs.modal')
});

6

Bootstrap fornisce eventi che è possibile agganciare in modale , ad esempio se si desidera generare un evento quando il modale ha finito di essere nascosto all'utente, è possibile utilizzare un evento hidden.bs.modal come questo

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

Controlla un violino funzionante qui leggi di più sui metodi modali ed eventi qui nella Documentazione


4

Bootstrap 4:

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

hide.bs.modal : questo evento viene generato immediatamente quando è stato chiamato il metodo dell'istanza hide.

hidden.bs.modal : questo evento viene generato quando il modale ha finito di essere nascosto all'utente (attenderà il completamento delle transizioni CSS).


Questo modo è valido anche per BS3. Vedere la risposta accettata per il modo BS2 (obsoleto).
Roland

3

Lo farei così:

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

Il resto è già stato scritto da altri. Consiglio anche di leggere la documentazione: metodo jquery - on


2

Ho visto molte risposte riguardo agli eventi bootstrap come quello hide.bs.modalche si innesca alla chiusura del modale.

C'è un problema con quegli eventi: qualsiasi popup nel modale (popovers, tooltip, ecc.) Attiverà quell'evento.

C'è un altro modo per catturare l'evento quando un modale si chiude.

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

Bootstrap utilizza la inclasse quando il modale è aperto. È molto importante utilizzare l' hiddenevento poiché la classe inè ancora definita quando hideviene attivato l'evento .

Questa soluzione non funzionerà in IE8 poiché IE8 non supporta il :not()selettore Jquery .


2

Avevo gli stessi problemi di alcuni con

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

Devi posizionarlo in fondo alla pagina, posizionandolo in alto non si accende mai l'evento.


Infatti. È positivo che tu abbia detto che deve essere posizionato al di sotto del modale per attivare l'evento.
Lynnell Emmanuel Neri,

Definirei le regole leggermente più rigorose di così. Quando $("#myModal")viene richiamato il selettore jQuery l'elemento HTML con un ID di myModalnecessità deve esistere nel DOM. Quindi potresti avere questo codice nella parte superiore della pagina ma inserito in una $(document).on("ready", function(){ ... });(o funzione simile chiamata dopo che il DOM è stato popolato con l'elemento).
Andy Gee,

0

se vuoi attivare una funzione ad ogni chiusura modale, puoi utilizzare questo metodo,

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

Quindi non è necessario specificare gli ID modali ogni volta.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.