Suchfunktion für Websites

Von der Suchanfrage zum passenden Ziel

Suchfeld, Lupe, Treffer: drei Stellen, an denen eine Suche ohne Namen scheitert.

Website prüfen
Beispiel im Prüfbericht Markierter Befund
Markierter Befund · Kritisch · WCAG 4.1.2Regler ohne zugänglichen Namen

Suchweg sichtbar machen

Eine Suche braucht Treffer und Rückmeldung

Anfrage, Index und Ausgabe müssen sichtbar und programmatisch zusammenpassen.

Statische Konzeptdarstellung mit Beispieldaten

Der vollständige Weg für „öffnung“

Website durchsuchenSichtbares Label bleibt stehen.
type="search"name="q"role="search"
A
Anfrage normalisieren

Rand-Leerzeichen entfernen, Groß- und Kleinschreibung angleichen.

„öffnung“
B
Titel und Kurztext prüfen

Der Index enthält nur Inhalte, die auf der Zielseite stehen.

  • ÖffnungszeitenTreffer
  • Anfahrt und Parkenkein Treffer
  • Preise und Leistungenkein Treffer
C
Treffer als Ziel ausgeben

Der Seitentitel wird zum verständlichen Linktext.

/kontakt/oeffnungszeitenÖffnungszeiten

Montag bis Freitag 9 bis 17 Uhr.

Sichtbar1 Treffer für „öffnung“.
Programmatischrole="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

Trefferzustand1 Treffer für „öffnung“.

Linktitel, Zielpfad und kurzer Kontext beantworten die Anfrage.

LeerzustandKeine Treffer für „öffnugszeit“.

Schreibweise prüfen oder das Inhaltsverzeichnis öffnen.

/inhalte

Vier Verträge halten den Suchweg zusammen

Bereich
role="search" macht das Formular als Suche auffindbar.
Eingabe
Ein sichtbares label benennt 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);
});

So prüfen Sie es

  1. Klicken Sie auf „Website durchsuchen“. Der Cursor springt in das Suchfeld.
  2. Suchen Sie nach öffnung. Die Statuszeile nennt Zahl und Begriff.
  3. Prüfen Sie mit einem Screenreader: Die Meldung kommt ohne Fokuswechsel.
  4. Gehen Sie mit Tab weiter. Jeder Treffer hat genau einen verständlichen Link.
  5. Suchen Sie nach einem unbekannten Wort. Eine sichtbare Hilfe bleibt stehen.
  6. Prüfen Sie den Fallback ohne JavaScript, falls /suche angeboten wird.

Aus dem Prüfbericht

Drei Stellen, drei Befunde

Zum Mitnehmen

Das Suchformular, korrigiert

Zwei kleine Änderungen im HTML. Das Aussehen bleibt, wie es ist.

Korrektur in 2 Schritten ansehen
  1. 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.

  2. 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“.

Werbung

Kostenloser Website-Barrierefreiheits-Check

Website auf Barrierefreiheit prüfen.

Technische WCAG-Warnsignale erkennen. Kritische Stellen zuerst prüfen.

Der Website-Check ist bereit.

Werbung

Ein letzter Schritt

Prüfen, bevor Sie gehen.

Finden Sie automatisch erkennbare Barrieren auf Ihrer eigenen Website.

Website prüfen

Kostenlos starten · keine Installation

Automatisches Screening. Tastaturbedienung und Screenreader bleiben manuelle Prüfung.