Naar de inhoud
Gratis naslagwerk over HTML
HTML leren en naslaan
Naslag / Formulieren

Het element <input type="search">

<input>-elementen van het type search zijn tekstvelden die zijn ontworpen zodat de gebruiker er zoekopdrachten in kan invoeren. Deze zijn functioneel identiek aan text-invoervelden, maar kunnen door de user agent anders worden gestyled.

Code
<label for="site-search">Search the site:</label>
<input type="search" id="site-search" name="q" />

<button>Search</button>
Resultaat in de browser

Waarde

Het value-attribuut bevat een tekenreeks die de waarde vertegenwoordigt die in het zoekveld staat. Je kunt deze in JavaScript ophalen met de HTMLInputElement.value-eigenschap.

JS
searchTerms = mySearch.value;

Als er geen validatiebeperkingen gelden voor de invoer (zie Validatie voor meer details), kan de waarde elke tekenreeks of een lege tekenreeks ("") zijn.

Aanvullende attributen

Naast de globale attributen en de attributen die op alle <input>-elementen van toepassing zijn ongeacht hun type, ondersteunen zoekveldinvoer de volgende attributen.

list

De waarde van het list-attribuut is het id van een <datalist>-element dat zich in hetzelfde document bevindt. De <datalist> biedt een lijst met vooraf gedefinieerde waarden om de gebruiker voor deze invoer voor te stellen. Eventuele waarden in de lijst die niet compatibel zijn met het type worden niet opgenomen in de voorgestelde opties. De opgegeven waarden zijn suggesties, geen vereisten: gebruikers kunnen uit deze vooraf gedefinieerde lijst kiezen of een andere waarde opgeven.

maxlength

De maximale tekenreekslengte (gemeten in UTF-16-code-eenheden) die de gebruiker in het zoekveld kan invoeren. Dit moet een geheel getal zijn van 0 of hoger. Als er geen maxlength is opgegeven, of er is een ongeldige waarde opgegeven, heeft het zoekveld geen maximale lengte. Deze waarde moet ook groter dan of gelijk aan de waarde van minlength zijn.

De invoer zal falen bij beperkingsvalidatie als de lengte van de tekst die in het veld is ingevoerd groter is dan maxlength UTF-16-code-eenheden. Beperkingsvalidatie wordt alleen toegepast wanneer de waarde door de gebruiker wordt gewijzigd.

minlength

De minimale tekenreekslengte (gemeten in UTF-16-code-eenheden) die de gebruiker in het zoekveld kan invoeren. Dit moet een niet-negatief geheel getal zijn dat kleiner dan of gelijk is aan de waarde die is opgegeven door maxlength. Als er geen minlength is opgegeven, of er is een ongeldige waarde opgegeven, heeft de zoekinvoer geen minimale lengte.

Het zoekveld zal falen bij beperkingsvalidatie als de lengte van de tekst die in het veld is ingevoerd kleiner is dan minlength UTF-16-code-eenheden. Beperkingsvalidatie wordt alleen toegepast wanneer de waarde door de gebruiker wordt gewijzigd.

pattern

Het pattern-attribuut is, indien opgegeven, een reguliere expressie waaraan de value van de invoer moet voldoen om beperkingsvalidatie te doorstaan. Het moet een geldige JavaScript-reguliere expressie zijn, zoals gebruikt door het RegExp-type, en zoals gedocumenteerd in onze gids over reguliere expressies; de 'u'-vlag wordt opgegeven bij het compileren van de reguliere expressie, zodat het patroon wordt behandeld als een reeks Unicode-codepunten, in plaats van als ASCII. Er mogen geen forward slashes rond de patroontekst worden opgegeven.

Als het opgegeven patroon niet is opgegeven of ongeldig is, wordt er geen reguliere expressie toegepast en wordt dit attribuut volledig genegeerd.

Opmerking

Gebruik het title-attribuut om tekst op te geven die de meeste browsers als tooltip weergeven om uit te leggen wat de vereisten zijn om aan het patroon te voldoen. Je moet ook andere verklarende tekst in de buurt opnemen.

Zie de sectie Een patroon opgeven voor details en een voorbeeld.

placeholder

Het placeholder-attribuut is een tekenreeks die de gebruiker een korte hint geeft over wat voor soort informatie in het veld wordt verwacht. Het moet een woord of korte zin zijn die het verwachte type gegevens laat zien, in plaats van een verklarend bericht. De tekst mag geen regeleinden of carriage returns bevatten.

