# Formulieren

# Gebruikersinvoer

Om een gebruiker de mogelijkheid te geven data in te voeren op een webpagina heb je nood aan allerlei soorten invoervelden. Deze invoervelden behoren tot een formulier. Enkele voorbeelden van invoervelden:

  • Tekstvak
  • Checkbox
  • Keuzerondjes
  • Selectielijst
  • Kleurenkiezer

De browser toont invoervelden niet altijd op een volledig uniforme manier, maar de functionaliteit blijft gelijk. Je kan later uiteraard de opmaak van de invoervelden via CSS aanpassen.

# <form> element

Alles begint met het blokelement <form>. Dit element vertelt de browser dat een nieuw formulier gemaakt moet worden waarin invoervelden kunnen geplaatst worden. Het form-element neemt twee belangrijke attributen aan:

  • action: Het attribuut action vertelt het formulier wat er moet gebeuren wanneer het formulier verzonden (submitted) wordt. Het attribuut zal in de meeste gevallen een andere webpagina als waarde hebben, waarnaar gegevens kunnen verzonden worden. Denk hierbij bijvoorbeeld aan een PHP-pagina die data ontvangt en achteraf verwerkt in een databank.
  • method: Het attribuut method is een technisch attribuut dat als waarde de HTTP-methode krijgt waarmee de data moet worden verzonden. De meest voorkomende waardes zijn get en post. De details van de werking van deze methodes vallen buiten het bereik van dit hoofdstuk.
  • enctype: Het attribuut enctype bepaalt in welke vorm de gegevens worden verstuurd naar de ontvanger. Je moet de waarde van dit attribuut enkel veranderen wanneer je de gebruiker ook bestanden wil laten uploaden. In dat geval wordt de waarde multipart/form-data.

Een volledige omkadering voor een formulier ziet er dus als volgt uit:

<form action="nieuwe_gebruiker.php" method="post">
    <!-- Invoervelden -->
</form>

Als je de gegevens van het formulier niet wil verzenden naar een andere pagina, om ze bijvoorbeeld via Javascript te verwerken, kan je de action- en method attributen weglaten.

# Invoervelden

Zoals eerder aangehaald zijn er een groot aantal verschillende soorten invoervelden die in een formulier thuishoren. De keuze van het type invoerveld hangt af van het soort gegeven dat je de gebruiker wil laten invoeren.

De meeste invoervelden maken gebruik van het lege, inline element <input>, maar er zijn uitzondering.

# Attribuut: type

Het element <input> op zich doet niet veel, maar door het attribuut type toe te voegen kan je via de waarde kiezen voor het soort invoerveld dat je wil tonen.

Een overzicht van mogelijke waardes:

Waarde voor type-attribuut Soort invoerveld Mogelijke toepassingen
text Tekstveld Invoer van voornaam, naam, adres, ...
password Tekstveld met maskering Invoer van wachtwoorden
email Tekstveld met invoercontrole voor geldig emailadres Invoer van een emailadres
search Tekstveld met kruisje om leeg te maken Invoer van zoektermen
tel Tekstveld met louter semantische betekenis Invoer van telefoonnr.
url Tekstveld met invoercontrole voor geldig URL Invoer webadressen
checkbox Selectievakje, meerdere selecties mogelijk Keuze van interesses, akkoord gaan met voorwaarden, ...
radio Selectierondje, slechts één selectie mogelijk Keuze van kledingmaat, geslacht, ...
number Tekstveld voor geldige getallen, met knopjes om te verhogen en verlagen Invoer aantal tickets, aantal producten, ...
range Slider tussen twee waardes Keuze van score tussen 1 en 5, antwoord enquêtevraag, ...
progress Voortgangsbalk Voortgangsbalk voor laden van inhoud
meter Meter met kleurgeving Meter voor gebruikte belminuten, waarschuwingsniveau, ...
color Kleurenpalet (sporadische ondersteuning) Keuze van verfkleur, achtergrondkleur, ...
datetime-local, date, time, week, month, year Datum/tijd keuzevenster (sporadische ondersteuning) Keuze van datum, uur, dag, week of jaar
image Afbeelding waarop klik-coördinaten bewaard worden Aanduiden belangrijk onderdeel op afbeelding
submit Verzendknop Verzenden van formulier
reset Knop om een formulier leeg te maken Formulier leegmaken
file Knop voor het kiezen van een bestand Afbeelding, zip-bestand, ... uploaden
hidden Verborgen veld met tekstgegevens Bijhouden gegevens op de achtergrond

