Menu

Form HTML: Field, action, method, fieldset dan Validasi

Cara membuat form di HTML: elemen form, atribut name, action dan method (GET vs POST), mengelompokkan dengan fieldset dan legend, validasi bawaan dengan required dan pattern, dan menangani submit di JavaScript.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Cara membuat form di HTML

Form adalah elemen <form> yang berisi field-field dan tombol submit. Setiap field butuh name: itulah kunci yang dipakai untuk mengirim nilainya. Isi form-nya lalu tekan Send. Pratinjau tidak mengirim apa pun ke mana pun; pratinjau menampilkan persis apa yang akan dikirim browser.

Bagian-bagiannya:

  • action adalah URL tujuan data, dan method adalah caranya (post di sini).
  • name di setiap field. Nilainya adalah apa yang diketik pembaca.
  • <label> memberi nama setiap field di layar dan untuk screen reader (lihat label HTML).
  • required dan type="email" membuat browser memeriksa field sebelum mengirim. Coba kirim dengan nama kosong, atau dengan abc sebagai email.
  • Tombol submit mengirim form. Menekan Enter di field teks juga melakukannya.

action dan method: ke mana dan bagaimana data dikirim

AtributNilaiDefault
actionURL apa punURL halaman saat ini
methodget, post, dialogget
enctypeapplication/x-www-form-urlencoded, multipart/form-data, text/plainapplication/x-www-form-urlencoded

Dengan method="get", field-field menjadi query string di URL: form pencarian dengan name="q" menuju /search?q=blue+shoes. Itu tepat untuk pencarian dan filter, karena hasilnya bisa di-bookmark dan dibagikan. Dengan method="post", field-field masuk ke body request dan tidak muncul di address bar atau riwayat. Pakai POST untuk apa pun yang melakukan login, membuat, mengubah, atau menghapus sesuatu, dan untuk password.

Form dengan upload file (<input type="file">) butuh method="post" dan enctype="multipart/form-data", kalau tidak, yang dikirim hanya nama file-nya. method="dialog" adalah untuk form di dalam <dialog>: mengirim form akan menutup dialog, bukan mengirim request.

Apa saja yang dikirim

Hanya field yang punya name yang dikirim, dan hanya saat field itu tidak disabled. Tekan Submit lalu bandingkan field-fieldnya dengan apa yang dikirim form:

Form mengirim city, zip, source dan action. Field tanpa name, field yang disabled, dan checkbox yang tidak dicentang tidak ikut. Input hidden dikirim tapi tidak pernah ditampilkan, dan tombol submit mengirim name dan value-nya sendiri karena tombol itulah yang dipakai.

Mengelompokkan field dengan fieldset dan legend

<fieldset> menggambar kotak di sekitar field yang saling berkaitan, dan <legend> adalah judulnya. Screen reader mengumumkan legend saat fokus masuk ke grup, itulah yang membuat sekumpulan radio button seperti di bawah ini bisa dipahami: "Delivery, Standard, radio button".

disabled di fieldset menonaktifkan semua field di dalamnya sekaligus, dan tidak ada satu pun yang dikirim. Hapus atribut itu dan field hadiah bisa dipakai.

Validasi bawaan: required, pattern dan kawan-kawannya

Browser memeriksa atribut-atribut ini sebelum mengirim form dan menampilkan pesan di field pertama yang gagal:

AtributYang diperiksa
requiredField tidak kosong (checkbox dicentang)
type="email", type="url"Nilainya terlihat seperti alamat email atau URL
minlength, maxlengthPanjang teks
min, max, stepRentang angka dan tanggal
patternSeluruh nilainya cocok dengan regular expression

:invalid dan :valid memberi gaya field berdasarkan statusnya. :user-invalid biasanya lebih baik: gaya ini baru berlaku setelah pembaca mengubah field lalu pindah, atau mencoba mengirim form, jadi form yang masih kosong tidak langsung penuh warna merah.

Ada tiga hal tentang pattern yang sering menjebak. Pola harus cocok dengan seluruh nilainya (tidak perlu ^ atau $). Pola hanya dijalankan saat field tidak kosong, jadi pasangkan dengan required. Dan pesan error dari browser bersifat umum, jadi jelaskan formatnya dengan teks yang terlihat di samping field. Chrome dan Firefox menambahkan teks title ke pesannya, tapi mudah terlewat.

