Invio di un modulo su "Invio" con jQuery?


427

Ho un modulo di login standard: un campo di testo e-mail, un campo password e un pulsante di invio su un progetto AIR che utilizza HTML / jQuery. Quando premo Invio sul modulo, il contenuto dell'intero modulo scompare, ma il modulo non viene inviato. Qualcuno sa se si tratta di un problema di Webkit (Adobe AIR utilizza Webkit per HTML) o se ho rovinato tutto?

Provai:

$('.input').keypress(function (e) {
  if (e.which == 13) {
    $('form#login').submit();
  }
});

Ma ciò non ha fermato il comportamento di compensazione o inviato il modulo. Non ci sono azioni associate al modulo: potrebbe essere questo il problema? Posso mettere una funzione JavaScript nell'azione?


3
Hai davvero un attributo class = "input" sul tuo <input ...? Sembra che dovrebbe essere $ ('input').
Tasto

Le classi sono generate a livello di codice da un CMS. Oltre a ciò, tuttavia, impostarlo su $ ('input') influenzerebbe ogni input sulla pagina, indipendentemente dal fatto che volessi il comportamento o meno. Mi dispiace che offenda la tua sensibilità.
essere hollenbeck il

15
Sensibilità non minimamente offesa. Ho pensato che potrebbe essere stata una svista che ha portato al problema. Proseguire.
NexusRex,

1
Cordiali saluti: la tua risposta accettata non è del tutto accurata. Fare riferimento alla mia risposta di seguito.
NoBrainer,

Risposte:


399
$('.input').keypress(function (e) {
  if (e.which == 13) {
    $('form#login').submit();
    return false;    //<---- Add this line
  }
});

Dai un'occhiata a questa risposta di StackOverflow: event.preventDefault () vs. return false

In sostanza, "return false" è lo stesso di call e.preventDefaulte e.stopPropagation().


3
Nota che non sono gli stessi. IE8 non ha e.preventDefault. Per IE8 utilizzare event.returnValue = false;
mbokil,

8
@mbokil Tranne che quando si utilizza jQuery, è lo stesso in IE8. e IE7. E IE6.
Kevin B,

Se si desidera digitare prima nei campi di input, inserire "return false;" all'interno dell'istruzione if.
Juni Brosas,

173

Oltre a restituire false, come menzionato da Jason Cohen. Potrebbe essere necessario prevenire anche Default

e.preventDefault();

13
come ha detto @NoBrainer, questo è sbagliato: return falsein un evento gestito da jQuery chiama automaticamente e.preventDefault ()
Riccardo Galli

83

Non so se ti aiuterà, ma puoi provare a simulare un clic sul pulsante di invio, invece di inviare direttamente il modulo. Ho il seguente codice in produzione e funziona benissimo:

    $('.input').keypress(function(e) {
        if(e.which == 13) {
            jQuery(this).blur();
            jQuery('#submit').focus().click();
        }
    });

Nota: jQuery ('# submit'). Focus () rende animato il pulsante quando si preme invio .


2
Funziona benissimo ma ho dovuto aggiungere "return false;" per impedire l'invio di moduli doppi.
code90

Funzionando | Guarda MOLTI risultati come questo parlando di trigger, sendkey, ecc., Doh, blah ..., ma questo è l'unico che funziona per me e invia davvero un clic su un pulsante. Non inviare (). Quindi, il trucco era focus (). Click () funzioni in sicurezza. GRAZIE.
m3nda,