Een aantal van de bovenstaande invoervelden werken met specifieke attributen of regelgevingen om ze correct te gebruiken. We bespreken een aantal van deze invoervelden van dichterbij in de rest van dit hoofdstuk. Naast het input-element bestaan er ook andere elementen die invoervelden aan de gebruiker tonen, zoals <textarea> en select. Ook deze komen verder in het hoofdstuk aan bod.

<!-- Tekstvak -->
<input type="text">
<!-- Checkbox -->
<input type="checkbox">
<!-- Verzendknop -->
<input type="submit">

# Attribuut: name

Wanneer de gegevens van een formulier verzonden worden krijgt elk invoerelement een naam toegewezen via het attribuut name. Deze naam kan dan door de ontvanger van de gegevens gebruikt worden als referentie naar het invoerveld en de gegevens die erin staan. Zo zou je een invoerveld voor het ingeven van een adres de logische naam "adres" kunnen geven. Let op: dit is geen id; dezelfde naam mag aan meerdere elementen gegeven worden, hoewel dit enkel in specifieke gevallen gegrond is.

<!-- Tekstvak voor invoer voornaam -->
<input type="text" name="voornaam">

# Attribuut: value

De initiële waarde van een invoerveld kan in HTML bepaald worden door ze als waarde te gebruiken voor het value attribuut van het input-element. Zo kan je invoervelden waarvan je verwacht dat de gebruiker ze zelden zal veranderen al een standaardwaarde geven, bv. voor het land van de gebruiker (België) of de eerste cijfers van een telefoonnummer (+32).

<input type="tel" name="telefoon-nummer" value="+32">

# Attribuut: autofocus

Om een invoerveld automatisch de focus te geven, d.w.z. de cursor in het invoerveld te plaatsen, gebruik je het attribuut autofocus. Dit attribuut ontvangt als geldige waardes true of false (waar of niet waar), maar als het attribuut gebruikt wordt zonder waarde (dus gewoon de vermelding autofocus) interpreteert de browser dit als een true-waarde voor het attribuut. Hierdoor wordt de schrijfwijze verkort.

<input type="text" name="voornaam" autofocus>

# Attribuut: disabled

Om een invoerveld onbeschikbaar te maken voor de gebruiker (nog wel zichtbaar) kan je het attribuut disabled gebruiken. Ook dit attribuut ontvangt true of false, met ook de vermelding voldoende om als true-waarde beschouwd te worden.

<input type="text" name="bus-nr" disabled>

# Labels

Een invoerveld kan voorzien worden van een label om de gebruiker te vertellen wat er verwacht wordt als waarde voor het invoerveld. Hiervoor gebruik je het element <label>. Om een label intrinsiek te koppelen aan een invoerveld, wordt het attribuut for gebruikt, met als waarde het id van het invoerveld waar het label bijhoort. Officiële labels voorzien heeft ook extra voordelen: het helpt schermlezers en zoekmachines met het begrijpen van het invoerveld en het zorgt ervoor dat wanneer je klikt (of tikt!) op een label, de cursor automatisch in het gekoppelde invoerveld geplaatst wordt.

<label for="naam">Naam:</label>
<input type="text" id="naam">

# Tekstvelden

De invoervelden die op het scherm worden getoond als tekstvakken (text, email, search, password, tel en url) ondersteunen de volgende gedeelde attributen:

  • maxlength: Maximum aantal karakters voor het invoerveld.
  • pattern: een reguliere expressie (regex) waaraan de invoer moet voldoen om als valid aangeduidt te worden. Meer informatie over het valideren van formuliervelden volgt in een later hoofdstuk.
  • placeholder: tekst die wordt getoond als hint voor het type invoer dat wordt verwacht. Deze tekst verdwijnt wanneer de gebruiker tekst invoert in het invoerveld.
