Come posso ascoltare l'evento di invio del modulo in javascript?


124

Voglio scrivere la mia libreria javascript di convalida del modulo e ho cercato su Google come rilevare se si fa clic su un pulsante di invio, ma tutto quello che ho trovato è il codice in cui devi usare onClicca su onSubmit="function()"in html.

Vorrei creare questo javascript in modo da non dover toccare alcun codice html come aggiungere onSubmit o onClick javascript.


8
Perché no document.forms['yourForm'].onsubmit = function(){}? Oppure addEventListener?
Joseph Silber,

3
Vuoi davvero verificare se è stato fatto clic sul pulsante di invio o vuoi verificare quando l'utente invia il modulo (cosa che può fare facendo clic sul pulsante o premendo Invio da uno dei campi)?
nnnnnn,

Risposte:


506

Perché le persone usano sempre jQuery quando non è necessario?
Perché le persone non possono semplicemente usare JavaScript semplice?

var ele = /*Your Form Element*/;
if(ele.addEventListener){
    ele.addEventListener("submit", callback, false);  //Modern browsers
}else if(ele.attachEvent){
    ele.attachEvent('onsubmit', callback);            //Old IE
}

callback è una funzione che si desidera chiamare al momento dell'invio del modulo.

A proposito EventTarget.addEventListener, consulta questa documentazione su MDN .

Per annullare l' submitevento nativo (impedire l'invio del modulo), utilizzare .preventDefault()nella funzione di richiamata,

document.querySelector("#myForm").addEventListener("submit", function(e){
    if(!isValid){
        e.preventDefault();    //stop form from submitting
    }
});

Ascoltare l' submitevento con le biblioteche

Se per qualche motivo hai deciso che è necessaria una libreria (ne stai già utilizzando una o non vuoi occuparti di problemi tra browser), ecco un elenco di modi per ascoltare l'evento di invio nelle librerie comuni:

  1. jQuery

    $(ele).submit(callback);

    Dove si eletrova il riferimento dell'elemento del form ed callbackessendo il riferimento della funzione di callback. Riferimento

  1. AngularJS (1.x)

    <form ng-submit="callback()">
    
    $scope.callback = function(){ /*...*/ };
    

    Molto semplice, dov'è $scopel'ambito fornito dal framework all'interno del controller . Riferimento

  2. Reagire

    <form onSubmit={this.handleSubmit}>
    
    class YourComponent extends Component {
        // stuff
    
        handleSubmit(event) {
            // do whatever you need here
    
            // if you need to stop the submit event and 
            // perform/dispatch your own actions
            event.preventDefault();
        }
    
        // more stuff
    }
    

    Passa semplicemente un gestore onSubmitall'elica. Riferimento

  3. Altri framework / librerie

    Fare riferimento alla documentazione del proprio framework.


Validazione

Puoi sempre eseguire la convalida in JavaScript, ma con HTML5 abbiamo anche la convalida nativa.

<!-- Must be a 5 digit number -->
<input type="number" required pattern="\d{5}">

Non hai nemmeno bisogno di JavaScript! Ogni volta che la convalida nativa non è supportata, è possibile eseguire il fallback a un validatore JavaScript.

Demo: http://jsfiddle.net/DerekL/L23wmo1L/


106
Quelle 5 righe di codice "orribile ... brutto" sostituiscono la funzionalità richiesta fornita da 4.000 righe di jQuery, che deve anche essere un codice "orribile ... brutto".
RobG

45
Non ho molto contro jQuery, solo quelli che lo usano come una sorta di incantesimo magico senza rendersi conto che possono sostituire l'intera cosa con poche righe di codice. Perché non impiegare il tempo per scoprire come funzionano effettivamente i browser? Non è poi così difficile.
RobG

4
@Ben - e solo perché puoi fare qualcosa con una libreria non significa che non dovresti nemmeno, né altri dovrebbero essere dissuasi dall'imparare le basi con le risposte di "usa solo la libreria x". Quando qualcuno fa una domanda specifica su javascript, è educato rispondere alla domanda usando semplicemente javascript. Sicuramente suggerisci qualcosa dalla tua biblioteca preferita, ma rispondere alla domanda dovrebbe essere la prima priorità.
RobG

4
Personalmente credo che una persona dovrebbe prima conoscere le basi.
Derek 功夫 會 功夫

7
nello stesso spirito, dovremmo davvero provare a scrivere più linguaggio di assemblaggio. Scherzo a metà (Preferisco piuttosto una soluzione jquery e penso che sia una buca di coniglio senza fine se vuoi davvero capire cosa sta succedendo sotto il cofano), ma sì, sono contento di conoscere un linguaggio assembly e sapere come il TCP vengono fatte delle connessioni, ecc. Ancora non darei a nessuno una soluzione di livello inferiore solo per insegnare loro le meraviglie di ciò che è sotto il cofano.
Josh Sutterfield,

6

Questo è il modo più semplice per richiamare la tua funzione javascript quando si onSubmitverifica.

HTML

<form>
    <input type="text" name="name">
    <input type="submit" name="submit">
</form>

JavaScript

window.onload = function() {
    var form = document.querySelector("form");
    form.onsubmit = submitted.bind(form);
}

function submitted(event) {
    event.preventDefault();
}

3
Perché hai deciso di associare la funzione "inviata"? Non è possibile utilizzare "this" nella funzione.
Lior,

bindè davvero inutile.
pstadler

3

In base alle tue esigenze puoi anche fare quanto segue senza librerie come jQuery:

Aggiungi questo alla tua testa:

window.onload = function () {
    document.getElementById("frmSubmit").onsubmit = function onSubmit(form) {
        var isValid = true;
        //validate your elems here
        isValid = false;

        if (!isValid) {
            alert("Please check your fields!");
            return false;
        }
        else {
            //you are good to go
            return true;
        }
    }
}

E il tuo modulo potrebbe ancora assomigliare a:

    <form id="frmSubmit" action="/Submit">
        <input type="submit" value="Submit" />
    </form>

9
usa sempre addEventListenerinvece di onsubmit o onload per consentire ad altri sviluppatori di aggiungere i propri ascoltatori.
beytarovski,

0

Con jQuery:

$('form').submit(function () {
    // Validate here

    if (pass)
        return true;
    else
        return false;
});
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.