jquery disabilita il modulo invia su invio


208

Ho il seguente javascript nella mia pagina che non sembra funzionare.

$('form').bind("keypress", function(e) {
  if (e.keyCode == 13) {               
    e.preventDefault();
    return false;
  }
});

Desidero disabilitare l'invio del modulo su invio, o meglio ancora, per chiamare il mio modulo ajax. Entrambe le soluzioni sono accettabili, ma il codice che sto includendo sopra non impedisce l'invio del modulo.


3
Ecco una semplice HTML unica soluzione: stackoverflow.com/a/51507806/337934
Samb

Risposte:


421

Se keyCodenon viene catturato, prendere which:

$('#formid').on('keyup keypress', function(e) {
  var keyCode = e.keyCode || e.which;
  if (keyCode === 13) { 
    e.preventDefault();
    return false;
  }
});

EDIT: mancato, è meglio usare al keyupposto dikeypress

EDIT 2: Come in alcune versioni più recenti di Firefox, l'invio del modulo non è impedito, è più sicuro aggiungere anche l'evento keypress al modulo. Inoltre, non funziona (più?) Semplicemente vincolando l'evento al "nome" del modulo ma solo all'id del modulo. Pertanto ho reso questo più ovvio modificando l'esempio di codice in modo appropriato.

EDIT 3: modificato bind()inon()


15
jQuery lo normalizza a e.which, quindi non è necessario testarlo e.keyCode, ma +1 per la causa più probabile di questo problema.
Bojangles,

4
Ne hai bisogno return false;? e.preventDefault();sembra troppo forte
chromigo,

10
Importante! Questo blocco di soluzione si interrompe in textarea.
Tedesco Khokhlov,

4
Il problema è che se ho nella stessa forma una casella di testo, ora non posso aggiungere un invio (per creare una nuova riga) nella casella di testo.
Tikky

3
keyCode === 13 && !$(e.target).is('textarea')
teran,

62

Di solito il modulo viene inviato Enterquando ci si concentra su elementi di input.

Possiamo disabilitare la Enterchiave (codice 13) sugli elementi di input all'interno di un modulo:

$('form input').on('keypress', function(e) {
    return e.which !== 13;
});

DEMO: http://jsfiddle.net/bnx96/325/


Il pulsante Vai di iOS è stato il mio problema in un campo di input con completamento automatico personalizzato. Questo ha risolto.
Dylan Valade,

11
Ciò impedisce ai entrano chiave siano usate nelle textareasnell'ambito del medesimo. L'uso $("form input")invece di $("form :input")sembra risolverlo. DEMO: jsfiddle.net/bnx96/279
shaneparsons

43

Ancora più breve:

$('myform').submit(function() {
  return false;
});

35
Ma questo impedirà anche il clic dell'utente?
Haibuihoang,

5
@haibuihoang Sì, questo disabiliterà l'invio del modulo.
Tom,

7
È necessario utilizzare function(e) {e.preventDefault();}i valori restituiti nei gestori di eventi obsoleti: stackoverflow.com/a/20045473/601386
influenza

6
@ user1111929 Funziona benissimo ma non dovrebbe essere la risposta migliore perché la domanda è stata posta solo Entersulla disabilitazione dell'invio del modulo tramite il Submitpulsante.
daveslab,

Una situazione comune in cui è possibile conservare l'invio del modulo, ma disabilitare l'invio premendo il tasto 'invio', è se si decide di utilizzare un onClickevento jQuery per convalidare un modulo e continuare a inviare utilizzando jQuery. In altre parole, ci sono casi in cui si desidera inviare solo tramite javascript / jQuery. Sebbene sia ancora possibile utilizzare AJAX con questa soluzione, disabilita la funzionalità di base del submitmetodo.
JRad the Bad,

23
$('form').keyup(function(e) {
  return e.which !== 13  
});

La proprietà event.which normalizza event.keyCode ed event.charCode. Si consiglia di guardare event.che per l'inserimento dei tasti della tastiera.

which Documenti.


14
$(document).on('keyup keypress', 'form input[type="text"]', function(e) {
  if(e.which == 13) {
    e.preventDefault();
    return false;
  }
});

