Bagaimana saya bisa mendengarkan acara ajukan formulir dalam javascript?


124

Saya ingin menulis pustaka javascript validasi formulir saya sendiri dan saya telah mencari di google cara mendeteksi jika tombol kirim diklik tetapi yang saya temukan hanyalah kode tempat Anda harus menggunakan onClick on onSubmit="function()"in html.

Saya ingin membuat javascript ini sehingga saya tidak harus menyentuh kode html seperti menambahkan onSubmit atau onClick javascript.


8
Mengapa tidak document.forms['yourForm'].onsubmit = function(){}? Atau addEventListener?
Joseph Silber

3
Apakah Anda benar-benar ingin memeriksa apakah tombol kirim diklik, atau Anda ingin memeriksa kapan pengguna mengirimkan formulir (yang dapat mereka lakukan dengan mengklik tombol atau dengan menekan Enter dari salah satu bidang)?
nnnnnn

Jawaban:


506

Mengapa orang selalu menggunakan jQuery ketika itu tidak perlu?
Mengapa orang tidak bisa menggunakan JavaScript sederhana?

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 adalah fungsi yang ingin Anda panggil saat formulir dikirimkan.

Tentang EventTarget.addEventListener , lihat dokumentasi ini di MDN .

Untuk membatalkan submitacara asli (agar formulir tidak dikirimkan), gunakan.preventDefault() dalam fungsi panggilan balik Anda,

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

Mendengarkan submitacara dengan perpustakaan

Jika karena alasan tertentu Anda telah memutuskan bahwa suatu perpustakaan diperlukan (Anda sudah menggunakannya atau Anda tidak ingin berurusan dengan masalah lintas-peramban), berikut adalah daftar cara untuk mendengarkan ajukan acara di perpustakaan umum:

  1. jQuery

    $(ele).submit(callback);

    Di mana elereferensi elemen formulir, dan callbackmenjadi referensi fungsi panggilan balik. Referensi

  1. AngularJS (1.x)

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

    Sangat mudah, di mana $scoperuang lingkup yang disediakan oleh kerangka kerja di dalam controller Anda . Referensi

  2. Reaksi

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

    Cukup berikan pawang ke onSubmitpenyangga. Referensi

  3. Kerangka kerja / perpustakaan lainnya

    Rujuk ke dokumentasi kerangka kerja Anda.


Validasi

Anda selalu dapat melakukan validasi dalam JavaScript, tetapi dengan HTML5 kami juga memiliki validasi asli.

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

Anda bahkan tidak memerlukan JavaScript apa pun! Setiap kali validasi asli tidak didukung, Anda dapat mundur ke validator JavaScript.

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


106
Bahwa 5 baris kode "mengerikan ... jelek" menggantikan fungsionalitas yang diperlukan yang disediakan oleh 4.000 baris jQuery, yang juga harus menjadi kode "mengerikan ... jelek" juga.
RobG

45
Saya tidak terlalu menentang jQuery, hanya mereka yang menggunakannya sebagai semacam mantra sihir tanpa menyadari bahwa mereka dapat mengganti semuanya dengan beberapa baris kode. Mengapa tidak meluangkan waktu untuk mencari tahu bagaimana sebenarnya browser bekerja? Ini tidak terlalu sulit.
RobG

4
@ Ben - dan hanya karena Anda dapat melakukan sesuatu dengan perpustakaan tidak berarti Anda juga harus, atau orang lain harus dicegah dari mempelajari dasar-dasar dengan balasan "hanya menggunakan perpustakaan x". Ketika seseorang mengajukan pertanyaan spesifik tentang javascript, sopan menjawab pertanyaan menggunakan javascript biasa. Dengan segala cara sarankan sesuatu dari perpustakaan pilihan Anda, tetapi menjawab pertanyaan harus menjadi prioritas pertama.
RobG

4
Saya pribadi percaya bahwa seseorang harus terlebih dahulu mengetahui dasar-dasarnya.
Derek 朕 會 功夫

7
dengan semangat yang sama, kita benar-benar harus mencoba menulis lebih banyak bahasa majelis. Setengah bercanda (Saya lebih suka solusi jquery dan berpikir itu adalah lubang kelinci tanpa akhir jika Anda benar - benar ingin memahami apa yang terjadi di bawah tenda), tapi ya, saya senang bahwa saya memang tahu bahasa assembly, dan tahu bagaimana TCP koneksi dibuat, dll. Saya masih tidak akan memberikan solusi tingkat rendah kepada siapa pun hanya demi mengajari mereka keajaiban dari apa yang ada di bawah tenda.
Josh Sutterfield

6

Ini adalah cara paling sederhana Anda dapat memiliki fungsi javascript Anda sendiri dipanggil ketika suatu onSubmitterjadi.

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
Mengapa Anda memutuskan untuk mengikat fungsi 'terkirim'? Tidak ada penggunaan 'ini' dalam fungsi.
Lior,

bindmemang tidak perlu.
pstadler

3

Berdasarkan kebutuhan Anda, Anda juga dapat melakukan hal berikut tanpa perpustakaan seperti jQuery:

Tambahkan ini ke kepala Anda:

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

Dan formulir Anda mungkin masih terlihat seperti:

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

9
selalu gunakan addEventListeneralih-alih onsubmit atau onload untuk memungkinkan pengembang lain menambahkan pendengar mereka sendiri.
beytarovski

0

Dengan jQuery:

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

    if (pass)
        return true;
    else
        return false;
});
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.