2013-03-20 16 views
11

Ho cercato di trovare il modo "giusto" per evitare il doppio invio di moduli. Ci sono molti post correlati su SO ma nessuno di loro ha colpito il posto per me. Due domande qui sottoIl modo più semplice per disabilitare il pulsante all'invio di un modulo?

Qui è la mia forma

<form method="POST"> 
    <input type="text" name="q"/> 
    <button class="once-only">Send</button> 
</form> 

Ecco il mio primo tentativo di disabilitare doppie sottomette:

$(document).ready(function(){ 
    $(".once-only").click(function(){ 
     this.disabled = true; 
     return true; 
    }); 
}); 

Questo è l'approccio suggerito qui: Disable button after post using JS/Jquery. Questo post suggerisce che l'elemento di presentazione deve essere un input piuttosto che un pulsante, ma il test di entrambi non fa differenza. Puoi provarlo tu stesso usando questo violino: http://jsfiddle.net/uT3hP/

Come puoi vedere, questo disabilita il pulsante, ma impedisce anche l'invio del modulo. Nei casi in cui l'elemento di invio è un pulsante e un elemento di input.

Domanda 1: perché questo gestore di clic interrompe l'invio del modulo?

cercare in giro un po 'più trovo questa soluzione (da Why doesn't my form post when I disable the submit button to prevent double clicking?)

if($.data(this, 'clicked')){ 
    return false; 
} else{ 
    $.data(this, 'clicked', true); 
    return true; 
} 

Si può giocare con questo utilizzo di questo violino: http://jsfiddle.net/uT3hP/1/

Questo funziona, ma ...

Domanda 2: E 'questo il meglio che possiamo fare?

Ho pensato che sarebbe stata una cosa elementare. L'approccio 1 non funziona, l'approccio 2 sì, ma non mi piace e sento che ci deve essere un modo più semplice.

+0

possibile duplicato del [Disabilita pulsante di invio sulla forma presentare] (http://stackoverflow.com/questions/5691054/disable-submit-button-on-form-submit) – mcastle

risposta

20

È possibile utilizzare jQuery's submit(). In questo caso, dovrebbe essere simile a questa:

$('form').submit(function(){ 
    $(this).children('input[type=submit]').prop('disabled', true); 
}); 

Ecco un jsFiddle lavoro (realizzato da Mike) - http://jsfiddle.net/gKFLG/1/.

Se il submit-pulsante è non figlio diretto della forma-elemento che sarà necessario sostituire children con find. Inoltre, il tuo pulsante di invio potrebbe anche essere un elemento button anziché un elemento input. Per esempio. Questo è il caso se si utilizza Bootstrap horizontal forms.Qui di seguito è una versione diversa del frammento:

$('form').submit(function(){ 
    $(this).find('button[type=submit]').prop('disabled', true); 
}); 

Demo jsFiddle - http://jsfiddle.net/devillers/fr7gmbcy/

+0

@MikeHogan Il jsFiddle da te pubblicato su sembra che io stia usando un gestore on-click invece del mio on-submit, penso che questo possa essere il motivo. Proverò a dare un'altra occhiata una volta tornato dal lavoro – lifetimes

+0

Fiddle qui: http://jsfiddle.net/gKFLG/1/ –

+0

@MikeHogan Grazie, lo aggiornerò nella mia risposta se è ok (per i futuri spettatori) e ti accrediterà per questo. – lifetimes

1

Si potrebbe provare a utilizzare il seguente codice:

$(document).ready(function(){ 
    $(".once-only").click(function(){ 
     this.submit(); 
     this.disabled = true; 
     return true; 
    }); 
}); 
+3

fiddle qui: http://jsfiddle.net/nwpRr/ - anche questo funziona. –

1

Questo dovrebbe aiutare:

<form class="form-once-only" method="POST"> 
    <input type="text" name="q"/> 
    <button type="submit" class="once-only">Send</button> 
</form> 

Javascript:

$(document).ready(function(){ 
    $("form.form-once-only").submit(function() { 
     $(this).find(':button').prop('disabled', true); 
    }); 
} 
2

soluzione semplice ed efficace è

<form ... onsubmit="myButton.disabled = true; return true;"> 
    ... 
    <input type="submit" name="myButton" value="Submit"> 
</form> 

Fonte: here

+0

Di gran lunga la migliore soluzione IMO. Funziona con convalide e non richiede alcuna libreria esterna. – jQwierdy

+0

@ mike-hogan Direi che questa dovrebbe essere la risposta accettata - funziona ed è di gran lunga più semplice. – jQwierdy

1

Allo stesso modo Ho visto alcuni esempi, questo permette di modificare quanto a lungo il pulsante è disabilitato per, tramite timeout. Inoltre, si attiva solo in caso di invio di un modulo piuttosto che in caso di clic sul pulsante, che in origine mi ha causato alcuni problemi.

$('form').submit(function() { 
     var button = $('#Button'); 
     var oldValue = button.value; 

     button.attr('disabled', true); 
     setTimeout(function() { 
      button.value = oldValue; 
      button.attr('disabled', false); 
     }, 3000) 
    }); 
Problemi correlati