Validasi: Panjang dan Rentang Angka
minlength/maxlength untuk teks dan min/max/step untuk angka, dengan contoh nyata PIN, umur, dan jumlah pesanan.
Kenapa Batas Itu Penting
Tanpa batas, password satu karakter bisa lolos, umur 999 tahun tersimpan di database, dan seseorang memesan 1.000.000 tiket dalam sekali klik. Batasan panjang dan rentang adalah cara termurah menjaga logika bisnis tetap waras sebelum data menyentuh server.
minlength dan maxlength: Penggaris untuk Teks
maxlength memotong input yang kepanjangan, minlength menolak yang kependekan. Keduanya menghitung jumlah karakter:
<!-- PIN: harus tepat 6 digit -->
<label for="pin">PIN (6 digit):</label>
<input type="password" id="pin" name="pin"
minlength="6" maxlength="6" required />
<!-- password: minimal 8 karakter, maksimal 64 -->
<label for="pw">Password:</label>
<input type="password" id="pw" name="pw"
minlength="8" maxlength="64" required />Perhatikan trik PIN: minlength="6" sekaligus maxlength="6" berarti panjangnya tepat 6, tidak kurang tidak lebih. Untuk password, batas atas 64 mencegah serangan yang mengirim teks raksasa untuk membebani hashing server.
min, max, dan step: Penggaris untuk Angka
Untuk type="number", penggarisnya berbeda: min dan max membatasi nilai, bukan jumlah karakter:
<!-- umur: 17 sampai 65 tahun -->
<label for="umur">Umur:</label>
<input type="number" id="umur" name="umur" min="17" max="65" required />
<!-- jumlah tiket: 1 sampai 8 per transaksi -->
<label for="tiket">Jumlah tiket:</label>
<input type="number" id="tiket" name="tiket" min="1" max="8" value="1" required />Atribut step mengatur kelipatan yang diizinkan. Nilai default-nya 1 (bilangan bulat). Butuh kelipatan 500 untuk nominal donasi? Butuh desimal untuk berat badan?
<!-- donasi: kelipatan Rp500 -->
<label for="donasi">Donasi (Rp):</label>
<input type="number" id="donasi" name="donasi"
min="10000" step="500" />
<!-- berat badan: boleh desimal -->
<label for="bb">Berat badan (kg):</label>
<input type="number" id="bb" name="bb"
min="20" max="300" step="0.1" />Nilai 12.500 lolos step="500", tapi 12.300 ditolak karena bukan kelipatan 500. step="0.1" mengizinkan satu angka desimal seperti 65,5.
Contoh Realistis: Form Pemesanan
<form>
<label for="nama">Nama pemesan:</label>
<input type="text" id="nama" name="nama"
minlength="3" maxlength="50" required />
<label for="jml">Jumlah tiket (maks 8):</label>
<input type="number" id="jml" name="jml"
min="1" max="8" value="1" required />
<label for="anak">Jumlah anak di bawah 5 th (gratis):</label>
<input type="number" id="anak" name="anak"
min="0" max="4" value="0" />
<button type="submit">Pesan</button>
</form>Setiap batas di sini mencerminkan aturan bisnis nyata: nama tidak mungkin 1 huruf, tiket dibatasi agar tidak diborong calo, anak gratis dibatasi 4 per pemesan.
Salah vs Benar
<!-- SALAH: min/max tidak berpengaruh pada type="text" -->
<label for="u1">Umur:</label>
<input type="text" id="u1" name="umur" min="17" max="65" />
<!-- BENAR: min/max butuh type="number" -->
<label for="u2">Umur:</label>
<input type="number" id="u2" name="umur" min="17" max="65" /><!-- SALAH: maxlength membatasi KARAKTER, bukan nilai angka -->
<!-- "1000000" (7 karakter) tetap lolos maxlength="6"? Tidak, -->
<!-- tapi "9" lolos padahal maunya minimal 1000. Salah alat. -->
<label for="n1">Nominal (min Rp1.000):</label>
<input type="number" id="n1" name="nominal" maxlength="6" />
<!-- BENAR: untuk nilai minimum pakai min -->
<label for="n2">Nominal (min Rp1.000):</label>
<input type="number" id="n2" name="nominal" min="1000" />Catatan teknis:
maxlengthdihormati browser bahkan saat paste, tapiminlengthhanya diperiksa saat submit. Dan seperti biasa, semua batas ini wajib divalidasi ulang di server: atribut HTML menjaga UX tetap mulus, bukan menjaga database tetap aman.
export default function App(): JSX.Element { return <h1>Hello world</h1> }
Tantangan
Form Donasi Berbatas
Buat form donasi: nama donatur text minlength 3 maxlength 50 required, nominal number min 10000 step 1000 required, dan pesan text maxlength 140 opsional. Batas yang tepat membuat aturan bisnis (minimal donasi, kelipatan transfer) ditegakkan sebelum data sampai ke server.
<!doctype html> <html lang="id"> <head> <meta charset="utf-8" /> <title>Donasi</title> </head> <body> <form> <!-- batas di sini --> </form> </body> </html>