Formulare
Inputuri, label-uri și validare fără JavaScript.
Actualizat
Ce este un formular
Un formular colectează date de la user și le trimite undeva (server, funcție). E cel mai vechi mecanism interactiv al web-ului și funcționează fără JavaScript: browserul știe singur să adune valorile și să le trimită.
<form action="/subscribe" method="post">
<label for="email">Email</label>
<input id="email" name="email" type="email" required />
<button type="submit">Trimite</button>
</form>La submit, browserul construiește un request cu email=ana@x.ro și îl trimite la /subscribe. În Next, action poate fi direct o Server Action.
Piesele unui formular
| Atribut / element | Rol |
|---|---|
action |
unde se trimit datele |
method |
get (date în URL — pentru căutări) sau post (în body — pentru modificări) |
name |
cheia sub care ajunge valoarea; fără name, câmpul nu se trimite |
<label for> |
eticheta legată de id-ul inputului |
<button type="submit"> |
trimite formularul |
<button> într-un form are implicit type="submit". Butoanele care nu trimit (deschid un modal, șterg un rând) primesc type="button".
Tipuri de input — și când le folosești
| Tip | Când | Bonus gratis |
|---|---|---|
text |
text liber scurt | — |
email |
adresă de email | validare format, tastatură cu @ pe mobil |
password |
parolă | caractere ascunse, manager de parole |
number |
cantități | săgeți, min/max/step |
tel |
telefon | tastatură numerică pe mobil (fără validare) |
url |
link | validare format |
date, time |
dată / oră | selector nativ |
search |
căutare | buton de ștergere |
checkbox |
da/nu sau mai multe opțiuni | — |
radio |
o singură opțiune dintr-un grup (același name) |
navigare cu săgeți |
file |
upload | accept="image/*" |
hidden |
valoare trimisă, dar invizibilă (id, token) | — |
Alte controale: <textarea> (text lung), <select> + <option> (listă), <fieldset> + <legend> (grup de câmpuri înrudite).
checkbox vs radio vs select: o alegere din 2–5 opțiuni vizibile → radio; o alegere din multe → select; mai multe alegeri → checkbox-uri.
Validare nativă
| Atribut | Efect |
|---|---|
required |
obligatoriu |
minlength / maxlength |
lungime text |
min / max / step |
numere, date |
pattern |
expresie regulată |
type |
formatul (email, url) |
Stilizezi starea cu :invalid, :valid, :user-invalid (doar după ce userul a interacționat).
Validarea din browser e pentru confortul userului, nu pentru securitate. Oricine o poate ocoli → validezi mereu și pe server.
Citirea datelor în JS
form.addEventListener('submit', e => {
e.preventDefault()
const data = Object.fromEntries(new FormData(e.currentTarget))
})FormData citește toate câmpurile cu name — același obiect pe care îl primește o Server Action. Cum lucrezi cu formulare în React (controlled, React Hook Form, Zod) — în tema Formulare.
Greșeli frecvente
- Input fără
name→ valoarea dispare la submit. - Input fără
label(doarplaceholder) → inaccesibil și dispare la tastare. - Butoane fără
typecare trimit formularul din greșeală. - Validare doar pe client.
Pe scurt
namedecide ce se trimite,label for+idleagă eticheta.- Tipul corect de input = validare + tastatură potrivită, gratis.
- Validează și pe server, mereu.