← Back to Forms Chapter
Form Types

✅ Form Validation — Galat Data Roko

<input type="email" required pattern="[^@]+@[^@]+">

Form validation users ko galat data submit karne se rokti hai. Bina iske koi "abc" phone number de sakta, email blank chhod sakta, ya "hello" age mein likh sakta. Validation data check karta hai BEFORE server reach — instant feedback, koi round trip nahi.

Do types: Built-in (HTML attributes jaise required, pattern, min/max) — browser automatically karta hai. Custom (JavaScript checkValidity(), reportValidity(), setCustomValidity()) — tum rules likhte ho. Hamesha built-in se start karo, custom tab jab zarurat ho.

🛺
Auto Stand Analogy: "Bhai, form mein sab fill karo, warna order nahi hoga" = required. "Sirf 10 digit number likho" = pattern. "Minimum 1, maximum 10 parcel" = min/max. Validation = auto stand ka bouncer.

Code Example

HTML — Form Validation — Galat Data Roko
<!-- Required — field empty nahi ho sakta -->
<input type="text" name="name" required>
<input type="email" required>

<!-- Min/Max length -->
<input type="password" minlength="8" maxlength="50">

<!-- Min/Max value (numbers) -->
<input type="number" min="1" max="10" step="1">

<!-- Pattern — regex validation -->
<input type="tel" 
  pattern="[0-9]{10}" 
  title="Exactly 10 digit number daalo"
  placeholder="9876543210">

<!-- Pattern for Indian phone -->
<input type="tel" 
  pattern="[6-9][0-9]{9}" 
  title="Indian mobile: 6-9 se start, 10 digits">

<!-- Pattern for name (sirf letters aur spaces) -->
<input type="text" 
  pattern="[A-Za-z\s]{2,50}" 
  title="Sirf letters aur spaces, 2-50 characters">

<!-- Email pattern (strict) -->
<input type="email" 
  pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$">

<!-- Custom validation message -->
<input type="text" id="pincode" 
  pattern="[1-9][0-9]{5}" 
  title="6 digit pincode, 0 se start nahi hoga">

<!-- Form-level validation -->
<form id="orderForm" novalidate>
  <input type="text" required>
  <input type="email" required>
  <button type="submit">Submit</button>
</form>

<script>
// novalidate = browser ka default popup disable
// Custom messages ke liye JS validation use karo

const form = document.getElementById('orderForm');
const pincode = document.getElementById('pincode');

// Custom error message
pincode.addEventListener('input', function() {
  if (this.value && !this.validity.valid) {
    this.setCustomValidity('6 digit pincode daalo, 0 se start nahi hoga');
  } else {
    this.setCustomValidity('');
  }
});

// Manual validation check
form.addEventListener('submit', function(e) {
  e.preventDefault();
  if (form.checkValidity()) {
    // Sab valid — submit
    console.log('Form valid hai!');
  } else {
    // Errors dikhao
    form.reportValidity();
  }
});

// Single field check
if (pincode.checkValidity()) {
  console.log('Pincode valid hai');
}
</script>

<!-- CSS for validation states -->
<style>
  input:invalid {
    border: 2px solid #ef4444;
  }
  input:valid {
    border: 2px solid #10b981;
  }
  input:required {
    border-left: 4px solid #f59e0b;
  }
  input:placeholder-shown {
    border-color: #94a3b8;
  }
</style>
requiredField empty nahi ho sakta — browser submit block karta hai aur message dikhata hai
minlength/maxlengthMinimum aur maximum character count
min/maxMinimum aur maximum numeric value
stepAllowed increments (e.g., step="0.5" half values ke liye)
pattern="..."Regex pattern — data ko ye format match karna chahiye
title="..."Custom tooltip jab pattern fail ho
novalidate<form> pe — browser ka default validation popup disable
checkValidity()True/false return karta hai — popup bina dikhaye check
reportValidity()Browser popup dikhata hai pehla error jo mila
setCustomValidity()Field ke liye custom error message set karo
:invalid CSSStyle fields jo validation fail ki
:valid CSSStyle fields jo validation pass ki
:required CSSStyle fields jo mandatory hain
:placeholder-shownStyle fields jo abhi bhi empty hain (placeholder dikh raha)
[0-9]{10}Regex: exactly 10 digits
[6-9][0-9]{9}Regex: Indian mobile — 6-9 se start, total 10 digits

✅ When to Use

  • Har form field jo empty nahi ho sakta → required
  • Phone numbers → pattern digit count ke saath
  • Naam → pattern sirf letters allow kare
  • Pincode → pattern 6 digits ke liye
  • Passwords → minlength minimum strength ke liye
  • Quantities → min="1" zero/negative rokne ke liye
  • Custom error messages → setCustomValidity()
  • Real-time visual feedback → :valid/:invalid CSS

❌ When NOT to Use

  • Server-side validation replacement → KABHI NAHI, server pe bhi validate karo
  • Over-validating — uppercase force mat karo, naam sirf English letters pe restrict mat karo
  • Complex regex jab simple built-in kaam kare (type="email" already @ validate karta hai)
  • novalidate bina custom JS validation add kiye
💡
Validation ko layer karo: 1) HTML built-in (required, type, pattern), 2) CSS visual feedback (:valid/:invalid), 3) JS custom messages (setCustomValidity), 4) Server-side (HAMESHA, client pe kabhi bharosa mat karo). Koi layer miss = production mein bugs.