Creare un modulo di prenotazione accessibile con datalist, range, date e file

by Anastasia P.
SHARE
Creare un modulo di prenotazione accessibile con datalist, range, date e file
© Guida-HTML5.it

Introduzione

Gli elementi avanzati dei form HTML permettono di raccogliere dati più precisi senza costringere l’utente a compilare campi complessi o ambigui. In questo tutorial realizzeremo un modulo di prenotazione per un’attività, combinando quattro controlli utili: datalist, range, date e file.

L’obiettivo non è soltanto mostrare la sintassi, ma progettare un’esperienza completa e comprensibile. Il campo datalist proporrà alcune destinazioni già disponibili, lasciando comunque la possibilità di inserire un valore personalizzato. L’input range consentirà di selezionare il numero di partecipanti. Il controllo date raccoglierà la data dell’escursione, mentre file permetterà di allegare un documento, ad esempio una certificazione o una richiesta particolare.

Questi elementi sono supportati dai browser moderni e offrono controlli nativi, ma devono essere accompagnati da etichette chiare, vincoli coerenti e testi di aiuto. HTML può validare molti dati direttamente nel browser, anche se la validazione lato server rimane sempre necessaria.

Codice completo

<form action="/prenotazioni" method="post" enctype="multipart/form-data">
  <fieldset>
    <legend>Dettagli della prenotazione</legend>

    <div>
      <label for="destinazione">Destinazione preferita</label>
      <input
        type="text"
        id="destinazione"
        name="destinazione"
        list="destinazioni"
        placeholder="Scegli o scrivi una destinazione"
        required
      >

      <datalist id="destinazioni">
        <option value="Dolomiti">
        <option value="Lago di Garda">
        <option value="Cinque Terre">
        <option value="Etna">
      </datalist>

      <small>Puoi scegliere un suggerimento oppure inserire un’altra località.</small>
    </div>

    <div>
      <label for="partecipanti">
        Numero di partecipanti:
        <output id="valorePartecipanti" for="partecipanti">4</output>
      </label>

      <input
        type="range"
        id="partecipanti"
        name="partecipanti"
        min="1"
        max="20"
        value="4"
        step="1"
        oninput="valorePartecipanti.value = partecipanti.value"
      >

      <small>Sono consentite prenotazioni da 1 a 20 persone.</small>
    </div>

    <div>
      <label for="data">Data dell’escursione</label>
      <input
        type="date"
        id="data"
        name="data"
        min="2026-01-01"
        required
      >
      <small>Seleziona una data disponibile nel calendario.</small>
    </div>

    <div>
      <label for="documento">Documento aggiuntivo, se necessario</label>
      <input
        type="file"
        id="documento"
        name="documento"
        accept=".pdf,.jpg,.jpeg,.png"
      >
      <small>Formati accettati: PDF, JPG e PNG. Dimensione massima consigliata: 5 MB.</small>
    </div>

    <div>
      <label for="note">Note per l’organizzazione</label>
      <textarea id="note" name="note" rows="4" cols="40"></textarea>
    </div>

    <button type="submit">Invia prenotazione</button>
  </fieldset>
</form>

<script>
  const dataInput = document.querySelector("#data");

  // Imposta come data minima il giorno corrente.
  const oggi = new Date();
  const anno = oggi.getFullYear();
  const mese = String(oggi.getMonth() + 1).padStart(2, "0");
  const giorno = String(oggi.getDate()).padStart(2, "0");

  dataInput.min = `${anno}-${mese}-${giorno}`;
</script>

Spiegazione

Usare datalist per suggerimenti flessibili

datalist contiene una serie di opzioni collegate a un input tramite l’attributo list. A differenza di un elemento select, non obbliga l’utente a scegliere uno dei valori disponibili. Questo comportamento è utile quando si desiderano suggerimenti, ma si vuole consentire anche un testo personalizzato.

Il campo collegato deve avere un identificatore, mentre l’attributo list deve riportare l’identificatore del relativo datalist. Le opzioni vengono definite con elementi option. Il server dovrà comunque verificare che la destinazione inserita sia valida e gestibile.

Visualizzare il valore di un range

L’input range rappresenta un valore numerico all’interno di un intervallo. Gli attributi min, max, value e step definiscono rispettivamente il limite inferiore, il limite superiore, il valore iniziale e l’incremento.

Da solo, il cursore non mostra necessariamente il numero selezionato in modo evidente. Per questo esempio è stato aggiunto un elemento output. L’evento oninput aggiorna immediatamente il testo visualizzato mentre l’utente sposta il cursore. In un progetto reale, il comportamento JavaScript può essere separato dal markup usando un file dedicato e addEventListener.

Gestire le date

input type="date" offre un selettore di calendario nativo. L’attributo min impedisce di scegliere date precedenti a quella indicata. Nel codice, JavaScript calcola il giorno corrente e aggiorna dinamicamente il valore minimo.

Le date inviate dal browser utilizzano generalmente il formato YYYY-MM-DD. Non bisogna affidarsi soltanto ai vincoli HTML: un utente può inviare una richiesta costruita manualmente, quindi il server deve controllare formato, disponibilità e intervalli temporali.

Caricare file in modo corretto

Quando un form contiene un campo file, è indispensabile usare enctype="multipart/form-data". Senza questo attributo, il file non viene trasmesso correttamente al server.

L’attributo accept suggerisce i formati ammessi, ma non rappresenta una protezione definitiva. Il server deve verificare estensione, tipo MIME, dimensione, contenuto e nome del file. È inoltre consigliabile rinominare i file caricati e conservarli fuori dalle cartelle eseguibili.

Best practice

  • Collega sempre ogni controllo a un elemento label tramite gli attributi for e id.
  • Usa required soltanto per dati realmente obbligatori, evitando di rendere il modulo inutilmente difficile.
  • Fornisci un testo di aiuto vicino ai campi complessi, soprattutto per file, date e intervalli numerici.
  • Non considerare accept, min, max o required come sistemi di sicurezza: la validazione server-side è indispensabile.
  • Imposta limiti realistici per il numero di partecipanti e verifica che il valore ricevuto sia effettivamente un intero.
  • Controlla il fuso orario quando lavori con date e prenotazioni, soprattutto se utenti e server si trovano in paesi diversi.
  • Gestisci gli errori con messaggi comprensibili, indicando come correggere il valore inserito.
  • Verifica il comportamento dei controlli su dispositivi mobili e con tecnologie assistive.
  • Per i file, applica limiti di dimensione lato server e impedisci l’esecuzione diretta dei contenuti caricati.

Riepilogo

Un modulo HTML ben progettato può usare datalist per offrire suggerimenti senza limitare l’utente, range per selezionare rapidamente un numero, date per raccogliere giorni in formato coerente e file per allegare documenti. La qualità del risultato dipende però anche da etichette accessibili, messaggi di aiuto, vincoli sensati e controlli lato server.

La combinazione di HTML semantico e JavaScript leggero consente di creare moduli pratici senza introdurre componenti complessi. Prima della pubblicazione, prova il form con diversi browser, tastiera, smartphone e valori non validi.

Approfondisci con risorse ufficiali

SHARE