Funziona, ma ho dovuto mettere questo codice sotto: $ (document) .ready (function () {...
shasi kanth


30

C'è qualche motivo per cui devi agganciare e testare la chiave di invio?

Non potresti semplicemente aggiungere un

<input type="submit" /> 

al modulo e lo hai naturalmente inviato quando viene premuto Invio? Puoi anche agganciare l' onsubmitazione del modulo e chiamare una funzione di convalida da lì se vuoi ...

Puoi anche usare il onsubmittest come test per vedere se il tuo modulo è stato inviato, ma non funzionerà se chiami form.submit().


1
Completamente d'accordo. La mia preferenza sarebbe sempre quella di utilizzare la funzionalità nativa del browser (input di tipo = invia in modo nativo rispondere a una pressione del tasto invio) piuttosto che aggiungere ulteriori script kludged.
Aaron

1
Il problema è che cosa succede se stai facendo cose ajax e non c'è un postback effettivo sul server, ma vuoi che l'interfaccia utente si comporti come si aspetta l'utente?
Devlord,

Anzi ... avevo trascurato tutto return false;.
Devlord,

14

Ecco un modo per farlo come plugin JQuery (nel caso in cui si desideri riutilizzare la funzionalità):

$.fn.onEnterKey =
    function( closure ) {
        $(this).keypress(
            function( event ) {
                var code = event.keyCode ? event.keyCode : event.which;

                if (code == 13) {
                    closure();
                    return false;
                }
            } );
    }

Ora se vuoi decorare un <input>elemento con questo tipo di funzionalità è semplice come questo:

$('#your-input-id').onEnterKey(
    function() {
        // Do stuff here
    } );

12

È inoltre possibile semplicemente aggiungere onsubmit="return false"al codice del modulo nella pagina per impedire il comportamento predefinito.

Quindi agganciare ( .bindo .live) l' submitevento del modulo a qualsiasi funzione con jQuery nel file javascript.

Ecco un codice di esempio per aiutare:

HTML

<form id="search_form" onsubmit="return false">
   <input type="text" id="search_field"/>
   <input type="button" id="search_btn" value="SEARCH"/>
</form>

Javascript + jQuery

$(document).ready(function() {

    $('#search_form').live("submit", function() {
        any_function()
    });
});

Funziona dal 13/04/2011 con Firefox 4.0 e jQuery 1.4.3


Non funziona in Chrome. Inoltrerà comunque.
Marcelo Agimóvel,

5

Questo è il mio codice:

  $("#txtMessage").on( "keypress", function(event) {
    if (event.which == 13 && !event.shiftKey) {
        event.preventDefault();
        $("#frSendMessage").submit();
    }
    });

4

Inoltre, per mantenere l'accessibilità, è necessario utilizzarlo per determinare il codice chiave:

c = e.which ? e.which : e.keyCode;

if (c == 13) ...

3

Basta aggiungere per una facile implementazione. Puoi semplicemente creare un modulo e quindi nascondere il pulsante di invio:

Per esempio:

<form action="submit.php" method="post">
Name : <input type="text" name="test">
<input type="submit" style="display: none;">
</form>

@cebirci e quale versione è la tua Chrome? Ho provato dai laptop al pc e il mio codice funziona. Prova a scaricare la versione più recente di Chrome prima di contrassegnarla come mia risposta.
Joem Maranan,

2

Adesso lo uso

$("form").submit(function(event){
...
}

All'inizio ho aggiunto un eventhandler al pulsante di invio che ha prodotto un errore per me.


1

Ho scoperto oggi che l'evento keypress non viene generato quando si preme il tasto Invio, quindi potresti voler passare a keydown () o keyup () invece.

Il mio script di prova:

        $('.module input').keydown(function (e) {
            var keyCode = e.which;
            console.log("keydown ("+keyCode+")")
            if (keyCode == 13) {
                console.log("enter");
                return false;
            }
        });
        $('.module input').keyup(function (e) {
            var keyCode = e.which;
            console.log("keyup ("+keyCode+")")
            if (keyCode == 13) {
                console.log("enter");
                return false;
            }
        });
        $('.module input').keypress(function (e) {
            var keyCode = e.which;
            console.log("keypress ("+keyCode+")");
            if (keyCode == 13) {
                console.log("Enter");
                return false;
            }
        });

L'output nella console quando si digita "A Enter B" sulla tastiera:

keydown (65)
keypress (97)
keyup (65)

keydown (13)
enter
keyup (13)
enter

keydown (66)
keypress (98)
keyup (66)

Si vede nella seconda sequenza il 'keypress' mancante, ma keydown e keyup registrano il codice '13' mentre viene premuto / rilasciato. Come da documentazione jQuery sulla funzione keypress () :

Note: as the keypress event isn't covered by any official specification, the actual behavior encountered when using it may differ across browsers, browser versions, and platforms.

Testato su IE11 e FF61 su Server 2012 R2


0

Nei codici HTML:

<form action="POST" onsubmit="ajax_submit();return false;">
    <b>First Name:</b> <input type="text" name="firstname" id="firstname">
    <br>
    <b>Last Name:</b> <input type="text" name="lastname" id="lastname">
    <br>
    <input type="submit" name="send" onclick="ajax_submit();">
</form>

Nei codici Js:

function ajax_submit()
{
    $.ajax({
        url: "submit.php",
        type: "POST",
        data: {
            firstname: $("#firstname").val(),
            lastname: $("#lastname").val()
        },
        dataType: "JSON",
        success: function (jsonStr) {
            // another codes when result is success
        }
    });
}

1
Si prega di non pubblicare risposte identiche a più domande. Posta una buona risposta, quindi vota / contrassegna per chiudere le altre domande come duplicati. Se la domanda non è un duplicato, personalizza le tue risposte alla domanda.
Paul Roub,

@PaulRoub la mia risposta ha qualche differenza con un'altra.
mghhgm,

In che modo questa risposta è diversa da questa o questa ?
Paul Roub,

@PaulRoub Ho questo problema e prima cerco su Google per questo. Quelle pagine parlano di questo problema ma non sono semplici. Quando trovo la risposta migliore, ho deciso di condividerlo su Quelle pagine parlano per aiutare gli utenti quando effettuano una ricerca, vedere la mia risposta su alcune pagine simili di StackOverflow.
mghhgm,

1
questa risposta non è affatto collegata alla domanda
Zoltán Süle,

-4

Prova questo:

var form = document.formname;

if($(form).length > 0)
{
    $(form).keypress(function (e){
        code = e.keyCode ? e.keyCode : e.which;
        if(code.toString() == 13) 
        {
             formsubmit();
        }
    })
}

9
Questo sta mescolando jquery con vaniglia javascript in un modo scomodo e include un cast davvero strano che confonde le cose
Moopet,
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.