Untuk mematikan pemeriksaan, misalnya saat kamu menguji validasi di server, tambahkan novalidate ke <form>. Satu tombol submit bisa melewatinya dengan formnovalidate.

Validasi browser adalah untuk kenyamanan pembaca. Siapa pun bisa mengedit halaman atau mengirim request tanpa validasi itu, jadi server harus memeriksa ulang setiap nilai.

Pesan sendiri dengan setCustomValidity

Saat sebuah aturan tidak bisa ditulis sebagai atribut, seperti "kedua password harus sama", atur pesannya dari JavaScript. Field dengan pesan kustom yang tidak kosong dianggap tidak valid; string kosong membuatnya valid lagi:

Field pengulangan tidak punya name, jadi hanya satu salinan password yang dikirim.

Menangani submit di JavaScript

Untuk mengirim form tanpa meninggalkan halaman, dengarkan submit, panggil preventDefault(), dan baca field-fieldnya dengan FormData. Mendengarkan submit, bukan click di tombol, menangkap semua cara mengirim form, termasuk Enter, dan baru berjalan setelah validasi bawaan lolos:

Object.fromEntries(new FormData(form)) mengubah field-field menjadi object biasa. Untuk field yang bisa punya beberapa nilai (checkbox dengan name yang sama, select multiple), pakai formData.getAll('name'), karena object hanya menyimpan nilai terakhir.

Kesalahan umum

  • Field tanpa name. Field itu diam-diam tidak ikut dalam data yang dikirim.
  • Placeholder sebagai pengganti label. Petunjuknya hilang begitu pembaca mengetik. Pakai <label>.
  • <button> tanpa type yang dipakai untuk hal lain selain mengirim form. Di dalam form, tombol itu adalah tombol submit.
  • Form di dalam form. Form bersarang tidak valid; browser mengabaikan tag <form> yang di dalam.
  • Mendengarkan click di tombol submit, bukan submit di form. Pengiriman dengan tombol Enter jadi terlewat.
  • Mengandalkan validasi browser di sisi server. Validasi lagi di sana.
  • GET untuk password. Password jadi tercatat di URL, riwayat, dan log server.

Pertanyaan yang sering diajukan

Bagaimana cara membuat form di HTML?

Bungkus field-field dengan <form action="/signup" method="post">, beri setiap field name dan <label>, lalu akhiri dengan <button type="submit">. Saat form dikirim, browser mengirim setiap pasangan name=value ke URL action.

Apa perbedaan GET dan POST di form?

method="get" (default-nya) menaruh field-field di URL, seperti /search?q=shoes, yang cocok untuk pencarian dan filter yang perlu bisa di-bookmark. method="post" mengirimnya di body request, yang tepat untuk login, pendaftaran, dan apa pun yang mengubah data.

Kenapa field form-ku tidak ikut terkirim?

Field itu tidak punya atribut name, atau field itu disabled. Hanya field yang punya name dan aktif yang dikirim. Checkbox atau radio button yang tidak dicentang juga tidak ikut sama sekali.

Untuk apa fieldset dan legend?

<fieldset> mengelompokkan field yang saling berkaitan dan <legend> adalah judul grupnya. Screen reader mengumumkan legend saat fokus masuk ke grup, itulah yang membuat sekelompok radio button bisa dipahami, dan disabled di fieldset menonaktifkan semua field di dalamnya.

Bagaimana cara memvalidasi form di HTML tanpa JavaScript?

Pakai atribut: required, type="email", minlength, maxlength, min, max dan pattern. Browser memblokir pengiriman dan menampilkan pesan untuk field pertama yang tidak valid. Selalu validasi juga di server, karena pemeriksaan ini berjalan di browser pembaca dan bisa dilewati.

Bagaimana cara mencegah form memuat ulang halaman?

Dengarkan event submit milik form dan panggil event.preventDefault(), lalu kirim datanya sendiri dengan fetch: form.addEventListener('submit', (e) => { e.preventDefault(); fetch(form.action, { method: 'POST', body: new FormData(form) }); }).

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai