Menu

Form HTML: campi, action, method, fieldset e validazione

Come creare un form in HTML: l'elemento form, gli attributi name, action e method (GET o POST), raggruppare con fieldset e legend, la validazione integrata con required e pattern e gestire l'invio in JavaScript.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

Come creare un form in HTML

Un form è un elemento <form> che contiene dei campi e un pulsante di invio. Ogni campo ha bisogno di un name: è la chiave con cui viene inviato il valore. Compila il form e premi Send. L'anteprima non invia niente da nessuna parte; mostra esattamente cosa avrebbe inviato il browser.

I pezzi:

  • action è l'URL a cui vanno i dati, e method è il modo (qui post).
  • name su ogni campo. Il suo valore è quello che ha scritto l'utente.
  • <label> dà un nome a ogni campo sullo schermo e per i lettori di schermo (vedi label in HTML).
  • required e type="email" fanno controllare i campi al browser prima dell'invio. Prova a inviare con il nome vuoto, o con abc come email.
  • Il pulsante di invio invia il form. Lo fa anche premere Invio in un campo di testo.

action e method: dove e come vanno i dati

AttributoValoriPredefinito
actionQualsiasi URLL'URL della pagina attuale
methodget, post, dialogget
enctypeapplication/x-www-form-urlencoded, multipart/form-data, text/plainapplication/x-www-form-urlencoded

Con method="get", i campi diventano la query string dell'URL: un form di ricerca con name="q" va a /search?q=blue+shoes. È la scelta giusta per ricerche e filtri, perché il risultato si può salvare nei preferiti e condividere. Con method="post", i campi vanno nel corpo della richiesta e non compaiono nella barra degli indirizzi né nella cronologia. Usa POST per tutto ciò che fa accedere, crea, modifica o elimina qualcosa, e per le password.

Un form con un caricamento di file (<input type="file">) ha bisogno di method="post" e enctype="multipart/form-data", altrimenti viene inviato solo il nome del file. method="dialog" è per un form dentro un <dialog>: l'invio chiude la finestra di dialogo invece di mandare una richiesta.

Cosa viene inviato

Vengono inviati solo i campi con un name, e solo quando non sono disabled. Premi Submit e confronta i campi con quello che invia il form:

Il form invia city, zip, source e action. Il campo senza nome, quello disattivato e la checkbox non selezionata restano fuori. Gli input nascosti vengono inviati ma non si vedono mai, e il pulsante di invio manda il suo name e il suo value perché è il pulsante usato.

Raggruppare i campi con fieldset e legend

<fieldset> disegna un riquadro intorno a campi correlati, e <legend> è la sua didascalia. I lettori di schermo annunciano la legend quando il focus entra nel gruppo, ed è questo che rende comprensibile un insieme di radio button come quelli qui sotto: "Delivery, Standard, pulsante di opzione".

disabled su un fieldset disattiva in un colpo tutti i campi al suo interno, e nessuno viene inviato. Toglilo e i campi per il regalo diventano utilizzabili.

Validazione integrata: required, pattern e compagnia

I browser controllano questi attributi prima dell'invio e mostrano un messaggio sul primo campo che non va:

AttributoControlla
requiredIl campo non è vuoto (una checkbox è selezionata)
type="email", type="url"Il valore ha l'aspetto di un indirizzo email o di un URL
minlength, maxlengthLunghezza del testo
min, max, stepIntervallo di numeri e date
patternL'intero valore corrisponde a un'espressione regolare

:invalid e :valid danno stile ai campi in base al loro stato. :user-invalid di solito è meglio: si applica solo dopo che l'utente ha modificato il campo ed è passato oltre, o ha provato a inviare, così un form vuoto non si apre tutto rosso.

Tre cose di pattern confondono spesso. Deve corrispondere all'intero valore (non servono ^ o $). Viene controllato solo quando il campo non è vuoto, quindi abbinalo a required. E il messaggio di errore del browser è generico, quindi descrivi il formato in un testo visibile accanto al campo. Chrome e Firefox aggiungono il testo di title al loro messaggio, ma è facile non notarlo.

