Como posso ouvir o evento de envio do formulário em javascript?

124

Eu quero escrever minha própria biblioteca javascript de validação de formulário e eu estive procurando no google como detectar se um botão de envio é clicado, mas tudo o que encontrei foi o código em que você deve usar o onClick onSubmit="function()"em html.

Gostaria de criar esse javascript para não precisar tocar em nenhum código html, como adicionar javascript onSubmit ou onClick.

ed1t
fonte
8
Por que não document.forms['yourForm'].onsubmit = function(){}? Ou addEventListener?
Joseph Silber
3
Deseja realmente verificar se o botão Enviar foi clicado ou deseja verificar quando o usuário envia o formulário (o que pode ser feito clicando no botão ou pressionando Enter em um dos campos)?
Nnnnnn

Respostas:

506

Por que as pessoas sempre usam jQuery quando não é necessário?
Por que as pessoas não podem simplesmente usar JavaScript simples?

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 é uma função que você deseja chamar quando o formulário está sendo enviado.

Sobre EventTarget.addEventListener, confira esta documentação no MDN .

Para cancelar o submitevento nativo (impedir que o formulário seja enviado), use .preventDefault()na sua função de retorno de chamada,

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

Ouvindo o submitevento com bibliotecas

Se, por algum motivo, você decidiu que uma biblioteca é necessária (você já está usando uma ou não quer lidar com problemas entre navegadores), veja uma lista de maneiras de ouvir o evento de envio em bibliotecas comuns:

  1. jQuery

    $(ele).submit(callback);

    Onde eleestá a referência do elemento do formulário e callbacksendo a referência da função de retorno de chamada. Referência

  1. AngularJS (1.x)

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

    Muito simples, onde $scopeestá o escopo fornecido pela estrutura dentro do seu controlador . Referência

  2. Reagir

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

    Basta passar um manipulador para o onSubmitsuporte. Referência

  3. Outras estruturas / bibliotecas

    Consulte a documentação da sua estrutura.


Validação

Você sempre pode fazer sua validação em JavaScript, mas com HTML5 também temos validação nativa.

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

Você nem precisa de JavaScript! Sempre que a validação nativa não for suportada, você poderá fazer o fallback para um validador JavaScript.

Demonstração: http://jsfiddle.net/DerekL/L23wmo1L/

Derek 朕 會 功夫
fonte
106
Essas 5 linhas de código "medonho ... feio" substituem a funcionalidade necessária fornecida por 4.000 linhas de jQuery, que também deve ser também "medonho ... feio".
RobG 14/09/11
45
Eu não tenho muito contra o jQuery, apenas aqueles que o usam como uma espécie de encantamento mágico sem perceber que podem substituir a coisa toda por algumas linhas de código. Por que não reservar um tempo para descobrir como os navegadores realmente funcionam? Realmente não é tão difícil.
RobG 14/09/11
4
@ Ben - e só porque você pode fazer algo com uma biblioteca não significa que você também não deva, nem que outros sejam dissuadidos de aprender o básico com respostas de "basta usar a biblioteca x". Quando alguém faz uma pergunta específica sobre javascript, é educado responder à pergunta usando javascript comum. Sugira, de qualquer maneira, algo da sua biblioteca de escolha, mas responder à pergunta deve ser a primeira prioridade.
RobG 14/09
4
Pessoalmente, acredito que uma pessoa deve primeiro conhecer o básico.
Derek
7
no mesmo espírito, deveríamos realmente tentar escrever mais linguagem assembly. Brincadeirinha (eu prefiro uma solução de jquery e acho que é uma toca de coelho sem fim, se você realmente quer entender o que está acontecendo sob o capô), mas sim, fico feliz por conhecer uma linguagem assembly e saber como o TCP conexões são feitas, etc. Eu ainda não daria a ninguém uma solução de nível mais baixo apenas para ensinar a eles as maravilhas do que está por trás.
Josh Sutterfield 08/07
6

Essa é a maneira mais simples de chamar sua própria função javascript quando onSubmitocorrer uma .

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
fonte
3
Por que você decidiu vincular a função 'enviado'? Não há uso de 'this' na função.
Lior
bindé realmente desnecessário.
pstadler 7/04
3

Com base nos seus requisitos, você também pode fazer o seguinte sem bibliotecas como o jQuery:

Adicione isso à sua cabeça:

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 seu formulário ainda pode ser algo como:

    <form id="frmSubmit" action="/Submit">
        <input type="submit" value="Submit" />
    </form>
fakedob
fonte
9
sempre use em addEventListenervez de submeter ou carregar para permitir que outros desenvolvedores adicionem seus próprios ouvintes.
beytarovski
0

Com jQuery:

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

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