Suchfunktion für Websites
Von der Suchanfrage zum passenden Ziel
Suchfeld, Lupe, Treffer: drei Stellen, an denen eine Suche ohne Namen scheitert.
Suchweg sichtbar machen
Eine Suche braucht Treffer und Rückmeldung
Anfrage, Index und Ausgabe müssen sichtbar und programmatisch zusammenpassen.
Der vollständige Weg für „öffnung“
type="search"name="q"role="search"Rand-Leerzeichen entfernen, Groß- und Kleinschreibung angleichen.
„öffnung“Der Index enthält nur Inhalte, die auf der Zielseite stehen.
- ÖffnungszeitenTreffer
- Anfahrt und Parkenkein Treffer
- Preise und Leistungenkein Treffer
Der Seitentitel wird zum verständlichen Linktext.
Montag bis Freitag 9 bis 17 Uhr.
role="status" kündigt denselben Satz an.Der Fokus bleibt am Auslöser; die Rückmeldung kommt zu ihm.
Ein Suchweg, zwei Ausgänge
Auch null Treffer brauchen ein nächstes Ziel
Linktitel, Zielpfad und kurzer Kontext beantworten die Anfrage.
Schreibweise prüfen oder das Inhaltsverzeichnis öffnen.
/inhalteVier Verträge halten den Suchweg zusammen
- Bereich
role="search"macht das Formular als Suche auffindbar.- Eingabe
- Ein sichtbares
labelbenennt das Suchfeld dauerhaft. - Ergebnis
- Jeder Treffer besitzt einen Link mit dem Seitentitel als Namen.
- Status
- Anzahl und Begriff werden sichtbar und ohne Fokuswechsel gemeldet.
Vollständiges HTML
Formular, Status und beide Ausgänge
Die Statuszeile existiert bereits beim Laden. Die Ergebnisregion erscheint erst nach einer Suche. action bleibt als möglicher Server-Fallback erhalten.
<form id="suche" role="search" action="/suche" method="get">
<label for="suchfeld">Website durchsuchen</label>
<input id="suchfeld" name="q" type="search"
placeholder="z. B. Öffnungszeiten" required>
<button type="submit">Suchen</button>
</form>
<p id="such-status" role="status" aria-atomic="true"></p>
<section id="such-ausgabe" aria-labelledby="treffer-titel" hidden>
<h2 id="treffer-titel">Suchergebnisse</h2>
<ul id="such-treffer"></ul>
<p id="such-leer" hidden>
Prüfen Sie die Schreibweise oder öffnen Sie das
<a href="/inhalte">Inhaltsverzeichnis</a>.
</p>
</section>Vollständiges JavaScript
Text prüfen, DOM sicher aufbauen
Der Beispielindex gehört zu einer kleinen statischen Website. Für viele Seiten, Synonyme oder Tippfehler braucht die Suche einen erzeugten Index oder eine Suchengine.
const INDEX = [
{
titel: 'Öffnungszeiten',
url: '/kontakt/oeffnungszeiten',
text: 'Montag bis Freitag 9 bis 17 Uhr.'
},
{
titel: 'Anfahrt und Parken',
url: '/kontakt/anfahrt',
text: 'Bushaltestelle Markt und Zugang ohne Stufen.'
},
{
titel: 'Preise und Leistungen',
url: '/leistungen/preise',
text: 'Leistungen mit Dauer und Preis.'
}
];
const formular = document.getElementById('suche');
const feld = document.getElementById('suchfeld');
const status = document.getElementById('such-status');
const ausgabe = document.getElementById('such-ausgabe');
const liste = document.getElementById('such-treffer');
const leer = document.getElementById('such-leer');
function normalisieren(text) {
return text.toLocaleLowerCase('de-DE').trim();
}
function suchen(begriff) {
const woerter = normalisieren(begriff).split(/\s+/);
return INDEX.filter((eintrag) => {
const inhalt = normalisieren(
eintrag.titel + ' ' + eintrag.text
);
return woerter.every((wort) => inhalt.includes(wort));
});
}
function trefferElement(eintrag) {
const punkt = document.createElement('li');
const link = document.createElement('a');
const text = document.createElement('p');
link.href = eintrag.url;
link.textContent = eintrag.titel;
text.textContent = eintrag.text;
punkt.append(link, text);
return punkt;
}
function ausgeben(treffer, begriff) {
liste.replaceChildren(...treffer.map(trefferElement));
ausgabe.hidden = false;
leer.hidden = treffer.length !== 0;
status.textContent = treffer.length === 0
? 'Keine Treffer für „' + begriff + '“.'
: treffer.length + ' Treffer für „' + begriff + '“.';
}
formular.addEventListener('submit', (event) => {
event.preventDefault();
const begriff = feld.value.trim();
if (!begriff) return;
ausgeben(suchen(begriff), begriff);
});Quellen für Struktur und Rückmeldung
So prüfen Sie es
- Klicken Sie auf „Website durchsuchen“. Der Cursor springt in das Suchfeld.
- Suchen Sie nach
öffnung. Die Statuszeile nennt Zahl und Begriff. - Prüfen Sie mit einem Screenreader: Die Meldung kommt ohne Fokuswechsel.
- Gehen Sie mit Tab weiter. Jeder Treffer hat genau einen verständlichen Link.
- Suchen Sie nach einem unbekannten Wort. Eine sichtbare Hilfe bleibt stehen.
- Prüfen Sie den Fallback ohne JavaScript, falls
/sucheangeboten wird.
Aus dem Prüfbericht
Drei Stellen, drei Befunde
Kritisch Das Suchfeld hat keinen Namen Regel label
Der graue Platzhalter im Suchfeld verschwindet beim Tippen. Ein label mit for verbindet den sichtbaren Namen mit dem Feld.
Kritisch Die Lupe hat keinen Namen Regel button-name
Das Symbol auf der Suchen-Schaltfläche enthält kein Wort. aria-label="Suchen" an der Schaltfläche, oder ein sichtbares Wort daneben.
Kritisch Treffer ohne Linktext Regel link-name
In der Trefferliste verlinken Bild oder Pfeil das Ziel ohne Text. Der Treffertitel wird zum Link, ein Link pro Treffer.
Zum Mitnehmen
Das Suchformular, korrigiert
Zwei kleine Änderungen im HTML. Das Aussehen bleibt, wie es ist.
Korrektur in 2 Schritten ansehen
Dem Suchfeld einen Namen geben
Ein label, per for mit dem Feld verbunden, wird zum Namen des Felds. Der Platzhalter bleibt als Beispiel.
KorrekturvergleichSchritt 1 · HTML Vorher
<input type="search" name="q" placeholder="Suchbegriff eingeben">Nachher
<label for="site-search">Website durchsuchen</label> <input id="site-search" type="search" name="q" placeholder="z. B. Öffnungszeiten">Markierte Zeilen wurden geändert
So prüfen Sie es Klicken Sie auf das Wort „Website durchsuchen“. Springt der Cursor ins Feld, ist der Name verbunden.
Der Lupe einen Namen geben
Das Symbol bleibt sichtbar und für Vorleseprogramme verborgen; aria-label liefert das Wort, das vorgelesen wird.
KorrekturvergleichSchritt 2 · HTML Vorher
<button type="submit"> <svg aria-hidden="true"><use href="#icon-lupe"></use></svg> </button>Nachher
<button type="submit" aria-label="Suchen"> <svg aria-hidden="true"><use href="#icon-lupe"></use></svg> </button>Markierte Zeilen wurden geändert
So prüfen Sie es Fahren Sie mit der Tab-Taste auf die Lupe. Ein Vorleseprogramm sagt jetzt „Suchen, Schaltfläche“.