<label for="adres">Adres:</label>
<input type="text" id="adres" maxlength="75" placeholder="Bv. Kerkstraat 4">

Tekstvak

# Selectievakjes en rondjes

Selectievakjes (checkbox) en selectierondjes (radio) geven de gebruiker de mogelijkheid te kiezen tussen meerdere opties. Het verschil tussen vakjes en rondjes, is dat de keuze bij rondjes een exclusieve keuze is (maximum één aangevinkt), terwijl bij selectievakjes er geen, meerdere of alle opties aangevinkt kunnen worden. Om vakjes of rondjes te groeperen in groepen moet elk individueel input-element hetzelfde name attribuut hebben.

Het attribuut value wordt op de achtergrond gebruikt als waarde voor het vakje of rondje. Dit is de waarde die wordt verstuurd bij het verzenden van het formulier. Bij een reeks selectierondjes zal de combinatie name en value doorgestuurd worden voor het geselecteerde rondje. Bij een reeks selectievakjes wordt de combinatie name en value meerdere keren opgenomen per aangevinkt vakje.

Verder kan je het attribuut checked gebruiken om een vakje of rondje standaard aan- of uit te vinken. Geldige waardes voor dit attribuut zijn true of false. Voor de waarde true volstaat het om enkel de attribuutnaam checked te gebruiken, zonder waarde.

<h2>Type kamer:</h2>

<input type="radio" id="keuze-enkel" name="kamer" value="enkel" checked>
<label for="keuze-enkel">Enkel</label>

<input type="radio" id="keuze-dubbel" name="kamer" value="dubbel">
<label for="keuze-dubbel">Dubbel</label>

<input type="radio" id="keuze-familie" name="kamer" value="familie">
<label for="keuze-familie">Familie</label>

Radiobuttons

<h2>Geliefde dieren:</h2>

<input type="checkbox" id="keuze-honden" name="dieren" value="honden">
<label for="keuze-honden">Honden</label><br>

<input type="checkbox" id="keuze-katten" name="dieren" value="katten">
<label for="keuze-katten">Katten</label><br>

<input type="checkbox" id="keuze-vissen" name="dieren" value="vissen">
<label for="keuze-vissen">Vissen</label><br>

<input type="checkbox" id="keuze-hamsters" name="dieren" value="hamsters">
<label for="keuze-hamsters">Hamsters</label>

Checkbox

# Knoppen

Een formulier kan voorzien worden van verschillende knoppen die elk een andere taak binnen het formulier krijgen. De standaardtaken zijn verzenden en leegmaken. Deze twee taken komen als invoerelement overeen met de types submit en reset.

Bij het klikken op een verzendknop worden de gegevens van een formulier verzameld en gestuurd naar het webadres dat staat opgegeven als waarde voor het action attribuut van het formulier. Het verzenden van het formulier zal dus een andere pagina openen (tenzij anders bepaald via Javascript).

Bij het klikken op de knop leegmaken zullen alle invoervelden van het formulier terug worden gezet op de standaardwaarden zoals ze bepaald zijn in de HTML-code.

Om de weergavetekst van een knop van type submit en reset te veranderen gebruik je het value attribuut. Er hoeft dus geen label-element voorzien te worden!

<input type="submit" value="Verzenden">
<input type="reset" value="Leegmaken">

Knoppen

# Bestanden uploaden

Om de gebruiker de mogelijkheid te geven een bestand te uploaden gebruik je file als waarde voor het type-attribuut van een invoerveld. Je hoeft in principe verder niets te doen; het apparaat van de gebruiker (desktop of mobiel) zal zelf de volgende stappen ondernemen om de gebruiker een bestand te laten kiezen voor te uploaden. Het pad naar het gekozen bestand wordt na het kiezen in het value attribuut gestoken.

Een bestand heeft steeds een bepaalde extensie. Denk aan extensies zoals .jpg, .doc, .mp3, enz... Je kan de gebruiker beperken tot het kiezen van een bestand met enkel extensies uit een reeks die je meegeeft aan het input-element via het attribuut accept. Dit attribuut neemt als waarde een lijst van extensies aan, gescheiden door komma's, bv. .jpg, .doc, .mp3.

