Jak mogę odsłuchać zdarzenia przesłania formularza w javascript?


124

Chcę napisać własną bibliotekę javascript do walidacji formularzy i szukałem w Google, jak wykryć, czy został kliknięty przycisk przesyłania, ale wszystko, co znalazłem, to kod, w którym musisz użyć onClick onSubmit="function()"w html.

Chciałbym zrobić ten skrypt javascript, aby nie musieć dotykać żadnego kodu HTML, takiego jak dodawanie javascript onSubmit lub onClick.


8
Dlaczego nie document.forms['yourForm'].onsubmit = function(){}? Albo addEventListener?
Joseph Silber,

3
Czy na pewno chcesz sprawdzić, czy został kliknięty przycisk przesyłania, czy też chcesz sprawdzić, kiedy użytkownik przesyła formularz (co może zrobić, klikając przycisk lub naciskając klawisz Enter z jednego z pól)?
nnnnnn

Odpowiedzi:


506

Dlaczego ludzie zawsze używają jQuery, kiedy nie jest to konieczne?
Dlaczego ludzie nie mogą po prostu używać prostego JavaScript?

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 to funkcja, którą chcesz wywołać podczas przesyłania formularza.

Informacje EventTarget.addEventListener, zapoznaj się z dokumentacją na MDN .

Aby anulować submitzdarzenie natywne (zapobiec przesłaniu formularza), użyj .preventDefault()w funkcji wywołania zwrotnego,

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

Wysłuchanie submitwydarzenia z bibliotekami

Jeśli z jakiegoś powodu zdecydowałeś, że biblioteka jest konieczna (już z niej korzystasz lub nie chcesz zajmować się problemami z różnymi przeglądarkami), oto lista sposobów odsłuchiwania zdarzenia przesyłania we wspólnych bibliotekach:

  1. jQuery

    $(ele).submit(callback);

    Gdzie elejest odwołaniem do elementu formularza i callbackjest odwołaniem do funkcji zwrotnej. Odniesienie

  1. AngularJS (1.x)

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

    Bardzo proste, gdzie $scopejest zakres zapewniany przez strukturę wewnątrz twojego kontrolera . Odniesienie

  2. Reagować

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

    Po prostu podaj obsługę do onSubmitrekwizytu. Odniesienie

  3. Inne frameworki / biblioteki

    Zapoznaj się z dokumentacją swojego frameworka.


Uprawomocnienie

Zawsze możesz przeprowadzić walidację w JavaScript, ale w HTML5 mamy również natywną walidację.

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

Nie potrzebujesz nawet JavaScript! Jeśli natywna walidacja nie jest obsługiwana, możesz wrócić do walidatora JavaScript.

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


106
Te 5 wierszy „okropnego… brzydkiego” kodu zastępuje wymaganą funkcjonalność 4 000 wierszy jQuery, które również muszą być „okropnym… brzydkim” kodem.
RobG,

45
Nie mam wiele przeciwko jQuery, tylko ci, którzy używają go jako pewnego rodzaju magicznej inkantacji, nie zdając sobie sprawy, że mogą zastąpić całość kilkoma liniami kodu. Poświęć trochę czasu, aby dowiedzieć się, jak faktycznie działają przeglądarki. To naprawdę nie jest takie trudne.
RobG

4
@Ben - i tylko dlatego, że możesz coś zrobić z biblioteką, nie oznacza, że ​​ty też nie powinieneś, ani też nie powinno się zniechęcać innych do nauki podstaw odpowiedziami „po prostu użyj biblioteki x”. Gdy ktoś zadaje konkretne pytanie dotyczące javascript, uprzejmie jest odpowiedzieć na nie za pomocą zwykłego kodu JavaScript. Jak najbardziej zasugeruj coś z wybranej biblioteki, ale odpowiedź na to pytanie powinna być priorytetem.
RobG,

4
Osobiście uważam, że człowiek powinien najpierw znać podstawy.
Derek 朕 會 功夫

7
w tym samym duchu naprawdę powinniśmy spróbować napisać więcej języka asemblera. Pół żartem (wolę rozwiązanie jQuery i myślę, że to niekończąca się królicza nora, jeśli naprawdę chcesz zrozumieć, co się dzieje pod maską), ale tak, cieszę się, że znam jakiś język asemblera i wiem, jak TCP połączeń, itp. Nadal nie dałbym nikomu rozwiązania niższego poziomu tylko po to, aby nauczyć ich cudów tego, co jest pod maską.
Josh Sutterfield,

6

To najprostszy sposób, w jaki można wywołać własną funkcję javascript, gdy onSubmitwystąpi błąd.

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
Dlaczego zdecydowałeś się powiązać funkcję „przesłana”? W funkcji nie ma zastosowania „this”.
Lior,

bindjest rzeczywiście niepotrzebne.
pstadler

3

W zależności od wymagań możesz również wykonać następujące czynności bez bibliotek, takich jak jQuery:

Dodaj to do swojej głowy:

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

Twój formularz może nadal wyglądać następująco:

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

9
zawsze używaj addEventListenerzamiast onsubmit lub onload, aby umożliwić innym programistom dodawanie własnych słuchaczy.
beytarovski

0

Dzięki jQuery:

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

    if (pass)
        return true;
    else
        return false;
});
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.