Questa soluzione funziona su tutti i moduli sul sito Web (anche su moduli inseriti con Ajax), impedendo solo l'inserimento nei testi di input. Inseriscilo in una funzione pronta per il documento e dimentica questo problema per tutta la vita.


9

La maggior parte delle risposte sopra impedirà agli utenti di aggiungere nuove righe in un campo textarea. Se questo è qualcosa che vuoi evitare, puoi escludere questo caso particolare controllando quale elemento è attualmente attivo:

var keyCode = e.keyCode || e.which;
if (keyCode === 13 && !$(document.activeElement).is('textarea')) {
  e.preventDefault();
  return false;
}

8

L'eccesso di dover catturare e testare ogni sequenza di tasti per il tasto INVIO mi disturba davvero, quindi la mia soluzione si basa sul seguente comportamento del browser:

La pressione di INVIO attiverà un evento clic sul pulsante di invio (testato in IE11, Chrome 38, FF 31) ** (rif: http://mattsnider.com/how-forms-submit-when-pressing-enter/ )

Quindi la mia soluzione è quella di rimuovere il pulsante di invio standard (cioè <input type="submit">) in modo che il comportamento sopra citato fallisca perché non c'è un pulsante di invio per fare clic magicamente quando si preme INVIO. Invece, utilizzo un gestore di clic jQuery su un pulsante normale per inviare il modulo tramite il .submit()metodo di jQuery .

<form id="myform" method="post">
  <input name="fav_color" type="text">
  <input name="fav_color_2" type="text">
<button type="button" id="form-button-submit">DO IT!</button>
</form>

<script>
 $('#form-button-submit').click(function(){
    $('#myform').submit();
  });
</script>

Demo: http://codepen.io/anon/pen/fxeyv?editors=101

** questo comportamento non è applicabile se il modulo ha solo 1 campo di input e quel campo è un input di 'testo'; in questo caso il modulo verrà inviato al tasto INVIO anche se nel markup HTML non è presente alcun pulsante di invio (ad es. un campo di ricerca). Questo è stato il comportamento standard del browser dagli anni '90.


Ho aggiunto una casella di input invisibile al contatore "il modulo verrà inviato al tasto INVIO" causato da "il modulo ha solo 1 campo di input e quel campo è un input" di testo "".
Luo Jiong Hui il

6

se vuoi solo disabilitare il pulsante di invio su invio e invio, usa l'evento onsubmit del modulo

<form onsubmit="return false;">

È possibile sostituire "return false" con la funzione di chiamata a JS che farà tutto il necessario e inoltre invia il modulo come ultimo passaggio.


1
Ciò disabiliterà l'invio di tutti i moduli, incluso il clic sul pulsante Invia.
Nick,

non al 100% ... lavora regolarmente invia una chiave ... meglio usare jquery per prevenire
KingRider

Buona risposta alternativa (con le avvertenze sopra) perché ... beh, a volte questo è tutto ciò di cui hai bisogno.
emilys,

questo è esattamente ciò di cui avevo bisogno per una situazione, grazie
shababhsiddique

4

Puoi farlo perfettamente in puro Javascript, semplice e senza libreria richiesta. Ecco la mia risposta dettagliata per un argomento simile: Disabilitare il tasto Invio per il modulo

In breve, ecco il codice:

<script type="text/javascript">
window.addEventListener('keydown',function(e){if(e.keyIdentifier=='U+000A'||e.keyIdentifier=='Enter'||e.keyCode==13){if(e.target.nodeName=='INPUT'&&e.target.type=='text'){e.preventDefault();return false;}}},true);
</script>

Questo codice serve a impedire il tasto "Invio" solo per input type = 'text'. (Poiché il visitatore potrebbe aver bisogno di premere invio sulla pagina) Se si desidera disabilitare "Invio" anche per altre azioni, è possibile aggiungere console.log (e); per i tuoi scopi di test e premi F12 in Chrome, vai alla scheda "console" e premi "backspace" sulla pagina e guarda al suo interno per vedere quali valori vengono restituiti, quindi puoi scegliere come target tutti quei parametri per migliorare ulteriormente il codice sopra per soddisfare le tue esigenze di "e.target.nodeName" , "e.target.type" e molti altri ...


2
In realtà dovrebbe essere e.target.nodeName === 'INPUT' && e.target.type !== 'textarea'. Con il codice specificato consentirà di inviare moduli se una radio o una casella di controllo sono focalizzate.
afnpires,

3

Non so se hai già risolto questo problema o se qualcuno sta cercando di risolverlo adesso, ma ecco la mia soluzione per questo!

$j(':input:not(textarea)').keydown(function(event){
    var kc = event.witch || event.keyCode;
    if(kc == 13){
    event.preventDefault();
        $j(this).closest('form').attr('data-oldaction', function(){
            return $(this).attr('action');
        }).attr('action', 'javascript:;');

        alert('some_text_if_you_want');

        $j(this).closest('form').attr('action', function(){
            return $(this).attr('data-oldaction');
        });
        return false;
    }
});

2

Il modo semplice è cambiare il tipo di pulsante in pulsante - in html e quindi aggiungere un evento in js ...

Cambia da questo:

<form id="myForm">
   <button type="submit">Submit</button>
</form>

Per

<form id="myForm">
   <button type="button" id="btnSubmit">Submit</button>
</form>

E in js o jquery aggiungi:

("#btnSubmit").click(function () {
    $('#myForm').submit();
});

1

Il codice seguente negherà l'utilizzo della chiave di invio per inviare un modulo, ma ti consentirà comunque di utilizzare la chiave di invio in un'area di testo. Puoi modificarlo ulteriormente in base alle tue esigenze.

<script type="text/javascript">
        function stopRKey(evt) {
          var evt = (evt) ? evt : ((event) ? event : null);
          var node = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
          if ((evt.keyCode == 13) && ((node.type=="text") || (node.type=="radio") || (node.type=="checkbox")) )  {return false;}
        }

        document.onkeypress = stopRKey;
</script> 

1

In firefox, quando si immette e si preme invio, invierà la sua forma superiore. La soluzione è nel modulo di invio aggiungere questo:

<input type="submit" onclick="return false;" style="display:none" />

1

3 anni dopo e nessuna persona ha risposto completamente a questa domanda.

Il richiedente desidera annullare l'invio del modulo predefinito e chiamare il proprio Ajax. Questa è una semplice richiesta con una soluzione semplice. Non è necessario intercettare ogni carattere inserito in ciascun input.

Assumendo la forma ha un pulsante di invio, se una <button id="save-form">o <input id="save-form" type="submit">, effettuare:

$("#save-form").on("click", function () {
    $.ajax({
        ...
    });
    return false;
});


-2

Al termine del file (caricamento completato), lo script rileva ogni evento per il tasto "Voce" e disabilita l'evento dietro.

<script>
            $(document).ready(function () {
                $(window).keydown(function(event){
                    if(event.keyCode == 13) {
                        e.preventDefault(); // Disable the " Entry " key
                        return false;               
                    }
                });
            });
        </script>

aggiungi qualche spiegazione
HaveNoDisplayName

@HaveNoDisplayName: aggiornato.
McNavy,

-4

Soluzione completa in JavaScript per tutti i browser

Il codice sopra e la maggior parte delle soluzioni sono perfette. Tuttavia, penso che la "risposta breve" più apprezzata sia incompleta.

Quindi ecco l'intera risposta. in JavaScript con supporto nativo anche per IE 7.

var form = document.getElementById("testForm");
form.addEventListener("submit",function(e){e.preventDefault(); return false;});

Questa soluzione ora impedirà all'utente di inviare utilizzando la chiave di invio e non ricaricherà la pagina, né ti porterà in cima alla pagina, se il modulo è da qualche parte in basso.


8
Ciò impedisce anche che il modulo venga inviato se si fa clic sul pulsante "Invia".
Mario Werner,

-10

Cosa ne pensi di questo:

$(":submit").closest("form").submit(function(){
    $(':submit').attr('disabled', 'disabled');
});

Ciò dovrebbe disabilitare tutti i moduli con i pulsanti di invio nella tua app.

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.