Als de inhoud van het besturingselement één richting heeft (LTR of RTL), maar de placeholder in de tegenovergestelde richting moet presenteren, kun je Unicode-opmaaktekens voor bidirectioneel gebruiken om de richting binnen de placeholder te overschrijven; zie Hoe Unicode-besturingstekens voor bidi-tekst te gebruiken voor meer informatie.

Opmerking

Vermijd het gebruik van het placeholder-attribuut indien mogelijk. Het is niet zo semantisch nuttig als andere manieren om je formulier toe te lichten, en kan onverwachte technische problemen met je inhoud veroorzaken. Zie <input>-labels voor meer informatie.

readonly

Een Booleaans attribuut dat, indien aanwezig, betekent dat dit veld niet door de gebruiker kan worden bewerkt. De value ervan kan echter nog steeds worden gewijzigd door JavaScript-code die de value-eigenschap van HTMLInputElement rechtstreeks instelt.

Opmerking

Omdat een alleen-lezen veld geen waarde kan hebben, heeft required geen enkel effect op invoervelden waarop ook het readonly-attribuut is opgegeven.

size

Het size-attribuut is een numerieke waarde die aangeeft hoeveel tekens breed het invoerveld moet zijn. De waarde moet een getal groter dan nul zijn, en de standaardwaarde is 20. Aangezien de tekenbreedte varieert, kan dit al dan niet exact zijn en moet er niet op worden vertrouwd dat dit precies klopt; de resulterende invoer kan smaller of breder zijn dan het opgegeven aantal tekens, afhankelijk van de tekens en het gebruikte lettertype (de font-instellingen).

Dit stelt geen limiet in op het aantal tekens dat de gebruiker in het veld kan invoeren. Het geeft alleen ongeveer aan hoeveel er tegelijk zichtbaar zijn. Gebruik het maxlength-attribuut om een bovengrens voor de lengte van de invoergegevens in te stellen.

spellcheck

spellcheck is een globaal attribuut dat wordt gebruikt om aan te geven of spellingcontrole voor een element moet worden ingeschakeld. Het kan worden gebruikt op elke bewerkbare inhoud, maar hier bekijken we specifiek het gebruik van spellcheck op <input>-elementen. De toegestane waarden voor spellcheck zijn:

falseSchakel spellingcontrole voor dit element uit.
trueSchakel spellingcontrole voor dit element in.
"" (lege tekenreeks) of geen waardeVolg het standaardgedrag van het element voor spellingcontrole. Dit kan gebaseerd zijn op de spellcheck-instelling van een bovenliggend element of andere factoren.

Een invoerveld kan spellingcontrole ingeschakeld hebben als het het readonly-attribuut niet heeft ingesteld en niet uitgeschakeld is.

De waarde die wordt geretourneerd bij het lezen van spellcheck weerspiegelt mogelijk niet de daadwerkelijke status van spellingcontrole binnen een besturingselement, als de voorkeuren van de user agent de instelling overschrijven.

Niet-standaard attributen

De volgende niet-standaard attributen zijn beschikbaar voor zoekinvoervelden. Vermijd het gebruik ervan waar mogelijk.

incremental

Het Booleaanse attribuut incremental is een WebKit- en Blink-uitbreiding (dus ondersteund door Safari, Opera, Chrome, enz.) die, indien aanwezig, de user agent vertelt om de invoer als een live zoekopdracht te verwerken. Terwijl de gebruiker de waarde van het veld bewerkt, verzendt de user agent search-gebeurtenissen naar het HTMLInputElement-object dat het zoekveld vertegenwoordigt. Hierdoor kan je code de zoekresultaten in real time bijwerken terwijl de gebruiker de zoekopdracht bewerkt.

Als incremental niet is opgegeven, wordt de search-gebeurtenis alleen verzonden wanneer de gebruiker expliciet een zoekopdracht start (bijvoorbeeld door tijdens het bewerken van het veld op de toets Enter of Return te drukken).

De search-gebeurtenis is snelheidsbeperkt, zodat deze niet vaker wordt verzonden dan een door de implementatie bepaald interval.

results

Het results-attribuut — alleen ondersteund door Safari — is een numerieke waarde waarmee je het maximale aantal items kunt overschrijven dat wordt weergegeven in het native vervolgkeuzemenu met eerdere zoekopdrachten van het <input>-element.

De waarde moet een niet-negatief decimaal getal zijn. Indien niet opgegeven, of als er een ongeldige waarde is opgegeven, wordt het standaard maximale aantal items van de browser gebruikt.

Zoekvelden gebruiken