Door het attribuut multiple toe te voegen (waarde true/false of weglaten) mag de gebruiker meerdere bestanden kiezen.

Denk eraan dat een formulier voorzien moet zijn van het juist enctype voor het uploaden van bestanden!

<form enctype="multipart/form-data" action="ontvanger.php" method="POST">
    <input type="file" name="foto" accept=".jpg, .png" multiple>
</form>

Bestand uploaden

# Grote tekstvakken

Als alternatief voor tekstvelden die als input-element gemaakt worden, kan je ook gebruikmaken van het element <textarea>. Dit element is ook een invoerveld voor tekst, maar met de mogelijkheid om meerdere lijnen tekst in te geven.

Het element <textarea> neemt grotendeels dezelfde attributen aan als input-elementen die een tekstveld maken. Daarnaast is er ondersteuning voor een breedte en hoogte in aantal karaktertekens op te geven, met de attributen cols en rows respectievelijk. Deze afmetingen worden overschreven door afmetingen bepaald in stijlbladen.

<label for="feedback">Feedback:</label><br>
<!-- Tekstvak van 30 karakters breed en 6 lijnen hoog -->
<textarea name="feedback" id="feedback" cols="30" rows="6"></textarea>

Textarea

<textarea> is geen leeg element en heeft dus een sluitingstag nodig!

# Selectielijsten

Soms wil je een gebruiker de keuze geven uit een reeks van mogelijke opties, zonder hiervoor te grijpen naar selectierondjes of -vakjes. Als alternatief kan je kiezen voor een selectielijst (dropdown list), waar de gebruiker een keuzes voorgeschoteld krijgt na het openklikken van de lijst.

Om een selectielijst te bouwen gebruik je het element <select>. Binnen dit element wordt elke keuze opgenomen als <option> element. Je kan het vergelijken met het principe van een lijst (<ul>, <ol>) en lijstitems (<li>). Elk option-element moet ook het attribuut value bevatten, met als waarde de tekst die wordt doorgegeven bij het versturen van het formulier (zoals bij keuzerondjes en -vakjes).

Je kan de gebruiker toelaten meerdere opties aan te duiden door het attribuut multiple op te nemen in het select-element. Daarnaast kan je een optie op voorhand selecteren door het attribuut selected op te nemen in een option-element.

<label for="kleur">Kleur artikel:</label>
<select name="kleur" id="kleur">
    <option value="rood">Rood</option>
    <option value="blauw" selected>Blauw</option>
    <option value="geel">Geel</option>
    <option value="groen">Groen</option>
</select>

Selectielijst

# Optiongroups

Je kan opties in een selectielijst verder onderverdelen in zelfgekozen groepen of categorieën. Hiervoor gebruik je, binnen het select-element, het element <optgroup>. Om de weergavenaam van de groep te veranderen gebruik je het attribuut label binnen het element <optgroup>.

<label for="kleur">Kleur artikel:</label>
<select name="kleur" id="kleur">
    <optgroup label="Voorradig">
        <option value="rood">Rood</option>
        <option value="blauw">Blauw</option>
    </optgroup>
    <optgroup label="Niet voorradig">
        <option value="Geel">Geel</option>
        <option value="Groen">Groen</option>
    </optgroup>
</select>

Option Group

# Invoervelden groeperen

Om een visuele groepering van invoervelden te maken kan je gebruikmaken van het element <fieldset>. Dit element is een blokelement waarbinnen je één of meerdere invoervelden kan plaatsen. Met het kindelement <legend> geef je de groepering een naam die zichtbaar is op de pagina.

<fieldset>
    <legend>Persoonlijke gegevens</legend>
    <label for="voornaam">Voornaam:</label>
    <input type="text" name="voornaam" id="voornaam">
    <br>
    <label for="familienaam">Familienaam:</label>
    <input type="text" name="familienaam" id="familienaam">
    <br>
    <label for="adres">Adres:</label>
    <input type="text" name="adres" id="adres">
</fieldset>

Fieldset