Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Problema con Bootstrap e modal chiuso con Javascript

    ciao!

    io ho questo modal fatto con bootstrap:
    codice:
    <div class="modal fade modal-vertical-centered" id="modal_wait" role="dialog">
        <div class="modal-dialog">
            <div class="modal-content">
                <div class="modal-body">
                    <i class="fa fa-spinner fa-5x fa-spin"></i>
                </div>
            </div>
        </div>
    </div>
    questo viene lanciato quando richiamo delle funzioni ajax; ad esempio:
    codice:
    function importFornitori() {
        $.ajax({
            type: "GET",
            url: '.............',
            beforeSend: function (xhr) {
                $('#modal_wait').modal('show');
            }
        }).done(function (res) {
            $('#modal_wait').modal('hide');
            console.log('OK');
        }).fail(function (err) {
            $('#modal_wait').modal('hide');
            alert("ERRORE import store: " + err);
        }).always(function () {
            $('#modal_wait').modal('hide');
        });
    }
    in pratica:
    - avvio la funzione da un button
    - si visualizza la finestra modale
    - viene eseguita l'operazione remota
    - in console compare ok (quindi non si sono errori)
    - ma la finestra modale rimane aperta

    qualche idea??

  2. #2
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    Ciao, ho provato a riprodurre la situazione secondo quanto hai postato ma non vedo il problema.
    Qui il test su bootly.
    Cliccando sul pulsante si apre la finestra modale che viene regolarmente chiusa dopo qualche secondo. In questo caso avverrà sicuramente un errore dopo la chiamata Ajax perché l'url è fittizio, ma in qualunque caso verrebbe comunque eseguito il .modal('hide').

    Io non vedo il problema. Potrebbe essere altrove da qualche altra parte nel tuo progetto.
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  3. #3
    Moderatore di Javascript L'avatar di ciro78
    Registrato dal
    Sep 2000
    residenza
    Napoli
    Messaggi
    8,514
    console degli errori?

    Mi pare, ma verifica la documentazione di jQuery, che se metti del codice in always non ha senso duplicarlo in success ed error.
    Ciro Marotta - Programmatore JAVA - PHP
    Preferisco un fallimento alle mie condizioni che un successo alle condizioni altrui.


  4. #4
    ciao!

    allora, always l'ho levato, era solo un tentativo.
    in console niente errori, esce solo l'ok.

    e cambiando la funzione così, non ci sono problemi:
    codice:
    function importFornitori() {
        $.ajax({
            type: "GET",
            url: '.............',
            beforeSend: function (xhr) {
                $('#modal_wait').modal('show');
            }
        }).done(function (res) {
    //        $('#modal_wait').modal('hide');
            window.location.reload(true);
        }).fail(function (err) {
            $('#modal_wait').modal('hide');
            alert("ERRORE import store: " + err);
        });
    }
    il refresh viene correttamente eseguito nel done.

    detto ciò, ho fatto qualche test.
    in bootstrap 3 in effetti funziona senza problemi.
    il problema si presenta in bootstrap 4.
    inoltre ho notato che non si presenta sempre.
    se dovessi fare una percentuale, direi nel 60% dei casi.
    a volta si e a volte no, anche nella stessa funzione.

  5. #5
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    Quote Originariamente inviata da fermat
    e cambiando la funzione così, non ci sono problemi:
    ...
    il refresh viene correttamente eseguito nel done.
    Chiaro, con location.reload stai ricaricando la pagina, quindi quel modal, anche se fosse stato aperto, te lo ritroverai chiuso dopo il refresh della pagina. Ma questo prescinde dal problema in questione.
    Quote Originariamente inviata da fermat
    in bootstrap 3 in effetti funziona senza problemi.
    il problema si presenta in bootstrap 4.
    Sì, hai ragione, ho fatto qualche altro test con bootstrap 4 e il problema effettivamente si presenta, eccome.

    Dopo qualche accurata ricerca posso dirti che il problema dipendere dal fatto che la chiusura del modal sia richiamata mentre ancora sta avvenendo l'animazione di apertura (animazione dovuta all'applicazione della classe fade), quindi l'azione di chiusura viene praticamente bypassata. Infatti, il fatto che ti succede random, è dovuto ai tempi di attesa della risposta dopo la chiamata AJAX, che sono chiaramente casuali o quantomeno non prevedibili. Se l'attesa è abbastanza lunga da far terminare l'animazione di apertura (quindi il completamento del fade), allora anche la chiusura sarà eseguita; al contrario, se l'attesa è troppo breve perché sia terminata l'animazione di apertura, allora l'azione di chiusura sarà allegramente snobbata.

    Puoi testare semplicemente con una cosa del genere:
    codice:
    $('#modal_wait').modal('show');
    $('#modal_wait').modal('hide');
    La finestra modale resterà aperta nonostante sia chiamata la chiusura subito dopo la sua apertura e (importante) in console riceverai, da JavaScript, un errore di questo tipo: "Error: Modal is transitioning", che la dice tutta.

    Forse una piccola carenza nella gestione delle animazioni del modal, ma comunque risolvibile o aggirabile in qualche modo.

    Se puoi fare a meno dell'animazione fade, ti basterà togliere questa classe dal tag HTML e hai risolto. Certo è un modo drastico.

    "Ma no! l'effetto dissolvenza ci dev'essere, ecchecavolo!!!"

    In questo caso non ci sono metodi ufficiali documentati; alcuni usano un setTimeout per ritardare di qualche mezzosecondo la chiamata della nuova azione così da avere "sicurezza" che la precedente transizione sia terminata ma, per quanto semplice, mi pare comunque un modo piuttosto artigianale e non troppo preciso; altri usano gli eventi forniti col modal ma non ho trovato tecniche troppo valide da applicare al tuo caso in particolare.

    Nel mio piccolo ho provato comunque ad architettare qualcosa con l'evento shown.bs.modal. Ho fatto qualche test e pare funzionare. Qui lo script applicato al tuo caso:
    codice:
    function importFornitori(){
      
      /*
      ** Imposto qualche variabile di controllo per il transition
      */
      $('#modal_wait').data('mi-sto-aprendo-abbiate-pazienza', true)
      /*
      ** Imposto l'evento di fine transition che chiude modal se richiesto
      */
      .on('shown.bs.modal', function(t){
        $(this).removeData('mi-sto-aprendo-abbiate-pazienza');
        if ($(this).data('chiuditi-cribbio')) $(this).off('shown.bs.modal').modal('hide');
      })
      /*
      ** Lancio il modal
      */
      .modal('show');
      
      $.ajax({
        type: "GET",
        url: '.............',
        complete: function () {
          
          /*
          ** Controllo se modal è transitioning e gli dico che deve assolutamente chiudersi
          */
          if ($('#modal_wait').data('mi-sto-aprendo-abbiate-pazienza'))
            $('#modal_wait').data('chiuditi-cribbio', true);
          else
            $('#modal_wait').modal('hide');
        }
      });
      
    }
    Tieni conto che qui ho preferito lanciare l'apertura del modal prima della chiamata AJAX evitando l'uso dell'evento beforeSend, utilizzato invece da te, perché ritengo che in questo caso non sia necessario interpellare tale evento. La cosa non dovrebbe comunque cambiare anche utilizzandolo.

    La chiusura del modal invece è chiamata nell'evento complete, perché tale evento è innescato qualunque sia la risposta della chiamata AJAX. Potrai poi eventualmente definire le tue altre azioni all'interno degli eventi error e success, che poi sono analoghi ai metodi fail e done. Vedi poi tu come meglio impostare la cosa.

    E' possibile che ci siano altre soluzioni più o meno valide rispetto a quella proposta qui da me, ma personalmente non ne sono a conoscenza. Ho visto comunque che l'argomento è discusso con varie sfaccettature sul web.
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  6. #6
    si in effetti ora che mi ci fai pensare, si bloccano soprattutto gli script che vengono eseguiti velocemente!

    cmq non sono tra quelli che vuole per forza l'animazione fade !
    quindi domani provo a levare intanto l'animazione e vediamo se tutto funziona.

    in generale, penso che sarà un problema relativo al fatto che è ancora in beta.
    quindi probabilmente sarà una cosa che aggiusteranno in futuro.

    intanto grazie, domani faccio qualche prova e ti faccio sapere!!

  7. #7
    allora, ti confermo che levando il fade funziona.
    per ora lascio così.
    magari riprovo quando esce dalla fase beta.

    grazie!!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.