<input>-elementen van het type search lijken erg op die van het type text, behalve dat ze specifiek bedoeld zijn voor het verwerken van zoektermen. Ze zijn in principe gelijkwaardig qua gedrag, maar user agents kunnen ervoor kiezen ze standaard anders te stylen (en sites kunnen natuurlijk stylesheets gebruiken om er aangepaste stijlen op toe te passen).

Basisvoorbeeld

HTML
<form>
  <div>
    <input type="search" id="mySearch" name="q" />
    <button>Search</button>
  </div>
</form>

Dit wordt als volgt weergegeven:

Resultaat in de browser

q is de meest gebruikelijke name die aan zoekinvoervelden wordt gegeven, hoewel dit niet verplicht is. Bij verzending wordt het naam/waarde-paar dat naar de server wordt gestuurd q=zoekterm.

Opmerking

Vergeet niet een name voor je invoer in te stellen, anders wordt er niets verzonden.

Verschillen tussen de typen search en text

De belangrijkste basisverschillen zitten in de manier waarop browsers ze verwerken. Het eerste wat opvalt, is dat sommige browsers een kruisje tonen waarop geklikt kan worden om de zoekterm direct te verwijderen indien gewenst; in Chrome wordt deze actie ook geactiveerd door op escape te drukken. De volgende schermafbeelding komt uit Chrome:

Focused search input, with focus ring, with the text 'cats'. There is an x icon in the input abutting the right side.

Daarnaast slaan moderne browsers ook automatisch eerder ingevoerde zoektermen op, over verschillende domeinen heen, die vervolgens als autocomplete-opties verschijnen wanneer latere zoekopdrachten worden uitgevoerd in zoekvelden op dat domein. Dit helpt gebruikers die na verloop van tijd geneigd zijn dezelfde of vergelijkbare zoekopdrachten uit te voeren. Deze schermafbeelding komt uit Firefox:

An input in error state with a red focus ring. The user has entered the letter 'h'. A pop-up selection list is open directly under the input box with two options: hello and hermansje.

Laten we nu enkele nuttige technieken bekijken die je op je zoekformulieren kunt toepassen.

Placeholders instellen

Je kunt een nuttige placeholder in je zoekveld opnemen die een hint kan geven over wat er gedaan moet worden, met behulp van het placeholder-attribuut. Bekijk het volgende voorbeeld:

HTML
<form>
  <div>
    <input
      type="search"
      id="mySearch"
      name="q"
      placeholder="Search the site…" />
    <button>Search</button>
  </div>
</form>

Hieronder zie je hoe de placeholder wordt weergegeven:

Resultaat in de browser

Labels en toegankelijkheid van zoekformulieren

Een probleem met zoekformulieren is hun toegankelijkheid; een gangbare ontwerppraktijk is om geen label voor het zoekveld op te geven (hoewel er mogelijk een vergrootglaspictogram of iets dergelijks is), omdat het doel van een zoekformulier voor ziende gebruikers meestal vrij duidelijk is vanwege de plaatsing (dit voorbeeld toont een typisch visueel patroon).

Dit kan echter verwarring veroorzaken voor gebruikers van schermlezers, aangezien zij geen mondelinge aanduiding krijgen van wat het zoekveld is. Een manier om dit te voorkomen zonder je visuele ontwerp te beïnvloeden, is het gebruik van landmark-elementen.

  • Omhul de volledige zoekfunctionaliteit in een <search>-element, dat een landmark-regio creëert die ondersteunende technologie kan aankondigen en snel naartoe kan navigeren. Als je <input> zich al in een <form> bevindt, kun je in plaats daarvan role="search" toevoegen aan het <form>-element, wat het <form> ook een search-landmark maakt. Het <search>-element gebruikt native HTML-semantiek, terwijl role="search" meer ondersteuning heeft en mogelijk korter is om te typen als je al een <form>-omhulsel hebt.
  • Als dat niet voldoende is, kun je een aria-label-attribuut op de <input> zelf gebruiken. Dit moet een beschrijvend tekstlabel zijn dat door de schermlezer wordt voorgelezen; het wordt gebruikt als een niet-visueel equivalent van <label>.

Laten we een minimaal voorbeeld bekijken:

HTML
<search>
  <form>
    <div>
      <input
        type="search"
        id="mySearch"
        name="q"
        placeholder="Search the site…"
        aria-label="Search through site content" />
      <button>Search</button>
    </div>
  </form>
</search>

Hieronder zie je hoe dit wordt weergegeven:

Resultaat in de browser