Per disattivare i controlli, per esempio mentre provi la validazione del tuo server, aggiungi novalidate al <form>. Un singolo pulsante di invio può saltarli con formnovalidate.

La validazione del browser è una comodità per chi compila. Chiunque può modificare la pagina o inviare una richiesta senza passarci, quindi il server deve ricontrollare ogni valore.

Messaggi personalizzati con setCustomValidity

Quando una regola non si può scrivere come attributo, come "le due password devono coincidere", imposta il messaggio da JavaScript. Un campo con un messaggio personalizzato non vuoto non è valido; una stringa vuota lo rende di nuovo valido:

Il campo di ripetizione non ha name, quindi viene inviata una sola copia della password.

Gestire l'invio in JavaScript

Per inviare il form senza uscire dalla pagina, ascolta submit, chiama preventDefault() e leggi i campi con FormData. Ascoltare submit invece del click di un pulsante intercetta ogni modo di inviare, compreso Invio, e scatta solo dopo che la validazione integrata è passata:

Object.fromEntries(new FormData(form)) trasforma i campi in un semplice oggetto. Per i campi che possono avere più valori (checkbox con lo stesso nome, una select multipla) usa invece formData.getAll('name'), perché l'oggetto tiene solo l'ultimo valore.

Errori comuni

  • Campi senza name. Restano fuori dai dati inviati senza avvisare.
  • Placeholder al posto delle etichette. Il suggerimento sparisce appena si inizia a scrivere. Usa un <label>.
  • Un <button> senza type usato per qualcosa di diverso dall'invio. Dentro un form è un pulsante di invio.
  • Un form dentro un form. Annidare i form non è valido; il browser ignora il tag <form> interno.
  • Ascoltare click sul pulsante di invio invece di submit sul form. Gli invii con il tasto Invio sfuggono.
  • Fidarsi della validazione del browser lato server. Valida di nuovo lì.
  • GET per le password. Finiscono nell'URL, nella cronologia e nei log del server.

Domande frequenti

Come si crea un form in HTML?

Racchiudi i campi in <form action="/signup" method="post">, dai a ogni campo un name e un <label>, e chiudi con <button type="submit">. Quando il form viene inviato, il browser manda ogni coppia name=value all'URL di action.

Che differenza c'è tra GET e POST in un form?

method="get" (il predefinito) mette i campi nell'URL, come in /search?q=shoes, ed è adatto a ricerche e filtri che si possono salvare nei preferiti. method="post" li invia nel corpo della richiesta, ed è quello che vuoi per accessi, registrazioni e tutto ciò che modifica dei dati.

Perché un campo del mio form non viene inviato?

Non ha un attributo name, oppure è disabled. Vengono inviati solo i campi con un nome e attivi. Anche una checkbox o un radio button non selezionati restano completamente fuori.

A cosa servono fieldset e legend?

<fieldset> raggruppa campi correlati e <legend> è la didascalia del gruppo. I lettori di schermo annunciano la legend quando il focus entra nel gruppo, ed è questo che rende comprensibile un gruppo di radio button, e disabled su un fieldset disattiva tutti i campi al suo interno.

Come valido un form in HTML senza JavaScript?

Usa gli attributi: required, type="email", minlength, maxlength, min, max e pattern. Il browser blocca l'invio e mostra un messaggio per il primo campo non valido. Valida sempre anche sul server, perché questi controlli girano nel browser di chi usa la pagina e si possono aggirare.

Come evito che un form ricarichi la pagina?

Ascolta l'evento submit del form e chiama event.preventDefault(), poi invia tu i dati con fetch: form.addEventListener('submit', (e) => { e.preventDefault(); fetch(form.action, { method: 'POST', body: new FormData(form) }); }).

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA