¿Cómo puedo escuchar el evento de envío de formulario en javascript?

124

Quiero escribir mi propia biblioteca de JavaScript de validación de formularios y he estado buscando en Google cómo detectar si se hace clic en un botón de envío, pero todo lo que encontré es un código donde tienes que usar onClick onSubmit="function()"en html.

Me gustaría crear este javascript para no tener que tocar ningún código html como agregar onSubmit o onClick javascript.

ed1t
fuente
8
¿Por qué no document.forms['yourForm'].onsubmit = function(){}? O addEventListener?
Joseph Silber
3
¿Realmente desea verificar si se hizo clic en el botón de envío, o desea verificar cuándo el usuario envía el formulario (lo que puede hacer haciendo clic en el botón o presionando Intro desde uno de los campos)?
nnnnnn

Respuestas:

506

¿Por qué la gente siempre usa jQuery cuando no es necesario?
¿Por qué la gente no puede usar JavaScript simple?

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 es una función a la que desea llamar cuando se envía el formulario.

Acerca de EventTarget.addEventListener, consulte esta documentación en MDN .

Para cancelar el submitevento nativo (evitar que se envíe el formulario), use .preventDefault()en su función de devolución de llamada,

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

Escuchando el submitevento con bibliotecas

Si por alguna razón ha decidido que una biblioteca es necesaria (ya está usando una o no quiere lidiar con problemas entre navegadores), aquí hay una lista de formas de escuchar el evento de envío en bibliotecas comunes:

  1. jQuery

    $(ele).submit(callback);

    ¿Dónde eleestá la referencia del elemento de formulario y callbackla referencia de la función de devolución de llamada? Referencia

  1. AngularJS (1.x)

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

    Muy sencillo, ¿dónde $scopeestá el alcance proporcionado por el marco dentro de su controlador ? Referencia

  2. Reaccionar

    <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
    }

    Simplemente pase un controlador al onSubmitaccesorio. Referencia

  3. Otros marcos / bibliotecas

    Consulte la documentación de su marco.


Validación

Siempre puede hacer su validación en JavaScript, pero con HTML5 también tenemos validación nativa.

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

¡Ni siquiera necesitas JavaScript! Siempre que la validación nativa no sea compatible, puede recurrir a un validador de JavaScript.

Demostración: http://jsfiddle.net/DerekL/L23wmo1L/

Derek 朕 會 功夫
fuente
106
Estas 5 líneas de código "horrible ... feo" reemplazan la funcionalidad requerida proporcionada por 4,000 líneas de jQuery, que también debe ser código "horrible ... feo".
RobG
45
No tengo mucho en contra de jQuery, solo aquellos que lo usan como una especie de encantamiento mágico sin darse cuenta de que pueden reemplazar todo con unas pocas líneas de código. ¿Por qué no tomarse el tiempo para descubrir cómo funcionan realmente los navegadores? Realmente no es tan difícil.
RobG
44
@Ben, y el hecho de que puedas hacer algo con una biblioteca no significa que debas hacerlo, ni que otros se disuadan de aprender lo básico con respuestas de "solo usa la biblioteca x". Cuando alguien hace una pregunta específica sobre javascript, es cortés responder la pregunta usando javascript simple. Sugiera algo de la biblioteca de su elección, pero responder a la pregunta debería ser la primera prioridad.
RobG
44
Personalmente, creo que una persona primero debe conocer los conceptos básicos.
Derek 朕 會 功夫
77
con el mismo espíritu, realmente deberíamos intentar escribir más lenguaje ensamblador. Bromeando a medias (prefiero una solución jquery y creo que es una madriguera infinita si realmente quieres entender lo que está sucediendo debajo del capó), pero sí, me alegro de que sé algo de lenguaje ensamblador y sé cómo funciona el TCP se hacen conexiones, etc. Todavía no le daría a nadie una solución de nivel inferior solo por el hecho de enseñarles las maravillas de lo que hay bajo el capó.
Josh Sutterfield
6

Esta es la forma más sencilla en la que se puede llamar a su propia función de JavaScript cuando onSubmitocurre una .

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();
}
Derek Dawson
fuente
3
¿Por qué decidiste vincular la función 'enviada'? No hay uso de 'esto' en la función.
Lior
bindDe hecho es innecesario.
pstadler
3

Según sus requisitos, también puede hacer lo siguiente sin bibliotecas como jQuery:

Agregue esto a su cabeza:

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;
        }
    }
}

Y su formulario aún puede verse algo así como:

    <form id="frmSubmit" action="/Submit">
        <input type="submit" value="Submit" />
    </form>
fakedob
fuente
9
siempre use en addEventListenerlugar de onsubmit u onload para permitir que otros desarrolladores agreguen sus propios oyentes.
beytarovski
0

Con jQuery:

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

    if (pass)
        return true;
    else
        return false;
});
Justin808
fuente