Er is geen visueel verschil met het vorige voorbeeld, maar gebruikers van schermlezers hebben veel meer informatie tot hun beschikking.

Opmerking

Zie Signposts/Landmarks voor meer informatie over dergelijke toegankelijkheidsfuncties.

Fysieke grootte van het invoerelement

De fysieke grootte van het invoervak kan worden bepaald met het size-attribuut. Hiermee kun je het aantal tekens opgeven dat het invoervak tegelijk kan weergeven. In dit voorbeeld is het zoekvak bijvoorbeeld 30 tekens breed:

HTML
<form>
  <div>
    <input
      type="search"
      id="mySearch"
      name="q"
      placeholder="Search the site…"
      size="30" />
    <button>Search</button>
  </div>
</form>

Het resultaat is dit bredere invoervak:

Resultaat in de browser

Validatie

<input>-elementen van het type search beschikken over dezelfde validatiefuncties als gewone text-invoervelden. Het is minder waarschijnlijk dat je in het algemeen validatiefuncties wilt gebruiken voor zoekvakken. In veel gevallen zouden gebruikers gewoon overal naar mogen zoeken, maar er zijn enkele gevallen om te overwegen, zoals zoekopdrachten op gegevens met een bekende opmaak.

Opmerking

HTML-formuliervalidatie is geen vervanging voor scripts die ervoor zorgen dat de ingevoerde gegevens in de juiste opmaak zijn. Het is veel te gemakkelijk voor iemand om aanpassingen aan de HTML te maken waardoor de validatie kan worden omzeild of volledig kan worden verwijderd. Het is ook mogelijk dat iemand je HTML volledig omzeilt en de gegevens rechtstreeks naar je server verzendt. Als je server-side code de ontvangen gegevens niet valideert, kan er een ramp gebeuren wanneer verkeerd opgemaakte gegevens (of gegevens die te groot zijn, van het verkeerde type zijn, enzovoort) in je database terechtkomen.

Een opmerking over styling

Er zijn nuttige pseudo-klassen beschikbaar voor het stylen van geldige/ongeldige formulierelementen: :valid en :invalid. In dit gedeelte gebruiken we de volgende CSS, die een vinkje plaatst naast invoervelden met geldige waarden, en een kruisje naast invoervelden met ongeldige waarden.

CSS
input:invalid ~ span::after {
  content: "✖";
  padding-left: 5px;
  position: absolute;
}

input:valid ~ span::after {
  content: "✓";
  padding-left: 5px;
  position: absolute;
}

Voor deze techniek is ook een <span>-element nodig dat na het formulierelement wordt geplaatst en dat als houder voor de pictogrammen dient. Dit was nodig omdat sommige invoertypen in sommige browsers pictogrammen die er direct achter zijn geplaatst niet goed weergeven.

Invoer verplicht maken

Je kunt het required-attribuut gebruiken als een eenvoudige manier om het invoeren van een waarde verplicht te stellen voordat het formulier verzonden mag worden:

HTML
<form>
  <div>
    <input
      type="search"
      id="mySearch"
      name="q"
      placeholder="Search the site…"
      required />
    <button>Search</button>
    <span class="validity"></span>
  </div>
</form>
CSS
input {
  margin-right: 10px;
}

input:invalid ~ span::after {
  content: "✖";
  padding-left: 5px;
  position: absolute;
}

input:valid ~ span::after {
  content: "✓";
  padding-left: 5px;
  position: absolute;
}

Dit wordt als volgt weergegeven:

Resultaat in de browser

Als je bovendien probeert het formulier te verzenden zonder een zoekterm in te voeren, toont de browser een bericht. Het volgende voorbeeld komt uit Firefox:

form field with attached message that says Please fill out this field

Er worden verschillende berichten weergegeven wanneer je probeert het formulier te verzenden met verschillende soorten ongeldige gegevens in de invoervelden; zie de onderstaande voorbeelden.

Lengte van de invoerwaarde

Je kunt met het minlength-attribuut een minimale lengte, in tekens, opgeven voor de ingevoerde waarde; gebruik op dezelfde manier maxlength om de maximale lengte van de ingevoerde waarde in te stellen.

Het onderstaande voorbeeld vereist dat de ingevoerde waarde 4–8 tekens lang is.

HTML
<form>
  <div>
    <label for="mySearch">Search for user</label>
    <input
      type="search"
      id="mySearch"
      name="q"
      placeholder="User IDs are 4–8 characters in length"
      required
      size="30"
      minlength="4"
      maxlength="8" />
    <button>Search</button>
    <span class="validity"></span>
  </div>
