Lompat ke konten
Kembali ke modul

Browser: HTML, CSS, DOM, dan Aksesibilitas · 8/8

Form dan validasi di browser

Platform-nya bisa lebih banyak dari yang kamu kira — dan kenapa validasi browser saja tidak pernah cukup.

Baca 25 menit

Setelah pelajaran ini kamu bisa

  • Membangun form yang sudah dipahami browser
  • Memakai validasi bawaan, dan menjelaskan kenapa itu tidak cukup
  • Membaca nilai yang di-submit dengan `FormData`
  • Melaporkan error secara aksesibel

Form adalah cara data masuk ke aplikasimu, yang menjadikannya UI terpenting yang kamu bangun sekaligus tempat di mana keamanan benar-benar penting. Platform-nya memberi lebih banyak daripada yang dipakai sebagian besar developer.

html
<form method="post" action="/api/bookings">
  <label for="guests">Number of guests</label>
  <input
    id="guests"
    name="guests"            <!-- name is what gets SUBMITTED. Without it: nothing. -->
    type="number"
    min="1" max="10"
    required
    inputmode="numeric"      <!-- a numeric keypad on phones -->
  />

  <label for="email">Email</label>
  <input id="email" name="email" type="email" required autocomplete="email" />

  <button type="submit">Book</button>
</form>
name adalah identitas field itu dalam pengiriman. Input yang cantik tanpa name tidak mengirim apa pun, dan itu memang mudah terlewat.

Memilih type yang tepat memberimu keyboard yang sesuai di ponsel, validasi gratis, dan pembacaan yang benar oleh teknologi bantu. type="email" di ponsel menampilkan keyboard dengan @ — hal kecil yang secara terukur meningkatkan tingkat penyelesaian form.

Validasi bawaan

html
<input required />                        <!-- must not be empty -->
<input type="email" />                    <!-- must look like an email -->
<input type="number" min="1" max="10" />  <!-- must be in range -->
<input minlength="8" maxlength="200" />
<input pattern="[0-9]{5}" />              <!-- must match the regex -->

Browser memblokir pengiriman dan menampilkan pesan, dalam bahasa penggunanya sendiri, tanpa satu baris kode dari kamu. Lalu itu berhenti mencukupi — karena dua alasan yang berbeda.

  • Pesannya bukan milikmu. Kamu tidak bisa memberi style, mengatur posisi, atau menyusun kalimatnya, dan bunyinya berbeda antar browser.
  • Itu bukan kontrol keamanan. Siapa pun bisa menghapus atributnya di DevTools, mematikan JavaScript, atau melewati halamanmu sama sekali lalu mengirim data dengan curl.

Membaca nilainya

js
form.addEventListener("submit", (event) => {
  event.preventDefault();

  const data = new FormData(form);

  data.get("guests");            // "3" - always a STRING
  data.get("missing");           // null
  data.getAll("tags");           // an array, for checkboxes sharing a name
  Object.fromEntries(data);      // a plain object, handy for logging

  // Everything arrives as a string. Convert and validate deliberately.
  const guests = Number(data.get("guests"));
  if (!Number.isInteger(guests) || guests < 1) return;
});
FormData juga persis yang diterima Server Action di Next.js — kamu sudah membaca formData.get("name") di action auth proyek ini.
Coba sendiri

Validasi yang mengembalikan error per field — bentuk yang dibutuhkan setiap form. Ubah input-nya untuk melihat aturan mana yang aktif.

Hasil

Tekan Jalankan untuk melihat hasilnya.

Ini jalan di browser kamu, di dalam sandbox. Apa pun yang kamu tulis di sini tidak bisa merusak situs.

Melaporkan error secara aksesibel

Border merah itu tidak terlihat oleh screen reader dan oleh pengguna buta warna. Tiga atribut membuat pesan error benar-benar sampai ke semua orang.

html
<label for="email">Email</label>
<input
  id="email"
  name="email"
  aria-invalid="true"              <!-- this field is in an error state -->
  aria-describedby="email-error"   <!-- read THIS when announcing the field -->
/>
<p id="email-error" role="alert">
  That does not look like an email address.
</p>
aria-describedby menautkan pesannya ke input-nya, jadi screen reader membacakannya bersama. role="alert" membacakannya tepat saat ia muncul.
  • Jangan hanya pakai warna. Sertai dengan ikon atau teks, supaya tetap terbaca oleh pengguna buta warna.
  • Jangan validasi di setiap ketikan. Memberi tahu seseorang email-nya tidak valid saat ia masih mengetik karakter ketiga itu tidak ramah. Validasi saat blur, atau saat submit.
  • Simpan apa yang sudah mereka ketik. Form yang mengosongkan dirinya sendiri saat error adalah cara tercepat kehilangan pelanggan.
  • Jelaskan cara memperbaikinya. "Input tidak valid" tidak membantu siapa pun; "Password minimal 8 karakter" iya.
  • Pindahkan fokus ke error pertama saat submit, supaya pengguna keyboard dibawa langsung ke sana.

Tugas praktik

Buka halaman /id/sign-up di proyek ini. Submit dalam keadaan kosong dan perhatikan pesan dari browser-nya sendiri. Sekarang di DevTools, temukan input password dan hapus atribut minlength-nya, lalu submit password 3 karakter. Pemeriksaan client-nya hilang — tapi server tetap menolaknya, dan pesan yang kamu lihat berasal dari validateCredentials. Itu defence in depth, didemonstrasikan pada kodemu sendiri.

Hasil yang diharapkan

Browser memblokirnya lebih dulu; setelah atributnya dihapus, server yang menolaknya.