2012-07-09 5 views
9

Facendo seguito in jQuery:jQuery: al clic disabilita evento click fino risposta da Ajax chiamata

$('#signupbox1').on('click', '#signup1', function() { 

    var str = $('#signupform').serialize(); 

    // make it look like a waiting button 
    $('#signup1').addClass("btn_wait"); 
    var btn_val = $('#signup1').val(); 
    $('#signup1').val(''); 

    $.ajax({ 
     type: "POST", 
     url: "signup_step1.php", 
     data: str, 
     success: function(msg) { 

      //doing stuff here 

     $('#signup1').removeClass("btn_wait"); 
     $('#signup1').val(btn_val); 
     } 
    }); 

}); 

Come hai potuto disattivare l'evento click così finché si riceve una risposta dalla chiamata AJAX? Quindi, quando fai clic sul pulsante, non solo "trasforma" in un pulsante di attesa a causa della classe aggiunta, ma anche l'evento di clic verrà "messo in pausa" ... è possibile?

Grazie mille in anticipo!

risposta

13
$('#signupbox1').on('click', '#signup1', function() { 

    var str = $('#signupform').serialize(); 

    // make it look like a waiting button 
    var btn_val = $('#signup1').val(); 
    $('#signup1').addClass("btn_wait").val('').unbind('click'); 

    $.ajax({ 
     type: "POST", 
     url: "signup_step1.php", 
     data: str, 
     success: function(msg) { 
      $('#signup1').removeClass("btn_wait").val(btn_val); 
     }, 
     complete: function() { 
      $('#signup1').bind('click'); // will fire either on success or error 
     } 
    }); 

}); 
+0

potrebbe essere necessario associarlo nuovamente all'evento di errore. L'utente dovrebbe essere in grado di riprovare. – Shyju

+0

oh grazie Zoltan! così facile! oh mio dio ... mi vergogno! :) – Chris

+0

@Shyju: sì, grazie per il suggerimento! – Chris

2

È possibile aggiungere un flag per indicare "attualmente in fase di caricamento". Puoi usare qualsiasi cosa come una variabile, una proprietà o un attributo. In questo esempio, utilizzo jQuery .data()

Inoltre, è consigliabile utilizzare l'evento submit anziché aggiungere un gestore di clic al pulsante di invio quando si invia un modulo.

$('#signupform').on('submit', function() { 

    var form = $(this), 
     loading = form.data('loading'), //check loading status 
     str, button, val; 

    //if not loading 
    if(!loading){ 

     //set loading to true 
     form.data('loading',true); 

     str = form.serialize(); 
     button = $('#signup1', form); 
     val = button.val(); 

     // make it look like a waiting button 
     button 
      .addClass("btn_wait"); 
      .val(''); 

     $.ajax({ 
      type: "POST", 
      url: "signup_step1.php", 
      data: str, 
      success: function(msg) { 

       //remove loading state 
       form.data('loading',false); 

       //return button to normal 
       button 
        .removeClass("btn_wait"); 
        .val(val); 
      } 
     }); 
    } 

}); 
+0

oh, wow .. grazie Giuseppe per questa risposta completa! Quindi, l'impostazione .data al caricamento funziona solo sull'evento di invio? Attualmente nascondo la prima parte del modulo (4 ingressi) e mostro la seconda (4 ingressi in più) e poi nella seconda ho voluto usare il pulsante di invio per l'intero modulo ... pensi che questo non sia un buon idea? Il file signup_step1.php controlla solo i valori per la correttezza ... che deve essere fatto di nuovo, hai ragione, quando invii l'intero modulo dato che i dati potrebbero essere stati cambiati naturalmente ... – Chris

+0

@Chris jQuery '.data() 'può essere usato da qualsiasi cosa. E credo che il tuo problema di forma debba essere in un'altra domanda. – Joseph

+0

ok, grazie! hai ragione... – Chris