</form>
CSS
input {
  margin-right: 10px;
}

input:invalid ~ span::after {
  content: "✖";
  padding-left: 5px;
  position: absolute;
}

input:valid ~ span::after {
  content: "✓";
  padding-left: 5px;
  position: absolute;
}

Dit wordt als volgt weergegeven:

Resultaat in de browser

Als je probeert het formulier te verzenden met minder dan 4 tekens, krijg je een passend foutbericht (dat per browser verschilt). Als je meer dan 8 tekens probeert in te voeren, laat de browser dit niet toe.

Een patroon opgeven

Je kunt het pattern-attribuut gebruiken om een reguliere expressie op te geven waaraan de ingevoerde waarde moet voldoen om als geldig te worden beschouwd (zie Valideren tegen een reguliere expressie voor een korte inleiding).

Laten we een voorbeeld bekijken. Stel dat we een zoekformulier voor product-ID's willen aanbieden, en de ID's bestaan allemaal uit codes van twee letters gevolgd door vier cijfers. Het volgende voorbeeld behandelt dit:

HTML
<form>
  <div>
    <label for="mySearch">Search for product by ID:</label>
    <input
      type="search"
      id="mySearch"
      name="q"
      placeholder="two letters followed by four numbers"
      required
      size="30"
      pattern="[A-z]{2}[0-9]{4}" />
    <button>Search</button>
    <span class="validity"></span>
  </div>
</form>
CSS
input {
  margin-right: 10px;
}

input:invalid ~ span::after {
  content: "✖";
  padding-left: 5px;
  position: absolute;
}

input:valid ~ span::after {
  content: "✓";
  padding-left: 5px;
  position: absolute;
}

Dit wordt als volgt weergegeven:

Resultaat in de browser

Voorbeelden

Toegankelijk zoekformulier

Dit voorbeeld toont een typisch <nav>-menu dat een zoekformulier bevat. WAI-ARIA-functies worden gebruikt om het formulier toegankelijker te maken voor gebruikers van ondersteunende technologie (AT).

HTML

De belangrijkste nav-items bestaan uit een lijst met links. Het zoek-<form> krijgt een role="search"-attribuut, wat het <form> een search-landmark maakt en het aan AT aankondigt. We geven het <input type="search">-element ook een aria-label om het een duidelijk label te geven dat door schermlezers wordt voorgelezen.

HTML
<nav>
  <ul>
    <li><a href="#">Home</a></li>
    <li><a href="#">About</a></li>
    <li><a href="#">Contact</a></li>
  </ul>
  <form role="search">
    <input
      type="search"
      name="q"
      placeholder="Search query"
      aria-label="Search through site content" />
    <button>Search!</button>
  </form>
</nav>
CSS
html {
  font-family: sans-serif;
  font-size: 10px;
}

nav {
  display: flex;
  align-items: center;
  gap: 1em;
  padding: 10px;
}

nav ul {
  padding: 0;
  list-style-type: none;
  flex: 2;
  display: flex;
}

nav li {
  text-align: center;
  flex: 1;
}

nav a {
  font-size: 2rem;
  text-transform: uppercase;
  text-decoration: none;
  color: black;
  display: block;
  width: 100%;
  height: 100%;
  line-height: 1.2;
}

nav form {
  flex: 1;
  display: flex;
  align-items: center;
  height: 100%;
}

input {
  font-size: 1.6rem;
}

input[type="search"] {
  flex: 3;
  height: 30px;
}

button {
  flex: 1;
  height: 30px;
  padding: 0 1em;
  background: #333;
  border: 0;
  color: white;
}

We hebben de CSS en JavaScript van het voorbeeld verborgen voor de duidelijkheid, aangezien ze niet relevant zijn voor het begrijpen van de HTML. Je kunt ze bekijken door op de knop "Play" in het onderstaande live-voorbeeld te drukken.

JS
const form = document.querySelector("form");
form.addEventListener("submit", (e) => {
  e.preventDefault();
});

Resultaat

Resultaat in de browser

Technische samenvatting

Waarde Een tekenreeks die de waarde vertegenwoordigt die in het zoekveld staat.
Gebeurtenissen change en input
Ondersteunde algemene attributen autocomplete, list, maxlength, minlength, pattern, placeholder, required, size.
IDL-attributen value
DOM-interface

HTMLInputElement

Impliciete ARIA-rol zonder list-attribuut: searchbox
met list-attribuut: combobox

Zie ook

Verwante elementen