Ereignisse in JavaScript und interaktive Seiten

Lass Webseiten auf Nutzer reagieren. Lerne, Event-Listener zu registrieren, das Ereignisobjekt auszulesen und Ereignisse beim Bubbling durch die Seite zu verfolgen, sodass ein Listener viele Elemente verarbeiten kann. Verarbeite Tastendrücke, Klicks, Berührungen und Stifteingaben, implementiere eine Ziehinteraktion, lies Formulare in JavaScript aus und sende sie ab. Validiere Eingaben mit den integrierten Regeln des Browsers und eigenen Meldungen. Erstelle zum Abschluss eigene Bedienelemente, die sich sowohl mit Tastatur und Screenreader als auch mit der Maus bedienen lassen.

AnfängerEinheit 6 von 9 in Kurs: JavaScript – DOM, Ereignisse und asynchroner Code

Was du lernst

  1. Lass eine Seite reagieren, wenn etwas geschieht: Registriere Listener an Elementen, lies die Angaben des Ereignisobjekts aus und lege fest, wie lange jeder Listener aktiv bleibt.
    • Registriere einen Event-Listener an einem Element
      Nutze addEventListener, um eine Funktion jedes Mal auszuführen, wenn an einem Element ein Klick, ein Tastendruck, eine Formularaktion oder ein Seitenereignis stattfindet.
    • Lies die Informationen im Ereignisobjekt aus
      Nutze das Ereignisobjekt, das ein Listener erhält, um herauszufinden, was wo geschehen ist: den Typ, das Ziel, das aktuelle Ziel und ereignisspezifische Details.
    • Entferne Event-Listener und steuere ihre Ausführung
      Entferne Listener, die nicht mehr benötigt werden, nutze die Optionen once, signal und passive und löse eigene benutzerdefinierte Ereignisse aus.
  2. Erkläre, wie ein Ereignis auf der Seite zu seinem Ziel abwärts und wieder aufwärts gelangt, verhindere das eingebaute Browserverhalten, wenn du es ersetzt, und nutze Bubbling, um viele Elemente mit einem Listener zu verarbeiten.
    • Erkläre Bubbling und Capturing
      Beschreibe die drei Phasen der Ereignisweitergabe und bestimme die Reihenfolge, in der Listener an verschachtelten Elementen ausgeführt werden.
    • Verhindere Standardaktionen und stoppe die Ereignisweitergabe
      Verhindere die eingebaute Reaktion des Browsers auf ein Ereignis, wenn dein Code sie ersetzt, und stoppe die weitere Ereignisweitergabe nur, wenn es wirklich nötig ist.
    • Verarbeite Ereignisse vieler Elemente mit Ereignisdelegation
      Nutze einen Listener an einem gemeinsamen Vorfahrenelement und event.target.closest(), um Ereignisse vieler Kindelemente zu verarbeiten, auch solcher, die später hinzugefügt werden.
  3. Reagiere auf Tastendrücke, Fokuswechsel, Klicks, Berührungen und Stifteingaben und implementiere eine Ziehinteraktion, die mit jeder Art von Zeiger funktioniert.
    • Reagiere auf Tastendrücke und Fokuswechsel
      Nutze keydown, keyup und die Fokusereignisse, wähle zwischen event.key und event.code und erstelle Tastenkombinationen, die den Nutzer nicht behindern.
    • Verarbeite Klicks, Berührungen und Stifteingaben mit Zeigerereignissen
      Nutze click zur Aktivierung und Zeigerereignisse für Drücken, Bewegen und Loslassen mit Maus, Finger oder Stift; lies Koordinaten und Tasten aus und wähle die passenden Hover-Ereignisse.
    • Implementiere eine Ziehinteraktion mit Zeigerereignissen
      Kombiniere pointerdown, pointermove und pointerup mit Zeigererfassung, um ein Element zu bewegen, ermögliche die Bedienung auf Touchscreens und biete eine Möglichkeit, dasselbe ohne Ziehen zu erreichen.
  4. Lies Nutzereingaben während des Tippens aus, verarbeite das Absenden von Formularen in JavaScript und prüfe Eingaben mit den Validierungsfunktionen des Browsers und eigenen Regeln mit klaren Fehlermeldungen.
    • Lies Formularfelder aus und reagiere während der Eingabe
      Lies Textfelder, Zahlen, Kontrollkästchen, Optionsfelder und Auswahllisten aus, nutze die Ereignisse input und change zum richtigen Zeitpunkt und erfasse ein ganzes Formular mit FormData.
    • Verarbeite das Absenden von Formularen mit JavaScript
      Reagiere auf das submit-Ereignis des Formulars, verhindere das Neuladen der Seite, lies die abgesendeten Daten und erkenne, wodurch das Absenden ausgelöst wird.
    • Nutze die integrierte Validierung des Browsers
      Beschreibe Regeln mit HTML-Attributen, lies das Ergebnis im validity-Objekt aus, prüfe Felder per Code und gestalte ungültige Felder zum richtigen Zeitpunkt.
    • Schreibe eine benutzerdefinierte Validierung mit klaren Fehlermeldungen
      Ergänze Regeln, die HTML-Attribute nicht ausdrücken können, schreibe hilfreiche Meldungen, zeige sie zum richtigen Zeitpunkt an und verknüpfe sie mit ihren Feldern.
  5. Erstelle interaktive Elemente, die mit Maus, Tastatur und Screenreader funktionieren: Bevorzuge natives HTML, ergänze bei eigenen Elementen Rollen, Tastaturbedienung und Zustandsangaben und setze den Fokus dorthin, wo Nutzer ihn erwarten.
    • Bevorzuge native Elemente und mache eigene Bedienelemente fokussierbar
      Erkenne, was native interaktive Elemente bereits mitbringen und was ein eigenes Bedienelement aus einem <div> oder <span> ergänzen muss: eine Rolle, Fokussierbarkeit, einen zugänglichen Namen und einen sichtbaren Fokusindikator.
    • Ergänze eigene Bedienelemente um Tastaturbedienung und Zustandsangaben
      Sorge dafür, dass eigene Schaltflächen, Umschaltflächen, Aufklappbereiche, Kontrollkästchen und Gruppen von Elementen mit der Tastatur funktionieren, und halte ihren ARIA-Zustand mit der sichtbaren Darstellung im Einklang.
    • Setze den Fokus bei Seitenänderungen dorthin, wo Nutzer ihn erwarten
      Setze den Fokus gezielt, wenn Inhalte geöffnet, geschlossen oder entfernt werden oder Fehler anzeigen, und verschiebe ihn nie unerwartet, während Nutzer tippen oder auswählen.

Ereignisse in JavaScript einfach erklärt

5 Kapitel

1

Reagiere mit Event-Listenern auf Ereignisse

Webseiten reagieren durch Funktionen, die für Ereignisse registriert werden. Bei der Einrichtung werden Element und Ereignistyp gewählt; jedes spätere Auftreten liefert ein Ereignisobjekt, das beschreibt, was geschehen ist. Liest ein Listener dieses Objekt aus, kann er auf das richtige Bedienelement reagieren, selbst wenn ein Klick auf einem Symbol darin landet. Mit Listener-Referenzen und Optionen bleibt die Reaktion genau so lange aktiv, wie eine Funktion sie benötigt. Benutzerdefinierte Ereignisse ermöglichen es einem Teil der Seite, einen anderen zu benachrichtigen.

1.1 Listener setzen Aktionen in Code um

Eine Seite kann auf eine Aktion einer Person warten. Ein Ereignis meldet, dass etwas geschehen ist, und ein Event-Listener ist die Funktion, die als Reaktion aufgerufen wird. Die Registrierung eines Listeners richtet diese Reaktion ein; sie führt die Aktion nicht sofort aus.

Füge die Funktion dem Element hinzu

Wähle ein bereits existierendes Element und den exakten Namen des Ereignisses und übergib eine Funktion:

const button = document.querySelector("#like");
let likes = 0;
button.addEventListener("click", function () {
  likes = likes + 1;
  button.textContent = "Likes: " + likes;
});

Die Auswahl, die Einrichtung der Variablen und die Registrierung laufen, wenn das Skript ausgeführt wird. Jeder spätere Klick führt den Funktionsrumpf aus. Nach drei Klicks zeigt die Schaltfläche „Likes: 3“. Liegt likes außerhalb der Funktion, bleibt die Summe zwischen den Klicks erhalten; mit let likes = 0 innerhalb der Funktion würde sie jedes Mal neu beginnen.

Übergib eine Funktionsreferenz wie showMenu ohne Klammern. In button.addEventListener("click", showMenu()) ruft JavaScript showMenu sofort auf und übergibt den Rückgabewert als Listener. Um später ein Argument zu übergeben, verpacke den Aufruf: button.addEventListener("click", () => showMenu("main"));.

Wähle ein Ereignis, das tatsächlich auftritt

Namen sind Zeichenketten ohne das Präfix „on“, bei denen Groß- und Kleinschreibung beachtet werden. Nutze "click", nicht "Click" oder "onclick". Ein erfundener Name wird ohne Fehler akzeptiert, aber der Browser löst ihn bei einem Klick nicht aus. Zu den häufigen Familien gehören Zeigerereignisse wie pointerdown und pointerup, Tastaturereignisse wie keydown, Formularereignisse wie input und submit sowie Fokusereignisse wie focusin. Bei DOMContentLoaded muss ebenfalls die genaue Groß- und Kleinschreibung beachtet werden.

Richte das richtige Element zum richtigen Zeitpunkt ein

Ein Skript im Head kann ausgeführt werden, bevor eine Schaltfläche existiert. Die Auswahl gibt dann null zurück, und der Aufruf von addEventListener darauf löst einen Fehler aus. Lade ein externes Skript mit defer, setze es hinter das Markup oder registriere die Einrichtung für das Ereignis DOMContentLoaded des Dokuments. Ein später erstelltes Element benötigt nach seiner Erstellung eine Einrichtung oder einen Listener an einem Vorfahrenelement.

querySelectorAll gibt eine NodeList zurück, nicht ein einzelnes Ereignisziel. Registriere Listener an ihren Elementen:

document.querySelectorAll(".tab").forEach((tab) => {
  tab.addEventListener("click", selectTab);
});
Lass Listener nebeneinander bestehen
MethodeWirkung der Registrierung
addEventListener("click", fn)Fügt neben anderen einen Listener hinzu und akzeptiert Optionen.
button.onclick = fnErsetzt den einzelnen Eigenschafts-Handler; weise null zu, um ihn zu entfernen.
Ein HTML-Attribut onclickPlatziert JavaScript im Markup.

Listener mit derselben Capture-Einstellung laufen in der Reihenfolge ihrer Registrierung. Am Ereignisziel laufen Capture-Listener vor Listenern ohne Capture. Wird dasselbe Funktionsobjekt mit demselben Typ und derselben Capture-Einstellung erneut hinzugefügt, entsteht keine zweite Kopie.

Wichtige Erkenntnisse

  • Übergib die Funktion selbst; nutze einen Wrapper, wenn der spätere Aufruf Argumente benötigt.
  • Ereignisnamen müssen exakt geschrieben werden, auch die Groß- und Kleinschreibung muss stimmen.
  • Ein Element muss existieren, wenn sein Listener registriert wird.
  • Durchlaufe eine NodeList, um Listener an ihren Elementen zu registrieren.
  • addEventListener erlaubt mehrere Listener; eine Event-Handler-Eigenschaft enthält einen.

1.2 Lies aus, wo ein Ereignis begann

Der Browser übergibt deinem Listener ein Ereignisobjekt. Seine Eigenschaften beschreiben das Ereignis, das diesen konkreten Aufruf ausgelöst hat. Nenne den Parameter event oder e; der Parametername ist deine Wahl.

button.addEventListener("click", (event) => {
  console.log(event.type);
  console.log(event.currentTarget);
});

Dies gibt während des Listener-Aufrufs "click" und die Schaltfläche aus. Die Ausgabe des ganzen Objekts kann dir helfen, seine anderen Eigenschaften zu entdecken.

Unterscheide den Ursprung vom Listener

Stell dir eine Schaltfläche vor, die ein Bild enthält:

<button id="save" data-id="7">
  <img src="disk.svg" alt=""> Save
</button>
EigenschaftBedeutungBei einem Klick auf das Bild
event.targetWo das Ereignis begannDas Bild
event.currentTargetWo der laufende Listener registriert wurdeBei einem Listener an der Schaltfläche: die Schaltfläche

Ein Klick auf den Text „Save“ macht ebenfalls die Schaltfläche zum Ziel. Der Text ist Teil der Schaltfläche; er wird nicht zu einem eigenen Zielelement.

Dieser Unterschied ist beim Auslesen von Daten wichtig. Das Bild hat nicht das data-id der Schaltfläche, daher ist event.target.dataset.id bei einem Klick auf das Bild undefined. Ein direkt an der Schaltfläche registrierter Listener kann event.currentTarget.dataset.id lesen. Ein Listener an einem größeren Container kann die gewünschte Schaltfläche mit event.target.closest("button") finden und prüfen, ob ein Treffer vorliegt.

Lies die Details dieses Ereignisses

Jedes Ereignis hat einen type, ein target und ein currentTarget. Der boolesche Wert bubbles gibt an, ob es durch die Vorfahren aufwärts weitergegeben wird. cancelable gibt an, ob Code seine Standardaktion verhindern kann, und defaultPrevented hält fest, ob dies geschehen ist. timeStamp hält den Erstellungszeitpunkt des Ereignisses in Millisekunden relativ zum Zeitursprung der Seite fest.

Verschiedene Ereignisfamilien ergänzen nützliche Details. Ein modernes click liefert ein PointerEvent, das Mausereignis-Eigenschaften wie clientX, clientY und button erbt. Ein KeyboardEvent ergänzt key, code und Modifikatortasten-Flags. Ein input-Listener kann mit event.target.value den neuen Text des Feldes lesen.

Bei einem Galerie-Listener kann event.target.tagName "IMG" sein, wenn ein Foto angeklickt wird, oder "DIV", wenn der Zwischenraum angeklickt wird. Behandle den tatsächlich gemeldeten Fall. Geh nicht davon aus, dass jedes Ereignis innerhalb eines Containers von derselben Art von Kindelement stammt.

Nutze den Wert während der Listener läuft

In einem Listener als reguläre Funktion ist this gleich event.currentTarget. Eine Pfeilfunktion übernimmt this aus ihrem umgebenden Code; sie erhält das Element nicht als this. event.currentTarget funktioniert bei beiden Funktionsarten.

Nach der Ereignisauslösung wird currentTarget auf null zurückgesetzt. Eine Konsole kann diesen späteren Wert anzeigen, wenn du ein zuvor ausgegebenes Ereignis aufklappst. Gib event.currentTarget direkt im Listener aus, um das Element während des Aufrufs zu untersuchen.

Wichtige Erkenntnisse

  • target bezeichnet den Ursprung des Ereignisses; currentTarget bezeichnet das Element des laufenden Listeners.
  • Lies Daten von dem Element, dem sie tatsächlich gehören.
  • Ereignisfamilien ergänzen Eigenschaften wie Koordinaten, Tastenwerte und Modifikatortasten.
  • currentTarget ist während des Listeners verfügbar und wird danach zu null.

1.3 Steuere die Lebensdauer eines Listeners

Ein Listener sollte so lange aktiv bleiben, wie seine Funktion ihn benötigt. Bewahre bei einer zeitlich begrenzten Tastaturinteraktion die Funktionsreferenz auf, damit der Listener beim Schließen der Interaktion entfernt werden kann.

Entferne dieselbe Funktion
function onKey(event) {
  console.log(event.key);
}
document.addEventListener("keydown", onKey);
// When the feature closes:
document.removeEventListener("keydown", onKey);

Beim Entfernen müssen Ereignistyp, Funktionsobjekt und Capture-Einstellung übereinstimmen. Auch eine anonyme Funktion lässt sich entfernen, wenn ihre Referenz gespeichert wird, wie in const handler = () => save();. Ein neu geschriebenes () => save() im Aufruf zum Entfernen erzeugt eine andere Funktion, auch wenn der Code identisch aussieht.

Wähle die Registrierungsoptionen
OptionWirkung
once: trueEntfernt diesen Listener nach seinem ersten Aufruf.
signal: controller.signalEntfernt den Listener, wenn dieser Controller abgebrochen wird.
capture: trueReagiert auf dem Weg der Capturing-Phase.
passive: trueSichert zu, dass der Listener die Standardaktion nicht verhindert.

Ein einmalig angezeigtes Willkommensbanner kann { once: true } nutzen. Eine Funktion mit mehreren Listenern kann ihnen ein gemeinsames Signal geben:

const controller = new AbortController();
window.addEventListener("pointermove", moveCursor, {
  signal: controller.signal
});
window.addEventListener("keydown", onKey, {
  signal: controller.signal
});
// Close the feature:
controller.abort();

Der Abbruch entfernt beide Registrierungen. Ein abgebrochener Controller kann nicht zurückgesetzt werden; erstelle für eine neue Lebensdauer einen neuen Controller. Übergib beim Entfernen mit removeEventListener erneut capture: true, wenn es bei der Registrierung verwendet wurde. once, signal und passive gehören nicht zu den Kriterien für das Entfernen.

Der Aufruf von preventDefault() in einem passiven Listener wird ignoriert. Browser machen bestimmte Listener im Zusammenhang mit dem Scrollen an Zielen auf Dokumentebene häufig standardmäßig passiv, darunter Listener für wheel, touchstart und touchmove; nutze dort ausdrücklich { passive: false }, wenn das Verhindern der Standardaktion nötig ist.

Vermeide die Ansammlung von Callbacks

Wenn jeder Klick auf „Start“ einen neuen anonymen Listener am Spielfeld hinzufügt, führt nach zweimaligem Starten ein Klick auf das Spielfeld zwei Callbacks aus. Registriere den Listener am Spielfeld einmal, verwende dasselbe Funktionsobjekt erneut oder brich die vorherige Gruppe ab, bevor du sie ersetzt. Unterschiedliche once-Callbacks können sich dennoch ansammeln, bevor sie ausgelöst werden.

Das Entfernen eines Elements aus der Seite erhält seine Listener. Sie funktionieren, wenn es wieder eingefügt wird, und dispatchEvent() kann sie erreichen, während es losgelöst ist. Das Element kann von der Speicherbereinigung entfernt werden, wenn es und seine Listener nicht mehr erreichbar sind. Ein Listener an window oder document bleibt registriert, bis er ausdrücklich entfernt wird.

Sende ein benutzerdefiniertes Ereignis
const event = new CustomEvent("cart:add", {
  detail: { id: 42 },
  bubbles: true
});
item.dispatchEvent(event);

Listener lesen event.detail.id. Die Ereignisauslösung ruft die Listener sofort auf, bevor sie zurückkehrt. bubbles: true lässt auch Vorfahrenelemente das Ereignis empfangen. Ein mit dispatchEvent() gesendetes Ereignis hat für isTrusted den Wert false; vom Browser ausgelöste Ereignisse können als vertrauenswürdig gelten, selbst wenn eine API wie focus() sie verursacht hat.

Wichtige Erkenntnisse

  • Beim Entfernen müssen Typ, Funktionsidentität und Capture-Einstellung übereinstimmen.
  • once beendet eine Registrierung nach einem Aufruf; der Abbruch eines Signals beendet die zugehörigen Registrierungen.
  • Ein passiver Listener kann eine Standardaktion nicht verhindern.
  • Bei jeder Einrichtung neu hinzugefügte Callbacks können sich ansammeln.
  • Beim Entfernen eines Elements aus der Seite bleiben seine Listener erhalten.
  • Benutzerdefinierte Ereignisse tragen Daten in detail und werden synchron ausgelöst.
2

Verfolge die Weitergabe von Ereignissen durch die Seite

Verschachtelte Elemente liegen auf demselben Ereignispfad. Ein Klick kann einen Container auf dem Weg zum Ziel passieren und ihn beim Bubbling erneut durchlaufen. Dadurch reicht für eine veränderliche Liste ein Listener aus. Der Ereignispfad erklärt, warum eine Aktion an einem Kindelement auch eine Aktion am Elternelement auslöst. Unterscheide das Verhindern des Browserverhaltens von der Steuerung der Ereignisweitergabe und nutze dann den Ereignisursprung, um zu wählen, welche Aktionen ein gemeinsamer Listener verarbeiten soll.

2.1 Der Weg eines Ereignisses durch verschachtelte Elemente

Ein Klick innerhalb einer Schaltfläche kann auch von ihren Vorfahrenelementen empfangen werden. Ereignisweitergabe ist der Weg des Ereignisses durch den Dokumentbaum. Dieser Weg erklärt sowohl nützliche gemeinsame Listener als auch überraschende zusätzliche Aktionen.

Verfolge drei Phasen
  1. Capturing: Das Ereignis bewegt sich von window durch die Vorfahren abwärts zum Ziel.
  2. Ziel: Listener werden an dem Element ausgeführt, an dem das Ereignis begann.
  3. Bubbling: Ein Ereignis mit Bubbling bewegt sich durch die Vorfahren zurück aufwärts bis zu window.

Die Eigenschaft eventPhase meldet 1 für Capturing, 2 am Ziel und 3 für Bubbling. Ein ohne Optionen registrierter Listener läuft am Ziel oder auf dem Weg der Bubbling-Phase. Ein Listener mit { capture: true } läuft auf dem Weg abwärts, auch am Ziel, wenn er dort registriert ist.

Verfolge einen konkreten Klick
<div id="outer">
  <div id="inner">
    <button>Go</button>
  </div>
</div>

Angenommen, die Schaltfläche und jedes div-Element haben gewöhnliche Klick-Listener, die ihre Namen ausgeben. Ein Klick auf „Go“ gibt „button“, „inner“ und dann „outer“ aus. Ein Klick auf einen leeren Bereich von inner gibt „inner“ und dann „outer“ aus; die Schaltfläche liegt nicht auf dem Pfad dieses Ereignisses.

Füge nun outer einen Capture-Listener hinzu. Ein Klick auf die Schaltfläche gibt zuerst „outer (capture)“ und danach durch die gewöhnlichen Listener „button“, „inner“ und „outer“ aus. Der Capture-Listener erhält den Klick vor den Nachfahren. Nach outer kann das Ereignis durch body, html, document und window weiterlaufen, wenn dort Listener registriert sind.

Es ist ein Ereignis, kein neuer Klick, der an jedem Vorfahrenelement entsteht. target bleibt währenddessen die Schaltfläche. currentTarget ändert sich, während die einzelnen Listener laufen. Auch im äußeren Listener bezeichnet target weiterhin die ursprüngliche Schaltfläche.

Prüfe, welche Ereignisse die Bubbling-Phase durchlaufen
Mit BubblingOhne Bubbling
click, input, change, submitinvalid
keydown, pointerdownfocus, blur
focusin, focusoutpointerenter, pointerleave
pointerover, pointeroutmouseenter, mouseleave

Die Eigenschaft bubbles des Ereignisses zeigt, ob es eine Bubbling-Phase hat. Ereignisse ohne Bubbling können dennoch von einem Capture-Listener an einem Vorfahrenelement beobachtet werden. Um Fokuswechsel über einen gewöhnlichen Container-Listener zu verarbeiten, wähle focusin oder focusout.

Erkläre einen Fehler bei verschachtelten Aktionen

Eine Produktkarte öffnet bei einem Klick eine Detailansicht. Ihre Schaltfläche „Entfernen“ löscht das Produkt. Ein Klick auf diese Schaltfläche löscht es zuerst, erreicht dann den Listener der Karte und öffnet die Detailansicht. Der Ereignispfad erklärt, warum beide Callbacks laufen.

Die Karte kann Klicks zum Entfernen mit if (event.target.closest(".remove")) return; ignorieren. Alternativ kann die Schaltfläche die Ereignisweitergabe stoppen. Das Filtern an der Karte erhält das Ereignis für andere Vorfahrenelemente, die es möglicherweise benötigen.

Wichtige Erkenntnisse

  • Die Ereignisweitergabe durchläuft Capturing und die Zielphase und bei Ereignissen mit Bubbling anschließend die Bubbling-Phase.
  • Gewöhnliche Listener an Vorfahrenelementen empfangen Klicks auf Nachfahren auf dem Weg aufwärts.
  • target bleibt gleich, während sich currentTarget ändert.
  • Nutze ein Fokusereignis mit Bubbling oder Capture, um Fokuswechsel von einem Vorfahrenelement aus zu beobachten.

2.2 Eine Aktion verhindern oder die Weitergabe stoppen

Ein Listener kann ändern, was nach einem Ereignis geschieht oder wohin das Ereignis weitergegeben wird. Das sind getrennte Entscheidungen. Das Ereignis eines Links kann die Bubbling-Phase weiter durchlaufen, auch nachdem die Navigation verhindert wurde.

Eine Browseraktion ersetzen

Eine Standardaktion ist ein Verhalten, das der Browser bereitstellt: einem Link folgen, ein Formular absenden, ein Kontrollkästchen umschalten, Text einfügen, mit der Leertaste scrollen oder den Fokus mit Tab verschieben. Nutze preventDefault(), wenn dein Code diese Aktion ersetzt:

help.addEventListener("click", (event) => {
  event.preventDefault();
  openHelpPanel();
});

Bei einem Link zu /help öffnet dies den Bereich, ohne dorthin zu navigieren. Der Link bietet sein Ziel weiterhin an, wenn JavaScript nicht ausgeführt wird.

Nur bei abbrechbaren Ereignissen lässt sich die Standardaktion verhindern. Prüfe event.cancelable; defaultPrevented hält fest, ob die Aktion erfolgreich verhindert wurde. input tritt auf, nachdem sich der Wert geändert hat, und ist nicht abbrechbar. Ein Aufruf von preventDefault() entfernt dort den eingefügten Text nicht. Ein abbrechbares beforeinput-Ereignis ist die passende Stelle, um eine Bearbeitung abzufangen; das Verhindern eines entsprechenden keydown kann die Standardwirkung dieser Taste verhindern.

Die Ereignisweitergabe getrennt steuern
MethodeVerhindert die Browseraktion?Stoppt spätere Listener?
preventDefault()Ja, wenn das Ereignis abbrechbar und der Listener nicht passiv istNein
stopPropagation()NeinStoppt die Weitergabe an andere Elemente; Listener an diesem Element laufen weiter
stopImmediatePropagation()NeinStoppt zusätzlich die verbleibenden Listener an diesem Element

Ein Link, dessen Listener nur die Ereignisweitergabe stoppt, folgt weiterhin seiner URL. Wird nur die Navigation verhindert, kann ein Klick-Listener am Dokument das Ereignis weiterhin empfangen. Die Rückgabe von false aus einem addEventListener-Callback bewirkt keines von beidem. Eine Event-Handler-Eigenschaft oder ein Inline-Handler kann durch die Rückgabe von false seine Standardaktion verhindern, stoppt damit aber ebenfalls nicht die Ereignisweitergabe.

Gemeinsames Verhalten funktionsfähig halten

Ein Vorfahrenelement kann ein Menü schließen oder Interaktionen zählen. Das Stoppen der Ereignisweitergabe verbirgt das Ereignis vor diesem Code. Oft kann das Vorfahrenelement stattdessen target oder defaultPrevented prüfen.

Zum Beispiel schließt sich ein Menü nur, wenn ein Klick außerhalb sowohl des Menüs als auch des auslösenden Bedienelements liegt:

document.addEventListener("click", (event) => {
  if (!menu.contains(event.target) &&
      !menuButton.contains(event.target)) {
    menu.hidden = true;
  }
});

contains() schließt das Element selbst und seine Nachfahren ein. Die Prüfung des auslösenden Bedienelements ist wichtig, weil auch der Klick zum Öffnen durch Bubbling zum Dokument gelangt. Ohne diese zweite Prüfung würde das gerade geöffnete Menü sofort wieder geschlossen.

Nur eine selbst behandelte Aktion verhindern

Prüfe in einem Tastatur-Listener die Taste, bevor du ihre Standardaktion verhinderst. Das Verhindern jeder Taste blockiert die normale Texteingabe und kann verhindern, dass Tab den Fokus verschiebt. In einem passiven Listener wird das Verhindern der Standardaktion vollständig ignoriert.

Wichtige Erkenntnisse

  • preventDefault() verhindert eine dafür geeignete Standardaktion, ohne die Ereignisweitergabe zu stoppen.
  • stopPropagation() stoppt die Weitergabe, nicht die Standardaktion.
  • stopImmediatePropagation() überspringt zusätzlich die verbleibenden Listener am aktuellen Element.
  • Bei input ist es zu spät, um eine Bearbeitung zu verhindern.
  • Prüfungen auf einen Klick außerhalb müssen sowohl den aufklappenden Bereich als auch sein auslösendes Bedienelement berücksichtigen.
  • Verhindere nur die konkreten Tastaturaktionen, die dein Code selbst behandelt.

2.3 Ein Listener für eine veränderliche Liste

Bei der Ereignisdelegation wird ein Listener an einem beständigen Vorfahrenelement registriert und anhand des Ereignisursprungs eine Aktion gewählt. Das ist nützlich, wenn eine Liste viele Einträge hat oder Code nach der Einrichtung neue Einträge erstellt.

Das gewünschte Bedienelement finden

Ein Klick, der die Bubbling-Phase durchläuft, erreicht die Liste unabhängig davon, welcher ihrer Nachfahren angeklickt wurde. Beginne bei event.target, finde das nächste passende Bedienelement und schließe nicht zugehörige Klicks aus:

const list = document.querySelector("#todos");
list.addEventListener("click", (event) => {
  const button = event.target.closest(".remove");
  if (!button || !list.contains(button)) return;
  const item = button.closest("li");
  console.log("Removing item " + item.dataset.id);
  item.remove();
});

Die Liste enthält Einträge wie <li data-id="7">Buy milk <button class="remove">Remove</button></li>. Der Listener gehört zur Liste, sodass ein neuer Eintrag mit demselben Markup unmittelbar nach dem Einfügen funktioniert.

Verfolge einen Klick auf ein Symbol durch den Code. Das Ziel ist das Symbol, closest(".remove") findet seine Schaltfläche, und button.closest("li") findet den Eintrag. Dessen data-id bezeichnet den Eintrag in der Meldung. Schließlich ändert remove() die Seite.

Beide Prüfungen beibehalten
PrüfungWarum sie wichtig ist
!buttonEin Klick auf einen Zwischenraum in der Liste oder auf gewöhnlichen Eintragstext findet möglicherweise keine Schaltfläche zum Entfernen.
!list.contains(button)closest() kann über die Liste hinausgehen und ein passendes äußeres Vorfahrenelement finden.

Wer nur event.target.matches(".remove") prüft, übersieht Klicks auf Symbole, weil das Symbol selbst nicht zum Selektor passt. closest() prüft das Ziel und geht dessen Vorfahren aufwärts. In einem delegierten Listener ist currentTarget die Liste; es wird nicht zur gefundenen Schaltfläche.

Mehrere Aktionen zuordnen

Mit Datenattributen kann ein Listener an einer Werkzeugleiste zwischen bekannten Aktionen wählen:

const actions = { bold: makeBold, italic: makeItalic,
  clear: clearText };
toolbar.addEventListener("click", (event) => {
  const button = event.target.closest("button[data-action]");
  if (!button || !toolbar.contains(button)) return;
  const action = actions[button.dataset.action];
  if (typeof action === "function") action();
});

Eine Schaltfläche mit data-action="clear" wählt clearText aus. Die Funktionsprüfung behandelt eine unbekannte Aktion, ohne zu versuchen, undefined aufzurufen.

Ein geeignetes Ereignis wählen

Delegation funktioniert auch mit anderen Ereignissen mit Bubbling, nicht nur mit Klicks. Ein einzelner input-Listener am Formular kann event.target an eine Funktion zur Feldprüfung übergeben. Nutze focusin oder focusout, um Fokuswechsel zu delegieren; gewöhnliche focus- und blur-Ereignisse durchlaufen die Bubbling-Phase nicht. Nutze für Hover-Übergänge over/out-Ereignisse mit Bubbling, wenn Delegation erforderlich ist.

Ein stopPropagation() an einem Nachfahrenelement kann verhindern, dass ein Ereignis den Container erreicht. Wenn ein delegierter Listener nicht aktiv zu sein scheint, prüfe den Ereignistyp, das Ziel, ob der Selektor passt und ob etwas unterhalb des Containers die Weitergabe gestoppt hat.

Wichtige Erkenntnisse

  • Registriere den Listener an einem Vorfahrenelement, das Änderungen an seinen Kindelementen überdauert.
  • closest() findet ein Bedienelement auch dann, wenn ein darin verschachteltes Symbol angeklickt wird.
  • Schließe fehlende Treffer und Treffer außerhalb des Containers aus.
  • Die Delegation erfasst automatisch passende Kindelemente, die später hinzugefügt werden.
  • Mit Datenattributen kann ein gemeinsamer Listener bekannten Aktionen zugeordnet werden.
  • Delegation benötigt ein Ereignis, das das Vorfahrenelement erreicht.
3

Verarbeite Tastatur- und Zeigereingaben

Eine Interaktion kann über Tasten, eine Maus, einen Finger oder einen Stift erfolgen. Das gewählte Ereignis bestimmt, ob du eine Aktivierung, einen geänderten Textwert oder die Bewegung eines bestimmten Zeigers erhältst. Koordinatensysteme und gespeicherte Startpositionen machen Ziehinteraktionen berechenbar. Fokus und alternative Bedienelemente sorgen dafür, dass dieselbe Seite auch nutzbar bleibt, wenn jemand mit der Tastatur navigiert oder keine Ziehbewegung ausführen kann.

3.1 Tasten, Text und Fokus

Tastatureingaben gehen an das fokussierte Element, das als document.activeElement verfügbar ist, und durchlaufen anschließend die Bubbling-Phase. Ein Dokument-Listener kann daher Tastenereignisse aus Feldern und anderen Bedienelementen empfangen. Diese Reichweite macht Tastenkombinationen nützlich, bedeutet aber auch, dass sie beim Tippen stören können.

Die Eigenschaft nach ihrer Bedeutung wählen
EigenschaftMeldetBeispiel
keyDen erzeugten Wert unter Berücksichtigung von Layout und Modifikatortasten"a", "A", "Enter", " "
codeDie physische Tastenposition"KeyA", "Enter", "Space"

Auf einer AZERTY-Tastatur erzeugt die Position, die auf einer US-Tastatur mit Q beschriftet ist, key "a" und code "KeyQ". Nutze key für die Bedeutung, etwa Escape zum Schließen oder einen Buchstaben als Kurzbefehl. Nutze code für feste Positionen, etwa Bewegungstasten in einem Spiel. Der key der Leertaste ist ein einzelnes Leerzeichen, nicht "Space".

keydown wird beim ersten Drücken ausgelöst und kann wiederholt werden, solange die Taste gedrückt bleibt. Bei wiederholten Aufrufen gilt event.repeat === true. keyup wird beim Loslassen ausgelöst. Nutze keydown statt des veralteten Ereignisses keypress.

Einen Kurzbefehl gezielt behandeln
document.addEventListener("keydown", (event) => {
  if ((event.ctrlKey || event.metaKey) &&
      event.key.toLowerCase() === "s") {
    event.preventDefault();
    saveDraft();
  }
});

Dies behandelt Strg+S und Command+S. Die Umwandlung in Kleinbuchstaben erlaubt auch "S". Das Verhindern der Standardaktion ersetzt die Aktion „Seite speichern“ des Browsers nur bei der passenden Tastenkombination. Weitere Modifikatortasten-Flags sind shiftKey und altKey.

Überspringe bei einem seitenweiten Kurzbefehl mit einem einzelnen Buchstaben Eingabekontexte, bevor du die Aktion ausführst:

if (event.target.matches("input, textarea, select") ||
    event.target.isContentEditable) return;
if (event.repeat) return;

Die erste Prüfung schützt die Texteingabe. Die zweite sorgt dafür, dass eine Aktion pro physischem Tastendruck einmal läuft. Verhindere Tab nicht auf der ganzen Seite; damit navigieren Tastaturnutzer weiter.

Text nach seiner Änderung auslesen

Bei einer gewöhnlichen druckbaren Taste ist die Reihenfolge keydown, beforeinput, input und dann keyup. Das Lesen von value bei keydown liefert den Wert, bevor dieses Zeichen eingefügt wurde. Nutze input für eine Textvorschau oder einen Zeichenzähler. Es erfasst auch Bearbeitungen wie Einfügen und Diktieren, die keinen entsprechenden Tastendruck benötigen.

Fokuswechsel beobachten

focus und blur melden das Erhalten und Verlieren des Fokus, ohne die Bubbling-Phase zu durchlaufen. focusin und focusout durchlaufen sie, sodass ein Formular seine Felder mit einem Listener beobachten kann. relatedTarget bezeichnet das andere am Wechsel beteiligte Element oder null, wenn es keines gibt.

password.addEventListener("focus", () => {
  hint.hidden = false;
});
password.addEventListener("blur", () => {
  hint.hidden = true;
});

Der Hinweis ist verfügbar, wenn das Feld den Fokus erhält, auch über Tab. Der Aufruf von element.focus() verschiebt den Fokus per Code; die nächste Tastatureingabe geht dann an dieses Element.

Wichtige Erkenntnisse

  • Nutze key für die erzeugte Bedeutung und code für die physische Position.
  • Schütze seitenweite Buchstabenkurzbefehle vor Auslösung bei Texteingaben und vor unerwünschten Wiederholungen.
  • Nutze input, um auf bearbeiteten Text zu reagieren, auch beim Einfügen.
  • focusin und focusout durchlaufen die Bubbling-Phase; focus und blur nicht.
  • relatedTarget meldet das andere Ziel oder den anderen Ursprung des Fokuswechsels.

3.2 Aktivierung und Zeigerbewegung

Eine Person kann eine Maus, einen Finger, einen Stift oder eine Tastatur nutzen. Wähle das Ereignis passend zur benötigten Interaktion. click steht für eine Aktivierung; Zeigerereignisse beschreiben Drücken, Bewegen und Loslassen.

Aktionen über die Tastatur zugänglich halten

Eine native Schaltfläche löst click aus, wenn sie mit Enter oder der Leertaste aktiviert wird. Ein fokussierter Link tut dies bei Enter. Wird eine Aktion nur an pointerdown oder mousedown gebunden, werden diese Tastaturaktivierungen nicht erfasst. Nutze click für Aktionen wie das Öffnen eines Bereichs; nutze pointerdown, wenn eine Aktion beim Drücken beginnen muss, etwa beim Ziehen.

Ein Zeigerklick folgt auf ein Drücken und Loslassen. Geschehen diese auf unterschiedlichen Elementen, kann der Klick deren nächstes gemeinsames Vorfahrenelement zum Ziel haben. dblclick folgt auf zwei schnelle Klicks; event.detail zählt schnelle aufeinanderfolgende Klicks. auxclick behandelt Klicks mit einer anderen als der primären Taste. contextmenu kann durch einen sekundären Klick, langes Berühren oder einen Menübefehl der Tastatur ausgelöst werden.

Eine Zeigerereignisfamilie nutzen

pointerdown, pointermove, pointerup und pointercancel decken Maus, Berührung und Stift ab. pointerType bezeichnet das Gerät als "mouse", "touch" oder "pen"; pointerId unterscheidet aktive Zeiger, auch zwei Finger.

Ältere Maus- und Berührungsereignisfamilien existieren weiterhin. Browser können nach Zeigerereignissen Mausereignisse zur Kompatibilität auslösen. Die Registrierung von pointerdown und mousedown für dieselbe Aktion kann sie daher zweimal ausführen.

Koordinaten passend zur Aufgabe wählen
KoordinatenUrsprung
clientX, clientYLinke obere Ecke des sichtbaren Viewports
pageX, pageYLinke obere Ecke des Dokuments, unter Berücksichtigung des Scrollens
offsetX, offsetYInnerer Rand des Innenabstands des Zielelements

Ist das Dokument um 300 px nach unten gescrollt und liegt ein Klick 100 px unterhalb des oberen Viewportrands, ist clientY 100 und pageY 400. Verwende beim Berechnen einer Bewegung beide Positionen im selben Koordinatensystem. Wechselt das verschachtelte Ziel, kann sich auch der Ursprung der Offset-Koordinaten ändern.

button meldet, welche Taste bei einem Down- oder Up-Ereignis ihren Zustand geändert hat: 0 primär, 1 Mitte, 2 sekundär. buttons meldet die aktuell gedrückte Kombination: Die primäre Taste trägt 1 bei, die sekundäre 2 und die mittlere 4. Somit bedeutet buttons === 3, dass die primäre und die sekundäre Taste gedrückt sind; es bedeutet nicht, dass die mittlere Taste ihren Zustand geändert hat.

Hover-Verhalten für ein ganzes Bedienelement wählen

Over/out-Ereignisse durchlaufen die Bubbling-Phase und können ausgelöst werden, wenn der Zeiger die Grenze eines Kindelements überquert. Enter/leave-Ereignisse durchlaufen die Bubbling-Phase nicht und beschreiben das Betreten oder Verlassen des gesamten Elements einschließlich seiner Kindelemente. Ein Hinweisfeld kann mit pointerenter und pointerleave das Flackern an den Grenzen von Kindelementen vermeiden.

Nutzer von Touchscreens und Tastaturen führen keinen Hover aus. Biete wesentliche Informationen auch bei Klick oder Fokus an. Für einen visuellen Hover-Effekt ohne zusätzliches Verhalten ist CSS :hover einfacher als ein Listener.

Wichtige Erkenntnisse

  • Nutze click zur Aktivierung, auch bei nativer Tastaturaktivierung.
  • Zeigerereignisse decken Maus, Berührung und Stift mit einer Ereignisfamilie ab.
  • Wähle für Berechnungen Koordinaten aus demselben Koordinatensystem.
  • button bezeichnet eine Änderung; buttons meldet die gedrückte Kombination.
  • Enter/leave behandeln ein Element und seine Kindelemente als Ganzes.
  • Wesentliche Informationen müssen auch ohne Hover zugänglich sein.

3.3 Eine Ziehinteraktion, die dem Zeiger folgt

Eine Ziehinteraktion muss Informationen über mehrere Ereignisse hinweg speichern. Speichere die Startkoordinaten des Zeigers und die Startposition des Elements. Jede Bewegung wendet dann die Differenz zu diesem Startpunkt an, sodass das Element nicht springt, um seine Ecke unter den Zeiger zu setzen.

Die Verschiebung berechnen

Eine Box beginnt bei left: 100px; top: 50px. Der Zeiger beginnt bei den Viewport-Koordinaten 220, 140 und bewegt sich zu 260, 125. Die horizontale Änderung beträgt 40 px; die vertikale Änderung beträgt −15 px. Addierst du diese Änderungen zur Startposition der Box, erhältst du left: 140px; top: 35px.

Nutze für beide Zeigerpositionen einheitlich Client-Koordinaten. Allgemein berechnest du die Startposition des Elements plus die Verschiebung des Zeigers. Addiere nicht jede vollständige Verschiebung zur bereits aktualisierten Position der Box, denn dadurch würdest du frühere Bewegungen erneut zählen.

Einen Zeiger speichern und erfassen

Für eine absolut positionierte Box ohne Außenabstand innerhalb eines relativ positionierten Containers:

let start = null;
box.addEventListener("pointerdown", (event) => {
  if (start || event.button !== 0) return;
  start = { id: event.pointerId, x: event.clientX,
    y: event.clientY, left: box.offsetLeft,
    top: box.offsetTop };
  box.setPointerCapture(event.pointerId);
});
box.addEventListener("pointermove", (event) => {
  if (!start || event.pointerId !== start.id) return;
  box.style.left = start.left +
    (event.clientX - start.x) + "px";
  box.style.top = start.top +
    (event.clientY - start.y) + "px";
});
function endDrag(event) {
  if (start && event.pointerId === start.id) start = null;
}
box.addEventListener("pointerup", endDrag);
box.addEventListener("pointercancel", endDrag);

Die gespeicherte ID weist Bewegungen und das Loslassen eines zweiten Zeigers zurück. offsetLeft und offsetTop liefern Startpositionen als Zahlen; Stile benötigen den Zusatz "px".

Die Zeigererfassung sorgt dafür, dass nachfolgende Ereignisse dieses Zeigers weiterhin an die Box gerichtet werden, selbst wenn er sich außerhalb der Box bewegt. Der Browser beendet die Erfassung nach dem Loslassen oder Abbrechen des Zeigers. releasePointerCapture(id) kann sie früher beenden.

Die Übernahme durch den Browser behandeln

Eine Berührungsgeste kann zum Scrollen oder Zoomen der Seite werden und dadurch pointercancel auslösen. Beende die Ziehinteraktion dort ebenso wie bei pointerup; andernfalls kann ein veralteter Zustand die Box später weiterbewegen. Setze touch-action: none vor der Interaktion auf die Ziehfläche, um die Geste dafür zu reservieren. Beschränke die Regel auf diese Fläche, damit der Rest der Seite scrollen kann.

Nutze user-select: none auf der Ziehfläche, um das Markieren von Text zu vermeiden. Setze draggable="false" auf ihre Bilder, um das native Ziehen von Bildern zu verhindern.

Eine andere Möglichkeit zum Bewegen anbieten

Biete für ein fokussiertes Bedienelement das Bewegen per Tastatur sowie anklickbare oder antippbare Schaltflächen zum Bewegen an. Pfeiltasten allein bieten keine Einzelzeiger-Alternative zum Ziehen. Das WCAG-2.2-Erfolgskriterium 2.5.7 verlangt eine solche Alternative, außer wenn das Ziehen wesentlich oder unverändertes Browserverhalten ist. Native Schaltflächen zum Bewegen können sowohl Tastatur- als auch Zeigernutzern dienen.

Die separate HTML Drag and Drop API nutzt dragstart, dragover und drop, um Daten wie Dateien zu übertragen. Ihre Ereignisfolge unterscheidet sich von dieser zeigerbasierten Positionsänderung.

Wichtige Erkenntnisse

  • Berechne jede Position aus dem gespeicherten Startwert plus der Verschiebung des Zeigers.
  • Erfasse und verfolge die ID des aktiven Zeigers.
  • Beende die Ziehinteraktion sowohl bei pointerup als auch bei pointercancel.
  • Wende Regeln für Berührung und Textauswahl auf die Ziehfläche an.
  • Biete Tastaturbedienung und eine anklickbare oder antippbare Alternative an.
4

Verarbeite Formulare und validiere Eingaben vor dem Absenden

Formulare vereinen verschiedene Arten von Zuständen: Text, Zahlenwerte, angekreuzte Optionen und mehrfach vorkommende Namen. Lies diese Werte beim richtigen Ereignis und verarbeite anschließend das Absenden des Formulars als eine Aktion. HTML-Validierungsregeln decken häufige Anforderungen ab, während JavaScript Beziehungen zwischen Feldern und klarere Rückmeldungen ergänzt. Ein nützliches Formular erhält die Eingaben des Nutzers, erklärt jede Korrektur und setzt den Fokus dorthin, wo die nächste Bearbeitung erfolgen soll.

4.1 Lies Werte aus, wenn sie sich ändern

Formularfelder stellen unterschiedliche Arten von Zuständen bereit. Der value eines Textfeldes ist eine Zeichenkette; checked eines Kontrollkästchens ist ein boolescher Wert. Das Lesen der richtigen Eigenschaft ist der erste Schritt zu zuverlässigen Berechnungen und Vorschauen.

Zahlen gezielt umwandeln

Selbst <input type="number"> hat einen value als Zeichenkette. Bei dem Text "3" ergibt das Addieren von 1 "31". Number(input.value) + 1 ergibt 4. Ein Zahlenfeld stellt außerdem valueAsNumber bereit.

Eine leere Eingabe erfordert eine eigene Entscheidung. Number("") ergibt 0, wodurch eine fehlende Mengenangabe wie eine tatsächliche Null aussehen kann. Prüfe zuerst input.value === "" oder nutze valueAsNumber, das bei einem leeren Zahlenfeld NaN ergibt. Prüfe dieses Ergebnis mit Number.isNaN().

Den ausgewählten Zustand auslesen
BedienelementAuszulesende Eigenschaft
Textfeld, Textbereich, Auswahllistevalue
Zahlenfeld für BerechnungenvalueAsNumber oder einen nicht leeren value umwandeln
Kontrollkästchenchecked für den Ein-/Aus-Zustand
Optionsfeldgruppe namens sizeform.elements.size.value für den ausgewählten Wert

Der value eines Kontrollkästchens ist sein festgelegter Text für die Übermittlung oder "on", wenn keiner angegeben ist. Er zeigt nicht an, ob es angekreuzt ist. Eine Auswahlliste meldet den Wert der gewählten Option. Um das ausgewählte Optionsfeld selbst zu finden, suche nach input[name="size"]:checked.

Das Ereignis passend zur Aktualisierung wählen

input meldet Änderungen durch den Nutzer unmittelbar, einschließlich Tippen und Einfügen. change meldet eine übernommene Auswahl: nachdem ein geändertes Textfeld den Fokus verliert oder sofort, wenn ein Kontrollkästchen, Optionsfeld oder eine Auswahlliste geändert wird.

message.addEventListener("input", () => {
  counter.textContent = 280 - message.value.length +
    " characters left";
});

Nach „Hello“ wurden fünf Zeichen verbraucht und der Zähler zeigt „275 characters left“. Ein keydown-Listener würde laufen, bevor das neue Zeichen in den Wert gelangt, und das Einfügen über ein Menü nicht erfassen. Eine Zuweisung an message.value per Code löst weder input noch change aus; rufe die Aktualisierungsfunktion zusätzlich direkt auf.

Die benannten Felder eines Formulars erfassen

form.elements.email.value greift über Name oder ID auf ein Bedienelement zu. Nutze form.elements["first-name"] für einen Namen mit Bindestrich. Beim Absenden werden Namen verwendet: Eine ID allein nimmt ein Feld nicht in die Daten auf.

const data = new FormData(form);
const email = data.get("email");
const topics = data.getAll("topics");

FormData erfasst die aktuellen geeigneten Name-Wert-Paare. Nicht angekreuzte Kontrollkästchen, deaktivierte Bedienelemente und Felder ohne Namen werden ausgelassen. get() gibt den ersten Wert für einen Namen zurück; getAll() erhält wiederholte Werte, etwa mehrere angekreuzte Themen. Dateifelder können Dateiobjekte liefern; gewöhnliche Textfelder liefern Zeichenketten.

Object.fromEntries(data) ist bei unterschiedlichen Namen praktisch, behält bei wiederholten Namen aber nur das letzte Paar. Wähle getAll(), wenn jede Auswahl wichtig ist. Da input die Bubbling-Phase durchläuft, kann ein Formular-Listener event.target lesen, um das jeweils geänderte Feld zu aktualisieren.

Wichtige Erkenntnisse

  • Wandle die Zeichenkette eines Feldes vor Berechnungen um und behandle ein leeres Zahlenfeld gesondert.
  • Lies den Zustand eines Kontrollkästchens aus checked.
  • Nutze input für unmittelbare Bearbeitungen und change für übernommene Auswahlen.
  • FormData enthält geeignete benannte Bedienelemente, nicht jedes Bedienelement.
  • getAll() erhält Werte bei wiederholten Namen; die Umwandlung in ein Objekt tut das nicht.
  • Eine Wertzuweisung per Code löst keine Bearbeitungsereignisse aus.

4.2 Verarbeite das Absenden des Formulars

Das Absenden gehört zum Formular. Reagiere auf sein submit-Ereignis, um einen Klick auf eine Absende-Schaltfläche, Enter in einem einzeiligen Feld und ein per Skript aufgerufenes requestSubmit() auf einem Weg zu verarbeiten.

Navigation durch eine Seitenaktualisierung ersetzen

Normalerweise sendet ein Formular Daten an seine action-URL und lädt die Antwort. Ohne eine angegebene Aktion ist die aktuelle Seite das Ziel. Die Standardmethode GET fügt die Daten in die URL ein. Um die aktuelle Seite mit JavaScript zu aktualisieren, verhindere diese Standardaktion:

const form = document.querySelector("#new-todo");
form.addEventListener("submit", (event) => {
  event.preventDefault();
  const data = new FormData(form);
  const title = data.get("title").trim();
  if (title === "") return;
  addTodo(title);
  form.reset();
});

Dieses Formular hat ein aktiviertes Textfeld namens title. Der Listener entfernt umgebende Leerzeichen, ignoriert ein leeres Ergebnis, fügt einen Eintrag hinzu und setzt die Felder auf ihre Anfangswerte zurück. reset() bedeutet nicht immer, dass ein Feld leer wird; ein Bedienelement mit einem Anfangswert kehrt zu diesem Wert zurück.

Wenn der Eintrag kurz erscheint und beim Neuladen der Seite verschwindet, prüfe, ob preventDefault() fehlt. Ein Klick-Listener allein an der Schaltfläche ist nicht die richtige Stelle für die Formularverarbeitung, insbesondere wenn das Formular auf einem anderen Weg abgesendet wird.

Erkennen, was das Absenden auslöst

Implizites Absenden durch Enter kann auf die aktivierte standardmäßige Absende-Schaltfläche klicken. Enter in einem Textbereich fügt einen Zeilenumbruch ein. Eine Schaltfläche innerhalb eines Formulars ist standardmäßig eine Absende-Schaltfläche, wenn ihr Typ weggelassen wird. Eine Schaltfläche „Passwort anzeigen“ sollte daher ausdrücklich type="button" verwenden.

Bei mehreren Absende-Schaltflächen bezeichnet event.submitter die verwendete Schaltfläche. Bei Wegen ohne bestimmte Schaltfläche kann der Wert null sein, daher sollte der Code ihn vor dem Lesen prüfen:

const button = event.submitter;
const intent = button ? button.value : "save";
const data = button ? new FormData(form, button) :
  new FormData(form);

Eine benannte Absende-Schaltfläche wie name="intent" value="publish" steuert dieses Paar bei, wenn sie an FormData übergeben wird. Ein Aufruf von FormData(form) allein enthält das Name-Wert-Paar einer Absende-Schaltfläche nicht.

Den Validierungsweg beibehalten
AbsendewegAutomatische Validierungsubmit-Listener
Aktivierung einer Absende-Schaltfläche oder requestSubmit()Läuft, sofern sie nicht durch Validierungsattribute übersprungen wirdLäuft, wenn die Validierung es erlaubt
form.submit()Wird übersprungenWird übersprungen

Die integrierte Validierung läuft vor dem submit-Ereignis. Ist ein Pflichtfeld leer und fällt deshalb durch die Prüfung, meldet der Browser das Problem und löst submit nicht aus. Eine benutzerdefinierte Prüfung nur innerhalb dieses Listeners läuft bei diesem fehlgeschlagenen Versuch nicht. novalidate am Formular schaltet den automatischen Validierungsschritt ab.

Nutze requestSubmit(), wenn Code den normalen Weg über Validierung und submit-Ereignis benötigt. Es fordert das Absenden an, ohne einen Schaltflächenklick auszulösen. Übergib eine bestimmte Absende-Schaltfläche an requestSubmit(button), wenn deren Absendeeinstellungen gelten sollen.

Wichtige Erkenntnisse

  • Verarbeite submit am Formular und decke damit das Absenden durch Nutzer und per Skript ab.
  • Verhindere das standardmäßige Absenden, wenn JavaScript die Navigation ersetzt.
  • Gib Formularschaltflächen, die nicht absenden, type="button".
  • Nutze submitter, um Absende-Schaltflächen zu unterscheiden, und nimm bei Bedarf ihre Daten auf.
  • Die Validierung erfolgt vor submit; requestSubmit() erhält diesen Weg.
  • submit() umgeht die Validierung und das submit-Ereignis.
  • reset() stellt die Anfangswerte wieder her.

4.3 Lass HTML Validierungsregeln beschreiben

HTML kann viele Eingaberegeln ohne eine benutzerdefinierte JavaScript-Prüfung beschreiben. Der Browser prüft diese Regeln beim Absenden und stellt die Ergebnisse für deinen Code bereit. Beginne mit den Regeln, die zu den benötigten Daten passen.

Eine Validierungsregel wählen
AttributRegel
requiredEin Wert oder eine erforderliche Auswahl muss angegeben werden.
type="email" oder "url"Der Wert muss die erwartete Syntax haben.
min, max, stepZahlen- oder Datumswerte müssen zu den Schranken und Schritten passen.
minlength, maxlengthVom Nutzer eingegebener Text muss eine Längenregel erfüllen.
patternEin nicht leerer Textwert muss vollständig zu einem Ausdruck passen.

Bei pattern="[0-9]{5}" besteht „12345“; „1234“, „123456“ und „12345a“ fallen durch. Das Muster umfasst den ganzen Wert, nicht irgendeine passende Teilzeichenkette. Eine leere Eingabe überspringt die Musterprüfung, ergänze daher required, wenn das Auslassen nicht erlaubt ist.

Die E-Mail-Validierung prüft die Syntax, nicht ob ein Postfach existiert. Sowohl „ann@example.com“ als auch „ann@example“ bestehen die E-Mail-Regel des Browsers, während „ann.example.com“ sie nicht besteht. Ein zusätzliches Muster kann ein genaueres Format verlangen, wenn die Anwendung es benötigt.

Den Grund für das Fehlschlagen auslesen

Das validity-Objekt eines Feldes enthält boolesche Flags. valueMissing, typeMismatch, patternMismatch, tooShort und tooLong beschreiben fehlenden oder fehlerhaft geformten Text. rangeUnderflow, rangeOverflow und stepMismatch beschreiben numerische Einschränkungen. badInput deckt Eingaben ab, die der Browser nicht in einen brauchbaren Wert umwandeln kann, und customError hält eine benutzerdefinierte Validierungsmeldung fest. valid ist wahr, wenn keine Regel verletzt wird.

Bei einem Zahlenfeld mit min="0" max="10" step="2" liegt 12 über dem Maximum, 7 passt nicht zur erlaubten Schrittweite und 6 besteht die Prüfung. Mehr als ein Flag kann wahr sein; geh nicht davon aus, dass jedes ungültige Feld genau ein Problem hat.

Ohne Anzeige prüfen oder sichtbar melden

checkValidity() gibt einen booleschen Wert zurück und löst an ungültigen Bedienelementen invalid aus, ohne die Browsermeldung anzuzeigen. reportValidity() prüft ebenfalls und meldet das Problem zusätzlich dem Nutzer. Rufe eine der Methoden an einem Feld oder Formular auf. validationMessage liefert die Meldung in der Sprache des Browsers. Das Ereignis invalid durchläuft die Bubbling-Phase nicht.

Textlängenregeln gelten für vom Nutzer eingegebenen Text. Die Zuweisung input.value = "ab" im Code setzt tooShort nicht allein deshalb auf wahr, weil minlength 3 ist. maxlength verhindert normalerweise außerdem, dass der Nutzer über die festgelegte Länge hinaus weitere Zeichen eingibt.

Fehler zu einem hilfreichen Zeitpunkt anzeigen

:invalid gilt sofort, sodass ein unberührtes Pflichtfeld bereits dazu passt. :user-invalid wartet auf eine Nutzerinteraktion oder einen Absendeversuch und kann ein frühzeitig rot markiertes Feld vermeiden. Erkläre den Fehler neben der visuellen Gestaltung auch mit Text.

novalidate überspringt die automatische Validierung des Formulars beim Absenden; formnovalidate überspringt sie für eine Absende-Schaltfläche. Die Attribute entfernen weder Regeln noch deaktivieren sie checkValidity(). Browserprüfungen helfen Nutzern, Fehler zu korrigieren; der Server muss empfangene Daten erneut validieren, weil eine Anfrage die Seite umgehen kann.

Wichtige Erkenntnisse

  • Nutze HTML-Validierungsregeln für Pflichtwerte, Syntax, Bereiche, Schritte, Länge und Muster.
  • Ein Muster muss zum gesamten nicht leeren Wert passen; nutze required, um leere Eingaben abzulehnen.
  • Lies validity-Flags aus, um den Grund für eine fehlgeschlagene Feldprüfung zu erkennen.
  • checkValidity() prüft; reportValidity() zeigt zusätzlich eine Rückmeldung an.
  • Attribute zum Überspringen der Validierung lassen die Validierungs-API nutzbar.
  • Validiere empfangene Daten auch auf dem Server.

4.4 Benutzerdefinierte Regeln und nützliche Fehlermeldungen

Eine Regel, die zwei Felder betrifft, benötigt Code. Zum Beispiel muss eine Bestätigung mit einem Passwort übereinstimmen oder ein Enddatum nach einem Startdatum liegen. Trenne die Regel davon, wie und wann ihr Fehler angezeigt wird.

Einen benutzerdefinierten Fehler setzen und löschen

Eine nicht leere Zeichenkette, die an setCustomValidity() übergeben wird, markiert das Feld als ungültig und setzt customError. Die Übergabe von "" löscht diesen benutzerdefinierten Fehler; required, pattern oder andere Regeln können weiterhin verletzt sein.

function checkMatch() {
  const matches = confirm.value === password.value;
  confirm.setCustomValidity(matches ? "" :
    "The passwords do not match.");
}
password.addEventListener("input", checkMatch);
confirm.addEventListener("input", checkMatch);

Prüfe beide Abhängigkeiten erneut. Eine Änderung des ersten Passworts kann dazu führen, dass eine zuvor korrekte Bestätigung nicht mehr übereinstimmt. Eine Meldung, die nie gelöscht wird, hält das Feld ungültig, nachdem die Person die Abweichung korrigiert hat. Führe auch die anfängliche Prüfung aus, wenn Felder bereits mit Werten beginnen können.

Datumsfelder liefern ISO-Zeichenketten wie "2026-03-10", unabhängig vom angezeigten lokalen Datumsformat. Nicht leere Werte aus diesen Bedienelementen lassen sich als Text vergleichen. Wenn die Regel verlangt, dass das Ende nach dem Anfang liegt, lehne end.value <= start.value ab, einschließlich der Gleichheit. Behandle fehlende Datumsangaben mit required oder einer gesonderten Prüfung auf leere Werte.

Die nächste hilfreiche Handlung erklären

Eine Meldung sollte das Problem und seine Korrektur benennen. Sage bei einer fehlenden E-Mail-Adresse „Gib deine E-Mail-Adresse ein.“ Sage bei fehlerhaftem E-Mail-Text „Gib eine E-Mail-Adresse in der Form name@example.com ein.“ Erhalte den eingegebenen Wert, damit die Person ihn bearbeiten kann.

Ein Pflichtfeld für den Namen akzeptiert Leerzeichen, weil sie eine nicht leere Zeichenkette bilden. Prüfe name.value.trim() === "", wenn umgebende Leerraumzeichen nicht zählen sollen. Lösche diesen benutzerdefinierten Fehler, sobald aussagekräftiger Text vorliegt.

Meldungen mit Bedienelementen verknüpfen
<label for="email">Email</label>
<input id="email" name="email" type="email"
  required aria-describedby="email-error">
<p id="email-error"></p>

Platziere den Fehler in diesem Absatz und setze aria-invalid="true", solange das Feld einen Fehler hat. Lösche den Text und entferne aria-invalid oder setze es nach der Korrektur auf "false". aria-describedby verknüpft die Erklärung für assistive Technologien mit dem Feld. Nutze Text; ein roter Rahmen allein kann nicht allen vermitteln, was fehlgeschlagen ist.

Den Validierungsablauf wählen

Ergänze für vollständig benutzerdefinierte Meldungen novalidate und nutze einen submit-Listener am Formular. Aktualisiere benutzerdefinierte Regeln, prüfe die Gültigkeit der Felder, schreibe ihre Meldungen und verhindere das Absenden, wenn eine Prüfung fehlschlägt. Setze den Fokus auf das erste ungültige Feld oder eine verlinkte Fehlerübersicht. Wenn JavaScript auch das erfolgreiche Absenden lokal verarbeitet, verhindere auch diese Standardaktion des Absendens.

Vermeide es, unvollständigen E-Mail-Text bei jedem anfänglichen Tastendruck als Fehler zu melden. Eine nützliche Abfolge ist, Fehler nach dem Fokusverlust oder dem Absenden anzuzeigen und einen bereits gemeldeten Fehler dann bei input erneut zu prüfen.

Wichtige Erkenntnisse

  • Nicht leere benutzerdefinierte Meldungen machen ein Feld ungültig; "" löscht nur diesen benutzerdefinierten Fehler.
  • Prüfe jedes Feld erneut, von dem eine feldübergreifende Regel abhängt.
  • Lehne bei einer strikten Datumsreihenfolge sowohl Gleichheit als auch ein früheres Ende ab.
  • Erkläre eine Korrektur in Textform und verknüpfe sie mit dem Feld.
  • Entferne nach der Korrektur sichtbare Fehler und den ARIA-Fehlerzustand.
  • Eine benutzerdefinierte Rückmeldung beim Absenden benötigt einen ausdrücklichen Ablauf für Gültigkeitsprüfung und Fokus.
5

Erstelle eigene Bedienelemente, die alle nutzen können

Die Wahl eines nativen Elements liefert einen großen Teil des Verhaltens eines Bedienelements, bevor ein Listener geschrieben wird. Eigene Bedienelemente brauchen dieselbe Sorgfalt: einen klaren Namen, Tastaturzugang, sichtbaren Fokus und einen Zustand, der mit der Ausgabe assistiver Technologien übereinstimmt. Gruppen benötigen eine vorhersehbare Bewegung zwischen ihren Elementen. Wenn Inhalte geöffnet, geschlossen oder entfernt werden, kann der Nutzer dank eines bewusst gewählten Fokusziels die Interaktion fortsetzen, ohne die Seite erneut durchsuchen zu müssen.

5.1 Beginne mit einem nativen Bedienelement

Ein Bedienelement braucht mehr als eine Reaktion auf Klicks. Menschen müssen es finden, erreichen, seinen Zweck verstehen, es bedienen und sehen können, wo der Fokus liegt. Natives HTML stellt einen großen Teil dieses Verhaltens bereits bereit.

Das passende Element für die Aufgabe wählen

Nutze einen <button> für eine Aktion, ein <a href> für die Navigation und ein beschriftetes Formularfeld für Eingaben. <details> mit <summary> stellt einen Aufklappbereich bereit. Gestalte diese Elemente mit CSS passend zur Seite. Eine fokussierte Schaltfläche wird ohne zusätzlichen Tastatur-Listener durch Enter oder die Leertaste aktiviert.

Ein div-Element mit Klick-Listener hat weder die eingebaute Semantik noch das Tastaturverhalten einer Schaltfläche. role="button" ändert, was assistive Technologien ausgeben, macht es aber weder fokussierbar noch wandelt es Tastendrücke in Klicks um.

AnforderungNative SchaltflächeEigenes div-Element als Schaltfläche
RolleEingebautrole="button" ergänzen.
TastaturfokusEingebauttabindex="0" ergänzen.
Enter und LeertasteEingebautTastaturbedienung ergänzen.
Zugänglicher NameMeist ihr TextAussagekräftigen Text oder einen ARIA-Namen bereitstellen.
Verhalten bei Deaktivierungdisabledaria-disabled im Code prüfen.
Die Fokusreihenfolge vorhersehbar halten

tabindex="0" nimmt ein Element in der normalen Dokumentreihenfolge in die Tab-Reihenfolge auf. tabindex="-1" erlaubt das Fokussieren per Code, ohne einen Tab-Stopp hinzuzufügen. Positive Werte setzen Elemente vor die übliche Reihenfolge und sind schwer zu pflegen; vermeide sie.

Keine der beiden Einstellungen ergänzt ein Aktivierungsverhalten. Eine fokussierbare eigene Schaltfläche benötigt weiterhin einen Listener für die Tastaturbedienung. Eine Rolle, ein Tab-Stopp und ein Callback lösen unterschiedliche Teile der Interaktion.

Jedem Bedienelement einen Namen geben

Ein Screenreader nutzt einen zugänglichen Namen, um Bedienelemente zu unterscheiden. Eine Textschaltfläche kann ihren sichtbaren Text nutzen. Ein Textfeld oder eine Auswahlliste benötigt eine zugeordnete Beschriftung, etwa <label for="email">Email</label> zusammen mit id="email". aria-labelledby kann auf sichtbaren Text an anderer Stelle verweisen; aria-label kann einen Namen bereitstellen, wenn es keinen geeigneten sichtbaren Text gibt.

Eine Schließen-Schaltfläche, die nur ein Symbol enthält, kann so aussehen: <button type="button" aria-label="Close">×</button>. Der Name beschreibt die Aktion, statt den Nutzer die Bedeutung des Symbols erschließen zu lassen.

Den Zustand anzeigen und durchsetzen

Halte einen Fokusindikator sichtbar. Wenn du die Standardumrandung ersetzt, biete mit :focus-visible einen klaren Ersatz an, zum Beispiel outline: 3px solid #1a73e8. Entfernst du sie ohne Ersatz, bleibt die Position des Tastaturnutzers verborgen.

Eine native deaktivierte Schaltfläche verlässt die Tab-Reihenfolge und kann nicht normal aktiviert werden. aria-disabled="true" teilt nur die Nichtverfügbarkeit mit. Die Klick- und Tastaturaktion eines eigenen Bedienelements muss diesen Zustand prüfen und zurückkehren, ohne etwas auszuführen. Eine zentrale Prüfung in der Aktivierungsfunktion hält beide Eingabewege konsistent.

Wichtige Erkenntnisse

  • Nutze ein natives Element, das zur Aktion oder Eingabe passt.
  • Eine ARIA-Rolle liefert Semantik, kein Verhalten.
  • Nutze tabindex="0" für normalen Zugang über Tab und -1 für Fokus nur per Code.
  • Stelle einen zugänglichen Namen und einen sichtbaren Fokusindikator bereit.
  • Setze aria-disabled im Aktivierungscode durch.

5.2 Tastaturverhalten und Zustand zusammenhalten

Ein eigenes Bedienelement sollte unabhängig von der Art seiner Aktivierung dasselbe Ergebnis liefern. Halte die Aktion in einer Funktion, leite Tastatur- und Zeigerbedienung an sie weiter und aktualisiere den Zustand, den sowohl die Gestaltung als auch assistive Technologien auslesen.

Einer eigenen Schaltfläche Tastaturaktivierung geben
fakeButton.addEventListener("click", activate);
fakeButton.addEventListener("keydown", (event) => {
  if (event.key === "Enter" || event.key === " ") {
    event.preventDefault();
    activate();
  }
});

Dies gilt für eine eigene fokussierbare Schaltfläche. Das Verhindern der Standardaktion der Leertaste verhindert, dass die Seite während der Aktion scrollt. Eine native Schaltfläche erzeugt bei Tastaturaktivierung bereits Klicks. Ein zweiter Weg über die Tastatur kann die Aktion dort daher zweimal ausführen.

Den zum Bedienelement passenden Zustand wählen
BedienelementZustand
Umschaltfläche mit gleichbleibender Beschriftungaria-pressed="true" oder "false"
Schaltfläche zum Öffnen eines Aufklappbereichsaria-expanded="true" oder "false"
Eigenes Kontrollkästchen oder eigener Schalteraria-checked="true" oder "false"

Eine Umschaltfläche „Stummschalten“ behält diese Beschriftung und ändert aria-pressed. Ändert die Gestaltung die Aktionsbeschriftung zu „Stummschaltung aufheben“, lass aria-pressed weg. Ein Kontrollkästchen nutzt role="checkbox" und die Leertaste zum Umschalten; ein Schalter nutzt role="switch" für den Ein-/Aus-Zustand.

Attribute enthalten Zeichenketten. Vergleiche getAttribute("aria-expanded") mit "true", nicht mit dem booleschen Wert true:

detailsButton.addEventListener("click", () => {
  const open = detailsButton.getAttribute(
    "aria-expanded") === "true";
  detailsButton.setAttribute("aria-expanded", String(!open));
  panel.hidden = open;
});

War open wahr, ist der neue Zustand falsch und der Bereich wird ausgeblendet. aria-controls kann den Bereich über seine ID bezeichnen. Die nativen Elemente <details> und <summary> bieten das Verhalten eines Aufklappbereichs ohne dieses Skript.

Nutze das Zustandsattribut als Quelle für die Gestaltung, etwa [aria-pressed="true"], damit sich der sichtbare und der ausgegebene Zustand gemeinsam ändern. Schließe aufklappende Bereiche mit Escape und gib den Fokus an ihr auslösendes Bedienelement zurück.

Einer Gruppe einen Tab-Stopp geben

Registerkarten, Werkzeugleisten und Optionsfeldgruppen nutzen Tab, um in die Gruppe hinein oder aus ihr heraus zu gelangen, und Pfeiltasten, um sich darin zu bewegen. Roving tabindex hält das aktuelle Element bei 0 und die anderen Elemente bei -1. Setze bei einer Bewegung das alte Element auf -1, das neue auf 0 und fokussiere das neue Element.

Bei drei Elementen führt rechts von Index 2 mit (2 + 1) % 3 zurück zu 0. Links von 0 nutzt (0 - 1 + 3) % 3, um zu 2 zu gelangen. Addiere die Länge vor der Restoperation, weil -1 % 3 in JavaScript −1 ist.

Prüfe mit der Tastatur: Erreiche das Bedienelement, sieh den Fokus, aktiviere es mit den passenden Tasten, bewege dich innerhalb einer Gruppe und schließe einen aufklappenden Bereich mit Escape. Prüfe bei jeder Änderung den sichtbaren Zustand und den ARIA-Zustand.

Wichtige Erkenntnisse

  • Leite Klick, Enter und Leertaste bei einer eigenen Schaltfläche an eine Aktion weiter.
  • Native Schaltflächen bieten bereits eine Klickaktivierung über die Tastatur.
  • Wähle aria-pressed, aria-expanded oder aria-checked passend zum jeweiligen Zustand.
  • Vergleiche ARIA-Werte als Zeichenketten und aktualisiere die Gestaltung anhand desselben Zustands.
  • Roving tabindex gibt einer Gruppe einen Tab-Stopp und ermöglicht die Bewegung mit Pfeiltasten.
  • Escape schließt einen aufklappenden Bereich und stellt den Fokus auf sein auslösendes Bedienelement wieder her.

5.3 Verschiebe den Fokus bei Änderungen an der Seite

Der Fokus bestimmt, wohin die nächste Tastaturaktion geht. Verschwindet das fokussierte Bedienelement, kann der Nutzer seine Position verlieren. Behandle den Fokus als Teil der Seitenaktualisierung, besonders beim Öffnen eines Dialogs, beim Löschen eines Eintrags oder beim Melden eines Fehlers.

Einen Dialog öffnen und zum auslösenden Bedienelement zurückkehren

Merke dir vor dem Öffnen das fokussierte Element. Setze den Fokus in die neue Interaktion und stelle ihn beim Schließen wieder her:

let opener;
openButton.addEventListener("click", () => {
  opener = document.activeElement;
  dialog.showModal();
});
dialog.addEventListener("close", () => {
  if (opener && opener.isConnected) opener.focus();
});

showModal() an einem nativen Dialog setzt den Fokus hinein und macht den Rest der Seite inaktiv, sodass er nicht angeklickt oder fokussiert werden kann, solange der modale Dialog geöffnet ist. Escape löst normalerweise ein cancel-Ereignis aus, gefolgt vom Schließen und einem close-Ereignis. Ein cancel-Listener kann das Schließen verhindern, wenn die Anwendung dieses Verhalten benötigt.

Wähle im Dialog eine sinnvolle anfängliche Fokusposition, etwa sein erstes relevantes Bedienelement. Bei einem eigenen aufklappenden Bereich muss Code den Fokus gezielt verschieben. Existiert das ursprüngliche auslösende Bedienelement nicht mehr, wähle stattdessen ein sinnvolles Bedienelement in der Nähe, statt ein losgelöstes Element zu fokussieren.

Ein sinnvolles Ziel fokussierbar machen

Eine Überschrift oder Fehlerübersicht ist normalerweise nicht fokussierbar. Gib ihr tabindex="-1", bevor du .focus() aufrufst. Sie kann dann gezielt den Fokus erhalten, ohne bei der normalen Tab-Navigation zu einem zusätzlichen Stopp zu werden. Nutze 0 nur, wenn sie in diese normale Reihenfolge gehört.

Die Position nach dem Löschen erhalten

Bevor du einen Listeneintrag entfernst, dessen Löschschaltfläche den Fokus hat, finde das nächste sinnvolle Ziel. Fokussiere die Schaltfläche des nächsten Eintrags; gibt es keinen nächsten Eintrag, nutze die Schaltfläche des vorherigen. Wird die Liste leer, fokussiere ihre Überschrift mit tabindex="-1".

Wenn du das Ziel vor dem Entfernen findest, geht die Beziehung zu benachbarten Einträgen nicht verloren. Setze den Fokus nicht nach jedem Löschen an den Anfang des Dokuments; die Person sollte in der Nähe der Änderung weiterarbeiten können.

Den Fokus innerhalb einer fortlaufenden Interaktion halten

Ein aufklappender Bereich kann sich schließen, wenn der Fokus seinen gesamten Bereich verlässt. Das Ereignis focusout, das die Bubbling-Phase durchläuft, liefert das Ziel:

menu.addEventListener("focusout", (event) => {
  if (!menu.contains(event.relatedTarget)) {
    menu.hidden = true;
  }
});

Eine Bewegung zwischen zwei Menüelementen schließt das Menü nicht, weil das Ziel innerhalb bleibt. Ein Ziel mit dem Wert null liegt ebenfalls außerhalb; contains(null) ist falsch. Gib den Fokus nicht automatisch an das auslösende Bedienelement zurück, wenn der Nutzer bewusst zu einem anderen Bedienelement der Seite gewechselt ist.

Änderungen vorhersehbar machen

Setze nach einer fehlgeschlagenen benutzerdefinierten Formularvalidierung den Fokus auf das erste ungültige Feld oder eine Fehlerübersicht, die zu den Fehlern verlinkt. Die integrierte Validierung fokussiert bereits ein ungültiges Feld. Halte den Fehlertext verfügbar, damit die Person weiß, was sie korrigieren muss.

Springe nicht zu einem neuen Feld, während der Nutzer tippt, und navigiere nicht, sobald sich eine Auswahlliste ändert. Lass eine eindeutige Aktion die Änderung bestätigen. Fokusbewegungen sollten eine bewusste Handlung oder die Behebung eines Fehlers unterstützen und die normale Eingabe nicht unterbrechen.

Wichtige Erkenntnisse

  • Merke dir das auslösende Bedienelement und stelle beim Schließen eines Dialogs den Fokus auf ein verfügbares Ziel wieder her.
  • Nutze tabindex="-1" für eine Überschrift oder Übersicht, die per Code fokussiert wird.
  • Fokussiere nach dem Löschen einen benachbarten Eintrag oder die Überschrift der leeren Liste.
  • Nutze relatedTarget, um Fokusbewegungen innerhalb eines aufklappenden Bereichs von dessen Verlassen zu unterscheiden.
  • Fokussiere nach einer fehlgeschlagenen Validierung ein Fehlerziel; vermeide unerwartete Fokussprünge.

Ereignisse in JavaScript: Beispiele

5 Interaktive Lektionen

1

Erstelle und untersuche Event-Listener

13 Schritte
Registriere einen Zähler, untersuche verschachtelte Klicks und korrigiere die Lebensdauer von Listenern.
  1. 1
    EinführungLass eine Schaltfläche reagieren

    Ein Listener verbindet ein Ereignis mit einer Funktion. Erstelle einen kleinen Zähler, indem du die Schaltfläche auswählst, ihre Aktion registrierst und den Zählerstand zwischen Aufrufen erhältst. Untersuche dann einen verschachtelten click und steuere die Lebensdauer des Listeners.

    Achte auf den Unterschied zwischen Einrichtungscode, der jetzt läuft, und dem Callback, den der Browser aufruft, wenn das gewählte Ereignis eintritt.

  2. 2
    BeispielSpeichere den Zählerstand außerhalb des Callbacks

    Wähle die vorhandene Schaltfläche aus und speichere ihren Zählerstand vor der Registrierung:

    const button = document.querySelector("#like");
    let likes = 0;
    button.addEventListener("click", () => {
      likes = likes + 1;
      button.textContent = "Likes: " + likes;
    });
    

    Jeder Aufruf erhöht den vorherigen Zählerstand. Nach drei Klicks lautet die Beschriftung „Likes: 3“. Ein innerhalb des Callbacks deklarierter Zähler würde bei jedem Aufruf neu beginnen.

  3. 3
    TippÜbergib die Aktion, ohne sie aufzurufen

    addEventListener("click", showMenu) übergibt eine Funktion zur späteren Verwendung. showMenu() würde sie während der Einrichtung aufrufen. Wenn Argumente benötigt werden, nutze () => showMenu("main").

    Lade das Skript, nachdem die Schaltfläche existiert, etwa mit defer, und beachte die exakte Schreibweise des Ereignisses. Ein Listener für "Click" empfängt keine gewöhnlichen "click"-Ereignisse.

  4. 4
    HerausforderungKorrigiere eine Registrierung

    Eine Schaltfläche soll bei jeder Aktivierung den Tipps-Bereich öffnen. Die Einrichtung nutzt derzeit button.addEventListener("click", openTips()). Was sollte sich ändern und warum?

    ---reveal---

    Übergib openTips ohne Klammern. Damit stellst du den Callback bereit, der bei einem späteren click laufen soll. Der Aufruf von openTips() während der Einrichtung öffnet den Bereich sofort und übergibt sein Ergebnis, statt die Aktion für das Ereignis bereitzuhalten.

  5. 5
    ErklärungLies die beiden Elementeigenschaften

    Bei einer Schaltfläche, die ein Bild enthält, macht ein Klick auf das Bild dieses zum target. Im Listener der Schaltfläche ist currentTarget die Schaltfläche.

    target gibt an, wo das Ereignis begann; anders als target bezeichnet das aktuelle Ziel das Element, an dem dieser Callback registriert wurde. Dieser Unterschied erklärt, warum das Lesen des dataset einer Schaltfläche über target fehlschlagen kann, wenn der click auf ihrem Bild landet.

  6. 6
    BeispielLies die Daten der zugehörigen Schaltfläche

    Angenommen, button hat data-id="7" und enthält ein Symbol:

    button.addEventListener("click", (event) => {
      console.log(event.currentTarget.dataset.id);
    });
    

    Das Ergebnis ist sowohl bei einem click auf das Symbol als auch bei einem click auf den Hintergrund der Schaltfläche "7". Derselbe Ausdruck funktioniert in einem Listener als Pfeilfunktion oder reguläre Funktion. Das this einer Pfeilfunktion bezeichnet nicht automatisch die Schaltfläche.

  7. 7
    HerausforderungBestimme das Element des Listeners

    Ein Abschnitt enthält eine Schaltfläche mit einem span-Element. Ein click-Listener ist nur am Abschnitt registriert, und das span-Element wird angeklickt. Was bezeichnen target und currentTarget während dieses Callbacks?

    ---reveal---

    target bezeichnet das span-Element, an dem das Ereignis begann. currentTarget bezeichnet den Abschnitt, an dem der Listener registriert wurde. Der Ursprung des Ereignisses wird nicht durch das Vorfahrenelement ersetzt, das es empfängt.

  8. 8
    ErklärungBewahre die Referenz zum Entfernen auf

    Zum Entfernen werden derselbe Ereignistyp, dasselbe Callback-Objekt und dieselbe Capture-Einstellung benötigt:

    const handler = () => closePanel();
    button.addEventListener("click", handler);
    button.removeEventListener("click", handler);
    

    Eine anonyme Funktion kann entfernt werden, wenn sie auf diese Weise gespeichert wird. Ein neu geschriebenes () => closePanel() im Aufruf zum Entfernen erzeugt ein anderes Objekt und passt nicht zur früheren Registrierung.

  9. 9
    VerbindungBeende mehrere Registrierungen gemeinsam

    Eine vorübergehend aktive Funktion kann ein Signal eines AbortController an mehrere Registrierungen übergeben. Der Aufruf von controller.abort() entfernt diese Listener, einschließlich gespeicherter oder anonymer Callbacks.

    Nutze für eine weitere Lebensdauer einen neuen Controller. Für eine einzelne einmalige Reaktion entfernt { once: true } diese Registrierung nach ihrer Ausführung. Keine der beiden Optionen verhindert, dass sich unterschiedliche Callbacks ansammeln, bevor ihre Lebensdauer endet.

  10. 10
    HerausforderungUntersuche eine wiederholte Einrichtung

    Das Öffnen eines Bereichs registriert jedes Mal einen neuen anonymen Tastatur-Listener am Dokument. Das Schließen blendet den Bereich aus, lässt den Listener aber bestehen. Nach dreimaligem Öffnen löst eine Taste drei Aktionen aus. Wie lässt sich der Lebenszyklus korrigieren?

    ---reveal---

    Entferne die Registrierungen, wenn der Bereich geschlossen wird, etwa indem du ihr gemeinsames Signal abbrichst, und erstelle beim erneuten Öffnen einen neuen Controller. Alternativ kannst du einen Callback speichern und dieselbe Referenz entfernen. Das Ausblenden des Bereichs entfernt keinen Dokument-Listener.

  11. 11
    KernaussageSende eine Benachrichtigung sofort

    Um anderen Code zu benachrichtigen, erstelle ein CustomEvent mit seinen Daten in detail. Setze bubbles: true, wenn Vorfahrenelemente es empfangen sollen:

    item.dispatchEvent(new CustomEvent("cart:add", {
      detail: { id: 42 }, bubbles: true
    }));
    

    Die Listener laufen, bevor der Aufruf zurückkehrt. Das ausgelöste Ereignis hat für isTrusted den Wert falsch. Es ist eine Benachrichtigung, die dein Code sendet, keine Aufforderung an den Browser, auf eine Nutzeraktion zu warten.

  12. 12
    HerausforderungKombiniere Ursprung und Lebensdauer

    Der click-Handler einer Schaltfläche nutzt deren eigenes data-key und soll nur bei der ersten Aktivierung reagieren. Die Schaltfläche enthält ein SVG-Symbol. Mit welcher Eigenschaft und welcher Option erfüllst du beide Anforderungen?

    ---reveal---

    Lies event.currentTarget.dataset.key im direkten Listener der Schaltfläche und registriere ihn mit { once: true }. Die Eigenschaft bezeichnet die zugehörige Schaltfläche auch bei einem click auf das Symbol. Die Option entfernt diese Registrierung nach ihrem ersten Aufruf.

  13. 13
    ZusammenfassungPrüfe einen Listener an drei Stellen

    Wenn eine Interaktion fehlschlägt, untersuche die Einrichtung, die Daten des Callbacks und seine Lebensdauer. Bestätige, dass das Element existiert und der Ereignisname exakt ist; prüfe target und currentTarget während des Aufrufs; suche dann nach fehlendem Entfernen oder wiederholter Registrierung. Diese Prüfungen unterscheiden einen Listener, der nie ein Ereignis empfängt, von einem, der es korrekt empfängt, aber auf das falsche Element einwirkt.

2

Verfolge Ereignisse und delegiere Aktionen

13 Schritte
Bestimme die Reihenfolge von Listenern, ersetze Browser-Standardaktionen und verarbeite neue Listeneinträge.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungVerfolge einen Klick durch eine Karte
  2. 2
    BeispielLies den Weg aufwärts
  3. 3
    ErklärungErgänze den Weg abwärts
  4. 4
    HerausforderungVerfolge einen kleineren Baum
  5. 5
    ErklärungErsetze die Navigation
  6. 6
    KernaussageDas Stoppen der Weitergabe ist eine andere Entscheidung
  7. 7
    HerausforderungHalte einen Beobachter am Elternelement aktiv
  8. 8
    ErklärungVerschiebe den Listener zur Liste
  9. 9
    BeispielFinde und prüfe die Schaltfläche zum Entfernen
  10. 10
    HerausforderungVerarbeite ein verschachteltes Symbol
  11. 11
    TippNutze ein Ereignis, das den Container erreicht
  12. 12
    HerausforderungHalte Öffnen und Schließen getrennt
  13. 13
    ZusammenfassungWähle für jede Aktion die passende Stelle
3

Verarbeite Tasten und implementiere eine Ziehinteraktion

16 Schritte
Wähle Eingabeereignisse, arbeite mit Koordinaten und mache eine Ziehinteraktion robust und nutzbar.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungWähle die richtige Eingabeebene
  2. 2
    ErklärungUnterscheide Bedeutung und Position
  3. 3
    TippSchütze die Texteingabe und behandle Wiederholungen
  4. 4
    HerausforderungWähle ein Ereignis für eine Vorschau
  5. 5
    VerbindungErfasse mit der Aktivierung auch die Tastatur
  6. 6
    BeispielRechne zwischen Koordinatensystemen um
  7. 7
    HerausforderungUntersuche einen Klick auf einer gescrollten Seite
  8. 8
    KernaussageMach Hover nicht zum einzigen Zugangsweg
  9. 9
    BeispielBerechne eine Ziehbewegung
  10. 10
    ErklärungSpeichere den Start und erfasse den Zeiger
  11. 11
    BeispielWende die Verschiebung bei jeder Bewegung an
  12. 12
    TippBeende die Interaktion auch bei Übernahme durch den Browser
  13. 13
    HerausforderungBestimme eine fortgesetzte Ziehbewegung
  14. 14
    VerbindungBiete Bewegung ohne Ziehen an
  15. 15
    HerausforderungUntersuche zwei Fehler beim Ziehen
  16. 16
    ZusammenfassungWähle das Ereignis passend zur Aufgabe
4

Erstelle eine vollständige Formularinteraktion

16 Schritte
Lies Felder aus, verarbeite das Absenden und unterstütze Korrekturen durch native und benutzerdefinierte Validierung.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungVerfolge ein Formular von der Bearbeitung bis zum Absenden
  2. 2
    BeispielLies eine Zahl ohne Konkatenation
  3. 3
    ErklärungLies Auswahlen und wiederholte Namen
  4. 4
    HerausforderungErhalte jedes ausgewählte Thema
  5. 5
    ErklärungVerarbeite das Absenden am Formular
  6. 6
    BeispielLies, füge hinzu und setze zurück
  7. 7
    HerausforderungBehalte den normalen Absendeweg bei
  8. 8
    BeispielLies unabhängige Regelverletzungen aus
  9. 9
    KernaussageEin Muster verlangt keinen Wert
  10. 10
    HerausforderungPrüfe einen Bereich mit Schrittweite
  11. 11
    ErklärungErgänze eine Regel, die zwei Felder verbindet
  12. 12
    TippTrenne Gültigkeit und Zeitpunkt der Fehlermeldung
  13. 13
    HerausforderungKorrigiere eine veraltete Datumsregel
  14. 14
    VerbindungÜbernimm Verantwortung beim Überspringen der Browserrückmeldung
  15. 15
    HerausforderungVervollständige den Korrekturablauf
  16. 16
    ZusammenfassungPrüfe sowohl gültige als auch ungültige Wege
5

Erstelle Bedienelemente und erhalte die Tastaturposition

14 Schritte
Wähle natives Verhalten, synchronisiere benutzerdefinierten Zustand und verwalte den Fokus bei Seitenänderungen.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungMach eine Interaktion über die Tastatur nutzbar
  2. 2
    ErklärungNutze das Verhalten, das HTML bereits bietet
  3. 3
    TippLege die Fokussierbarkeit für den vorgesehenen Weg fest
  4. 4
    HerausforderungKorrigiere eine nicht erreichbare Aktion
  5. 5
    BeispielNutze eine gemeinsame Aktivierungsfunktion
  6. 6
    ErklärungDrücke die richtige Art von Zustand aus
  7. 7
    HerausforderungKehre einen Aufklappbereich korrekt um
  8. 8
    BeispielVerschiebe einen Tab-Stopp innerhalb einer Gruppe
  9. 9
    VerbindungMerke dir, woher ein Dialog geöffnet wurde
  10. 10
    BeispielLass eine interne Fokusbewegung innerhalb bleiben
  11. 11
    HerausforderungWähle den Fokus nach dem Entfernen
  12. 12
    HerausforderungVerfolge die Aktualisierung einer Gruppe
  13. 13
    HerausforderungHalte einen aufklappenden Bereich vorhersehbar
  14. 14
    ZusammenfassungTeste die vollständige Bedienabfolge

Ereignisse in JavaScript: Übungsaufgaben

50 Übungsfragen in 5 Sets

Set 1: Verfolge verschachtelte Aktionen und Delegation10 Übungsfragen

Frage 1 von 10

Eine Schaltfläche liegt innerhalb eines Abschnitts, der wiederum innerhalb eines main-Elements liegt. Jedes Element hat einen gewöhnlichen Klick-Listener. In welcher Reihenfolge laufen sie, wenn die Schaltfläche angeklickt wird?
  1. Main → Abschnitt → Schaltfläche.
  2. Abschnitt → Schaltfläche → Main.
  3. Schaltfläche → Abschnitt → Main.
  4. Schaltfläche → Main → Abschnitt.
Antwort zeigenAntwort ausblenden
Antwort: C
Gewöhnliche Listener laufen am Ziel und anschließend auf dem Weg der Bubbling-Phase. Der Klick beginnt an der Schaltfläche, erreicht ihren Abschnitt und dann ihr main-Vorfahrenelement. Eine Reihenfolge mit main zuerst würde Capture-Listener auf dem Weg über die Vorfahren beschreiben, die hier nicht registriert wurden.

Frage 2 von 10

Ein Container hat einen Capture-Listener und einen gewöhnlichen Klick-Listener. Seine Schaltfläche als Kindelement hat einen gewöhnlichen Klick-Listener. Was wird ausgegeben, wenn die Schaltfläche angeklickt wird?
  1. Container Capture → Schaltfläche → Container gewöhnlich.
  2. Schaltfläche → Container Capture → Container gewöhnlich.
  3. Container gewöhnlich → Schaltfläche → Container Capture.
  4. Container Capture → Container gewöhnlich → Schaltfläche.
Antwort zeigenAntwort ausblenden
Antwort: A
Der Capture-Listener beobachtet den Weg abwärts, bevor das Ziel behandelt wird. Dann läuft der Listener der Schaltfläche am Ziel, gefolgt vom gewöhnlichen Bubbling-Listener des Containers. Die Registrierungsreihenfolge verschiebt den Bubbling-Listener eines Vorfahrenelements nicht vor die Zielphase.

Frage 3 von 10

Ein Formular hat einen gewöhnlichen focus-Listener, aber das Fokussieren seines input-Kindelements ruft ihn nicht auf. Wie kann das Formular den Fokus von Nachfahren ohne Capture beobachten?
  1. Reagiere am Formular auf blur.
  2. Ergänze bubbles: true als Listener-Option.
  3. Lies currentTarget im vorhandenen focus-Callback.
  4. Reagiere am Formular auf focusin.
Antwort zeigenAntwort ausblenden
Antwort: D
focusin gelangt vom input-Element durch Bubbling zum Formular, sodass ein gewöhnlicher Formular-Listener es beobachten kann. focus und blur durchlaufen die Bubbling-Phase nicht. Eine Listener-Option kann nicht ändern, ob das Browserereignis die Bubbling-Phase durchläuft; das Lesen einer Eigenschaft in einem Callback, der nie läuft, kann das fehlende Ereignis nicht ersetzen.

Frage 4 von 10

Ein Link-Listener ruft nur event.stopPropagation() auf. Was geschieht mit seiner normalen Navigation?
  1. Die Navigation wird verhindert.
  2. Der Link navigiert weiterhin.
  3. Der Link benötigt zwei Klicks.
  4. Vorfahren-Listener blockieren sie.
Antwort zeigenAntwort ausblenden
Antwort: B
Das Stoppen der Ereignisweitergabe verhindert den Weg zu weiteren Elementen, aber die Navigation ist die separate Standardaktion des Links. Da keine Verhinderung angegeben ist, bleibt diese Aktion bestehen. Nutze preventDefault() in einem dafür geeigneten Listener, wenn Code die Navigation durch eine Aktion auf der Seite ersetzt.

Frage 5 von 10

Der submit-Listener eines Formulars ruft preventDefault() auf. Ein gewöhnlicher submit-Listener existiert auch an einem umgebenden Abschnitt. Was kann der Listener des Abschnitts beobachten?
  1. Er wird übersprungen, weil das Verhindern Bubbling stoppt.
  2. Er läuft und liest defaultPrevented als falsch.
  3. Er läuft nur, wenn er ebenfalls preventDefault() aufruft.
  4. Er läuft und kann defaultPrevented als wahr lesen.
Antwort zeigenAntwort ausblenden
Antwort: D
Das Verhindern der Standardaktion des Formulars stoppt nicht die Weitergabe des submit-Ereignisses durch Bubbling. Der Listener des Abschnitts läuft weiterhin und kann erkennen, dass die Standardaktion verhindert wurde. Die Ereignisweitergabe müsste gesondert gestoppt werden; das erneute Verhindern am Vorfahrenelement ist für den Empfang des Ereignisses nicht erforderlich.

Frage 6 von 10

Eine Schaltfläche öffnet ein Menü. Ein Klick-Listener am Dokument schließt es daraufhin beim selben Klick. Das Menü muss sich auch bei tatsächlichen Klicks außerhalb schließen und die Protokollierung auf Dokumentebene muss weiter funktionieren. Welche Änderung erfüllt alle drei Anforderungen?
  1. Schließe nur, wenn weder Menü noch auslösendes Bedienelement das Ziel enthält.
  2. Stoppe vor dem Öffnen bei jedem Klick auf die Menüschaltfläche die Weitergabe.
  3. Verhindere vor dem Umschalten des Zustands den Klick auf die Menüschaltfläche.
  4. Schließe nur, wenn das Menü selbst das Ziel nicht enthält.
Antwort zeigenAntwort ausblenden
Antwort: A
Der öffnende Klick gelangt durch Bubbling zum Dokument und liegt außerhalb des Menüs, aber innerhalb seines auslösenden Bedienelements. Die Prüfung beider Bereiche erhält das neu geöffnete Menü und schließt es weiterhin bei anderen Klicks außerhalb. Das Stoppen der Ereignisweitergabe würde dieses Ereignis vor der Dokumentprotokollierung verbergen; das Verhindern einer Standardaktion ändert keine der beiden Prüfungen.

Frage 7 von 10

Ein delegierter Listener an einer Werkzeugleiste erhält einen Klick, dessen Ziel ein SVG innerhalb einer Schaltfläche ist. Welcher Ausdruck findet die Schaltfläche von diesem Ziel aus?
  1. event.target.closest("button")
  2. event.currentTarget.closest("button")
  3. event.target.matches("button")
  4. event.target.querySelector("button")
Antwort zeigenAntwort ausblenden
Antwort: A
closest() beginnt beim angeklickten SVG und geht aufwärts zur Schaltfläche. matches() prüft nur das SVG und kann daher das umgebende Bedienelement nicht finden. Auch die Suche abwärts mit querySelector() geht in die falsche Richtung, wenn die Schaltfläche das Ereignisziel enthält.

Frage 8 von 10

Eine leere Liste erhält einen delegierten Klick-Listener. Code fügt später eine passende Schaltfläche zum Entfernen innerhalb eines Eintrags hinzu. Welche Registrierung ist für die neue Schaltfläche nötig?
  1. Registriere denselben Callback auch an der neuen Schaltfläche.
  2. Keine neue Registrierung; ihr Klick erreicht die Liste.
  3. Entferne den Listen-Listener und füge ihn nach dem Einfügen erneut hinzu.
  4. Löse nach dem Hinzufügen der Schaltfläche DOMContentLoaded erneut aus.
Antwort zeigenAntwort ausblenden
Antwort: B
Das Ereignis gelangt von der neuen Schaltfläche durch Bubbling zur vorhandenen Liste, wo der delegierte Callback bereits läuft. Der Callback wählt das relevante Bedienelement anhand des Ereignisziels aus. Ein weiterer direkter Listener ist unnötig und kann Arbeit doppelt ausführen, wenn beide Callbacks dieselbe Aktion ausführen.

Frage 9 von 10

Ein delegierter Listener nutzt closest(".action") innerhalb eines Containers, der in einem äußeren .action-Element liegt. Ein Klick auf einen Zwischenraum findet dieses äußere Element. Welche Prüfung beschränkt die Verarbeitung auf den Container?
  1. Kehre zurück, wenn event.currentTarget === container.
  2. Kehre nur zurück, wenn der Treffer gleich event.target ist.
  3. Kehre zurück, wenn der Treffer keine Kindelemente hat.
  4. Kehre zurück, wenn der Treffer außerhalb von container liegt.
Antwort zeigenAntwort ausblenden
Antwort: D
closest() kann über den Container des Listeners hinausgehen und ein äußeres Vorfahrenelement zurückgeben. Nutze nach der Prüfung auf einen fehlenden Treffer container.contains(match), um dieses Ergebnis auszuschließen. Die Prüfung currentTarget === container würde jedes Ereignis in diesem Listener ausschließen, auch gültige Klicks auf seine eigenen Kindelemente.

Frage 10 von 10

Eine Liste delegiert Klicks zum Entfernen mit closest(".remove") und Prüfungen auf Zugehörigkeit. Neue Schaltflächen funktionieren, außer in einer Zeile, deren Symbol-Listener stopPropagation() aufruft. Der Innenabstand der Schaltfläche in derselben Zeile funktioniert. Warum tritt dieser Unterschied auf?
  1. Die Zugehörigkeitsprüfung schließt jedes SVG als Nachfahren aus.
  2. Neue Zeilen benötigen direkte Listener an allen ihren Symbolen.
  3. Klicks auf das Symbol werden vor Erreichen der Liste gestoppt.
  4. closest sucht abwärts, wenn das Ziel ein Symbol ist.
Antwort zeigenAntwort ausblenden
Antwort: C
Der Symbol-Listener blockiert den Weg aufwärts, sodass der Listen-Callback diesen Klick nie erhält. Ein Klick auf den Innenabstand der Schaltfläche umgeht den Symbol-Listener und kann weiterhin durch Bubbling zur Liste gelangen. closest() kann ein Symbol als Ziel verarbeiten, hilft aber nicht, wenn ein delegierter Callback das Ereignis nie erhält.
Set 2: Richte Event-Listener ein und untersuche sie10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Eine Schaltfläche soll showHints nur bei ihrer Aktivierung aufrufen. Welche Registrierung erreicht das?
  1. button.addEventListener("click", showHints());
  2. button.addEventListener("click", showHints);
  3. button.addEventListener("onclick", showHints);
  4. button.addEventListener("click", () => showHints);
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Ein Skript im Head wählt eine Schaltfläche aus, deren Markup später folgt, und scheitert dann bei addEventListener. Welche Änderung beim Laden lässt die Auswahl warten, bis das HTML geparst ist?
  1. Benenne den Listener-Parameter in event um.
  2. Nutze onclick als registrierten Ereignisnamen.
  3. Verschiebe die Auswahl in einen sofortigen Funktionsaufruf.
  4. Füge defer zum externen Skript-Tag hinzu.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Ein externes Skript nutzt const items = document.querySelectorAll(".choice"); items.addEventListener("click", choose);. Alle Auswahlmöglichkeiten existieren bereits. Warum schlägt das fehl und wie sollte die Einrichtung geändert werden?
  1. Das Ergebnis ist eine NodeList; registriere an jedem Element.
  2. Das Ergebnis ist eine NodeList; nutze den Ereignisnamen "onclick".
  3. Dem Callback fehlen Klammern; registriere choose() an der Liste.
  4. Das Ergebnis ist ein Element; registriere daran einen Capture-Listener.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Zwei unterschiedliche Funktionen werden nacheinander zugewiesen: button.onclick = first; button.onclick = second;. Was geschieht, wenn die Schaltfläche einmal angeklickt wird?
  1. first läuft, gefolgt von second.
  2. Nur first läuft.
  3. Nur second läuft.
  4. second läuft, gefolgt von first.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Ein Klick-Listener ist an einer Schaltfläche registriert, die ein span-Element enthält. Das span-Element wird angeklickt. Was sind target und currentTarget während dieses Listeners?
  1. target: Schaltfläche; currentTarget: span-Element.
  2. target: span-Element; currentTarget: Schaltfläche.
  3. target: span-Element; currentTarget: span-Element.
  4. target: Schaltfläche; currentTarget: Schaltfläche.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Ein Listener als Pfeilfunktion an <button data-code="r8"><span>Run</span></button> liest event.target.dataset.code. Warum kann das undefined zurückgeben und welcher Ausdruck liest im direkten Listener den Code der Schaltfläche?
  1. Das span-Element kann das Ziel sein; lies event.currentTarget.dataset.code.
  2. Die Schaltfläche verliert ihre Daten; lies event.type.dataset.code.
  3. Das span-Element kann das Ziel sein; lies this.dataset.code in der Pfeilfunktion.
  4. Die Schaltfläche ist das Ziel; lies event.currentTarget.value.code.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Ein Listener gibt sein Ereignisobjekt in der Konsole aus. Nach Ende der Interaktion zeigt das Aufklappen der Ausgabe currentTarget: null. Wie kann die Entwicklerin oder der Entwickler das Element des Listeners während des Aufrufs untersuchen?
  1. Lies event.target nach dem Aufruf als Element des Listeners.
  2. Ergänze once: true, damit das Objekt sein aktuelles Ziel behält.
  3. Gib das Ereignisobjekt nach der Ereignisauslösung erneut aus.
  4. Gib event.currentTarget innerhalb des Listeners aus.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Ein Callback wurde mit { capture: true } registriert. Derselbe Typ und dieselbe Funktion werden an removeEventListener übergeben, aber ohne drittes Argument. Warum bleibt der Callback bestehen?
  1. Beim Entfernen müssen alle ursprünglichen Optionen wiederholt werden.
  2. Capture-Callbacks können nur mit abort() entfernt werden.
  3. Beim Entfernen wird nach der Registrierung ohne Capture gesucht.
  4. Beim Entfernen zählt der Quelltext statt der Funktionsidentität.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Jeder Klick auf „Beginnen“ registriert board.addEventListener("click", () => mark()). Nach zweimaligem Beginnen setzt ein Klick auf das Spielfeld zwei Markierungen. Welche Änderung an der Einrichtung verhindert diese Ansammlung?
  1. Ergänze once: true bei jedem neu erstellten Spielfeld-Callback.
  2. Entferne ein neu geschriebenes () => mark() vor dem Hinzufügen.
  3. Setze vor jedem Hinzufügen board.onclick = null.
  4. Registriere bei der ersten Einrichtung einen gespeicherten Callback.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Eine ansonsten leere Schaltfläche erhält diese Registrierungen und wird dann zweimal angeklickt. Wie oft läuft log insgesamt?

button.addEventListener("click", log, { once: true });
button.addEventListener("click", log);
button.addEventListener("click", log, true);
button.removeEventListener("click", log);
  1. 2
  2. 1
  3. 3
  4. 4
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 3: Verarbeite Tastatur-, Zeiger- und Zieheingaben10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Ein Kurzbefehl soll unabhängig vom Tastaturlayout dem erzeugten Buchstaben folgen. Welche Eigenschaft sollte er prüfen?
  1. event.code
  2. event.repeat
  3. event.button
  4. event.key
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Eine Vorschau erfasst keinen über ein Kontextmenü eingefügten Text und zeigt Eingaben um ein Zeichen verzögert an. Derzeit liest sie das Feld bei keydown. Welche Änderung behebt beide Probleme?
  1. Lies das Feld in einem keyup-Listener.
  2. Lies event.code im keydown-Listener.
  3. Lies das Feld in einem input-Listener.
  4. Rufe bei jedem keydown preventDefault() auf.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Ein Dokument-Kurzbefehl mit einfachem „n“ soll einmal pro Tastendruck einen Bereich öffnen, ohne die Texteingabe zu unterbrechen. Wird N in einem editierbaren div-Element gedrückt gehalten, öffnet sich der Bereich derzeit wiederholt. Welche Bedingungen gehören vor das Öffnen?
  1. Überspringe editierbare Ziele und wiederholte keydown-Aufrufe.
  2. Überspringe nur wiederholte Aufrufe; erlaube alle editierbaren Ziele.
  3. Überspringe nur input-Elemente; erlaube alle wiederholten Aufrufe.
  4. Verhindere zuerst jede Taste und überspringe dann editierbare Ziele.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Die Aktion einer nativen Schaltfläche funktioniert mit der Maus, aber nicht bei Aktivierung mit der Leertaste. Ihr einziger Listener nutzt pointerdown. Welches Ereignis sollte die Aktion verarbeiten?
  1. pointermove
  2. click
  3. mousedown
  4. pointerenter
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Das Dokument ist um 420 px nach unten gescrollt. Ein Zeigerereignis meldet clientY 75. Wie lautet seine vertikale Koordinate relativ zum Dokument?
  1. 495 px
  2. 345 px
  3. 75 px
  4. 420 px
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Eine Hilfekarte blendet ihr Hinweisfeld aus, wenn sich der Zeiger vom Hintergrund der Karte in ein Badge als Kindelement bewegt. Ihr Listener zum Ausblenden nutzt pointerout. Welches Ereignis erkennt das Verlassen der ganzen Karte besser?
  1. pointerover
  2. pointermove
  3. pointerleave
  4. pointerdown
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Eine Box beginnt bei left: 65px; top: 90px. Ihr Zeiger beginnt bei den Client-Koordinaten 180, 210 und bewegt sich zu 155, 245. Welche Position sollte die Box erreichen?
  1. left: 155px; top: 245px
  2. left: 90px; top: 55px
  3. left: 25px; top: 35px
  4. left: 40px; top: 125px
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Eine Box speichert die korrekten Startwerte und erfasst ihre erste Berührung. Eine zweite Berührung überschreibt dann die Startwerte und das Loslassen einer der beiden Berührungen beendet die Bewegung. Welche Zustandsänderung behebt beide Fehler?
  1. Erfasse jeden neuen Zeiger und überschreibe die Startwerte bei jedem Drücken.
  2. Speichere die aktive Zeiger-ID und prüfe Drücken, Bewegung und Ende.
  3. Nutze Seitenkoordinaten und lass jeden Zeiger die Interaktion beenden.
  4. Ignoriere pointercancel und halte alle Bewegungs-Listener passiv.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Eine Ziehinteraktion per Berührung hat Zeigererfassung und eine korrekte Berechnung, aber eine Scrollgeste des Browsers bricht sie ab. Die nächste Zeigerbewegung kann die Box weiterhin bewegen. Welche zwei Änderungen regeln die Zuständigkeit für die Geste und den veralteten Zustand?
  1. Setze lokal user-select: none; lösche den Zustand nur bei pointerup.
  2. Erfasse den Zeiger bei jeder Bewegung erneut; ignoriere den Abbruch.
  3. Setze lokal touch-action: none; lösche den Zustand bei pointercancel.
  4. Verhindere jedes keydown am Dokument; lösche den Zustand beim Loslassen einer Taste.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Eine umsortierbare Liste unterstützt Ziehen und Bewegung mit Pfeiltasten. Ein Touchscreen-Nutzer kann nicht präzise ziehen. Welche Ergänzung bietet ihm eine geeignete Alternative?
  1. Anklickbare oder antippbare Schaltflächen zum Bewegen.
  2. Ein längerer Ziehgriff an jedem Eintrag.
  3. Eine Anleitung, die die Pfeiltasten beschreibt.
  4. Ein nur per Hover erreichbares Menü mit Bewegungshinweisen.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 4: Lies Formulardaten und untersuche die Validierung10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Ein Zahlenfeld enthält "6". Was ergibt input.value + 2?
  1. Die Zeichenkette "62".
  2. Die Zahl 8.
  3. Die Zahl 62.
  4. Die Zeichenkette "8".
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Ein Formular hat angekreuzte Themenfelder namens topic mit den Werten "art" und "code" in Dokumentreihenfolge, ein nicht angekreuztes topic mit dem Wert "music" und eine deaktivierte benannte Notiz. Was gibt new FormData(form).getAll("topic") zurück und warum ist die Umwandlung in ein Objekt riskant?
  1. ["art", "code", "music"]; die Objektumwandlung behält nur den ersten wiederholten Namen.
  2. ["art", "code"]; die Objektumwandlung fügt deaktivierte Elemente zur Sammlung hinzu.
  3. ["code"]; die Objektumwandlung sammelt alle Themenwerte in einem Array.
  4. ["art", "code"]; die Objektumwandlung behält nur den letzten wiederholten Namen.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Eine Schaltfläche „Details anzeigen“ innerhalb eines Formulars soll nur einen Bereich einblenden. Welcher ausdrücklich angegebene Typ verhindert, dass sie das Formular absendet?
  1. type="submit"
  2. type="reset"
  3. type="text"
  4. type="button"
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Ein Formular hat ein leeres Pflichtfeld. Eine Werkzeugleiste ruft form.submit() auf und der Listener des Formulars, der die Navigation verhindert, läuft nie. Welcher Aufruf stellt den erwarteten Ablauf wieder her und was geschieht, bevor das Feld korrigiert ist?
  1. Nutze requestSubmit(); der submit-Listener läuft, bevor die Validierung blockiert.
  2. Nutze erneut submit(); der zweite Aufruf startet den Listener nach der Validierung.
  3. Nutze requestSubmit(); die Validierung blockiert das Absenden vor submit.
  4. Nutze dispatchEvent(new Event("submit")); es führt die normale integrierte Validierung aus.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Ein optionales Textfeld hat pattern="[A-Z]{3}". Besteht ein leerer Wert diese Musterprüfung?
  1. Nein; jedes Muster setzt eine Eingabe voraus.
  2. Ja; das Muster überspringt leere Werte.
  3. Nein; der leere Wert verursacht typeMismatch.
  4. Ja; das Muster gilt nur für eingegebene Ziffern.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Ein Zahlenfeld hat min="2" max="14" step="4". Der Nutzer gibt 12 ein. Welche Prüfung schlägt fehl?
  1. stepMismatch, weil 2, 6, 10, 14 die erlaubten Schritte sind.
  2. rangeOverflow, weil 12 den letzten Schritt unter 14 überschreitet.
  3. Keine Regel; 12 liegt zwischen Minimum und Maximum.
  4. rangeUnderflow, weil die Schrittfolge bei null beginnt.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Ein Formular nutzt novalidate und prüft beim Absenden die Felder in Dokumentreihenfolge. Sein Mengenfeld ist ein Pflichtfeld mit min="2" max="14" step="4"; es enthält nun 10 und eine alte benutzerdefinierte Meldung wurde mit setCustomValidity("") gelöscht. Das nächste Feld ist ein leeres E-Mail-Pflichtfeld. Was sollte diesen Absendeversuch blockieren und den Fokus erhalten?
  1. Das Mengenfeld, weil es nach dem Löschen der Meldung ungültig bleibt.
  2. Das E-Mail-Feld, weil die Eingabe fehlt; das Mengenfeld erfüllt seine Regeln.
  3. Keines der Felder, weil novalidate die Validierungs-API deaktiviert.
  4. Das Mengenfeld, weil 10 die Viererschritte ab seinem Minimum verfehlt.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Eine Passwortbestätigung war ungültig. Die Werte stimmen nun überein, aber eine alte nicht leere benutzerdefinierte Validierungsmeldung ist noch vorhanden. Was muss die Prüffunktion tun?
  1. Setze confirm.value erneut auf sich selbst.
  2. Setze nur confirm.required = false.
  3. Rufe confirm.setCustomValidity("") auf.
  4. Rufe wiederholt form.requestSubmit() auf.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Eine Reservierung verlangt ein nicht leeres Enddatum, das strikt nach dem Startdatum liegt. Beide Datumsfelder sind Pflichtfelder. Die aktuelle Prüfung lehnt nur end.value < start.value ab und läuft nur bei Änderungen am Enddatum. Welche zwei Änderungen beheben die verbleibenden feldübergreifenden Fehler?
  1. Lehne <= ab und prüfe erneut, wenn sich eines der beiden Daten ändert.
  2. Lehne < ab und prüfe nur erneut, wenn das Enddatum den Fokus verliert.
  3. Lehne >= ab und prüfe erneut, wenn sich eines der beiden Daten ändert.
  4. Lehne === ab und prüfe nur erneut, wenn das Startdatum den Fokus verliert.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Während ein E-Mail-Feld korrigiert wird, ist eine Fehlermeldung sichtbar. Welcher zeitliche Ablauf entfernt sie zeitnah, ohne bei unberührten Feldern schon ab dem ersten Tastendruck Fehler anzuzeigen?
  1. Prüfe nur bei Fokusverlust erneut, auch nachdem ein Fehler angezeigt wurde.
  2. Zeige beim ersten Laden der Seite jedes leere Feld als fehlerhaft an.
  3. Lösche bei jedem keydown alle Meldungen, bevor die Gültigkeit gelesen wird.
  4. Prüfe gemeldete Fehler bei input erneut; beginne die Rückmeldung bei Fokusverlust oder submit.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 5: Ermögliche Tastaturbedienung und erhalte den Fokus10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Ein div-Element hat role="button" und einen Klick-Listener. Was stellt die Rolle selbst bereit?
  1. Einen normalen Tab-Stopp und sichtbaren Fokusring.
  2. Schaltflächensemantik für assistive Technologien.
  3. Aktivierung mit Enter und Leertaste ohne weiteren Code.
  4. Natives Deaktivierungsverhalten durch aria-disabled.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Eine Fehlerüberschrift im Formular soll nach einem fehlgeschlagenen Absendeversuch den Fokus erhalten, aber keinen Stopp bei der normalen Tab-Navigation hinzufügen. Welche Einrichtung passt?
  1. Setze tabindex="1" und rufe .focus() auf.
  2. Setze role="alert" und verlasse dich auf den Fokus per Tab.
  3. Setze tabindex="-1" und rufe .focus() auf.
  4. Setze tabindex="0" und entferne die Umrandung.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Eine eigene fokussierbare Schaltfläche leitet click und keydown an activate() weiter. Sie hat aria-disabled="true". Die Funktion beginnt mit if (button.getAttribute("aria-disabled") === true) return;, dennoch führen beide Wege die Aktion aus. Welche Korrektur setzt die Deaktivierung durch und erlaubt zugleich beim Zeichenkettenwert „false“ die Aktion?
  1. Vergleiche in der gemeinsamen Aktivierungsfunktion mit "true".
  2. Prüfe das zurückgegebene Attribut in activate auf Truthiness.
  3. Vergleiche nur im Klick-Listener mit dem booleschen Wert true.
  4. Verschiebe die unveränderte Prüfung in einen pointerdown-Listener.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Eine eigene Schaltfläche für einen Aufklappbereich öffnet einen Hilfebereich. Welches ARIA-Attribut meldet, ob dieser Bereich geöffnet ist?
  1. aria-checked
  2. aria-pressed
  3. aria-disabled
  4. aria-expanded
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Ein Aufklappbereich hat derzeit aria-expanded="true" und einen sichtbaren Bereich. Sein Klick-Handler liest den alten aufgeklappten Zustand. Wie sollte der nächste Zustand aussehen?
  1. aria-expanded="true"; panel.hidden = true.
  2. aria-expanded="false"; panel.hidden = false.
  3. aria-expanded="true"; panel.hidden = false.
  4. aria-expanded="false"; panel.hidden = true.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Eine Werkzeugleiste mit vier Elementen nutzt roving tabindex. Element 0 ist fokussiert. Welche Änderungen an Index und tabindex halten die Navigation nach ArrowLeft funktionsfähig?
  1. Fokussiere −1; lass Element 0 auf 0 und alle anderen auf −1.
  2. Fokussiere 3; setze Element 0 auf −1 und Element 3 auf 0.
  3. Fokussiere 3; lass Element 0 und Element 3 auf 0.
  4. Fokussiere 1; setze Element 0 auf 0 und Element 1 auf −1.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Eine native Umschaltfläche ruft dieselbe Umkehrfunktion bei click und Enter-keydown auf. Enter lässt ihren gedrückten Zustand unverändert, während ein Zeigerklick ihn einmal umschaltet. Welche Änderung korrigiert den Tastaturweg, ohne den Zugang zu verlieren?
  1. Behalte die Klickaktion und entferne die zusätzliche Enter-Aktivierung.
  2. Behalte beide Listener und ergänze eine Umkehrung bei Leertasten-keydown.
  3. Ersetze click durch pointerdown und nutze keinen Tasten-Listener.
  4. Behalte beide Listener und rufe preventDefault nach jedem Klick auf.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Ein modaler Dialog wird geschlossen, während sein auslösendes Bedienelement noch existiert. Wohin sollte der Fokus normalerweise zurückkehren?
  1. Nach jedem Schließen zum Body der Seite.
  2. Zum ersten Link im Dokument.
  3. Zum Bedienelement, das ihn geöffnet hat.
  4. Zur ausgeblendeten Schließen-Schaltfläche des Dialogs.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Ein aufklappender Bereich hat zwei Felder. Der Fokus wechselt vom ersten zum zweiten und ein focusout-Listener mit Bubbling blendet den Bereich aus. Was sollte der Listener vor dem Ausblenden prüfen?
  1. Ob relatedTarget außerhalb des Bereichs liegt.
  2. Ob target dem ersten Feld entspricht.
  3. Ob currentTarget dem Bereich entspricht.
  4. Ob die Taste für den Wechsel Tab war.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Eine Liste hat zwei Einträge und eine Überschrift mit tabindex="-1". Die fokussierte Löschschaltfläche im letzten Eintrag entfernt diesen; später wird auch der verbleibende Eintrag gelöscht. Welche Fokusfolge unterstützt die weitere Tastaturbedienung?
  1. Zuerst der Body der Seite, dann die zuvor gelöschte Schaltfläche.
  2. Zuerst die Schaltfläche des vorherigen Eintrags, dann die Listenüberschrift.
  3. Zuerst die Überschrift, dann der nächste Geschwisterknoten des entfernten Eintrags.
  4. Zuerst die entfernte Schaltfläche, dann der erste Link im Dokument.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Hängst du bei deiner eigenen Aufgabe fest? Hausaufgabenhilfe

Schlüsselbegriffe

80 Schlüsselbegriffe, jeweils mit Definition

A

AbortController
Ein AbortController stellt ein Signal bereit, das Lebensdauern von Listenern bündeln kann und die zugehörigen Listener entfernt, wenn seine Methode abort() aufgerufen wird.
Das Schließen eines Zeichenwerkzeugs bricht das Signal ab, das für seine Listener an Dokument und Fenster verwendet wird.
Absende-Schaltfläche
Eine Absende-Schaltfläche ist die für einen Absendevorgang verwendete Schaltfläche, die als event.submitter bereitgestellt wird, wenn eine bestimmte Schaltfläche diesen Weg ausgelöst hat.
Ein Formular unterscheidet Entwurf und Veröffentlichung, indem es den Wert der absendenden Schaltfläche liest.
Aktivierung
Aktivierung ist die Aufforderung des Nutzers, die Aktion eines Bedienelements auszuführen; bei Zeigerbedienung und nativer Tastaturbedienung wird sie durch click dargestellt.
Eine native Weiter-Schaltfläche reagiert über click, egal ob sie mit der Leertaste oder der Maus gedrückt wird.
aria-describedby
Das Attribut aria-describedby verknüpft ein Bedienelement mit beschreibendem Text, indem es die IDs der Elemente aufführt, die diesen Text enthalten.
Das E-Mail-Feld verweist auf email-error, damit assistive Technologien den Fehler mit ihm verknüpfen können.
aria-invalid
Das Attribut aria-invalid teilt mit, dass der eingegebene Wert eines Bedienelements einen Fehler enthält; Code muss es aktualisieren, wenn sich der Fehler ändert.
Das E-Mail-Feld hat aria-invalid="true", während seine Korrekturmeldung direkt am Feld angezeigt wird.
ARIA-Rolle
Eine ARIA-Rolle teilt assistiven Technologien den Zweck eines Elements mit, ohne das Tastaturverhalten oder die Fokusregeln für diesen Zweck hinzuzufügen.
Ein div-Element mit role="button" benötigt weiterhin Code für die Aktivierung und einen passenden Tab-Stopp.
ARIA-Zustand
Ein ARIA-Zustand ist ein Attributwert, der den aktuellen Zustand eines Bedienelements mitteilt, etwa angekreuzt, aufgeklappt, gedrückt oder deaktiviert.
Der aria-checked-Wert des Schalters wird aktualisiert, wenn sich seine sichtbare Ein-/Aus-Darstellung ändert.
Aufklappbereich
Ein Aufklappbereich besteht aus einem Bedienelement und einem Bereich, die Inhalte ein- oder ausblenden; die steuernde Schaltfläche teilt ihren Zustand über aria-expanded mit.
Eine Detailschaltfläche ändert ihren aufgeklappten Zustand zusammen mit der Sichtbarkeit des von ihr gesteuerten Hilfebereichs.
Auslösendes Bedienelement
Ein auslösendes Bedienelement startet die Interaktion mit einem aufklappenden Bereich oder Dialog und ist beim Schließen dieser Interaktion meist das passende Fokusziel.
Der Dialog speichert die öffnende Schaltfläche, um den Fokus nach dem close-Ereignis wiederherstellen zu können.

B

Benutzerdefinierte Validierung
Eine benutzerdefinierte Validierung ist eine von der Anwendung mit setCustomValidity() gesetzte Regel, bei der eine nicht leere Meldung das Bedienelement als ungültig markiert.
Eine nicht übereinstimmende Bestätigung erhält eine benutzerdefinierte Meldung, die gelöscht wird, sobald beide Passwörter übereinstimmen.
Bubbling
Bubbling ist das Durchlaufen von Vorfahrenelementen aufwärts nach der Zielphase und nur für Ereignisse verfügbar, deren bubbles-Wert wahr ist.
Das input-Ereignis eines Feldes als Kindelement gelangt durch Bubbling zu einem Listener am umgebenden Formular.

C

cancelable
Die Eigenschaft cancelable ist ein boolescher Wert, der angibt, ob ein Ereignis das Verhindern seiner Standardaktion durch preventDefault() erlaubt.
Ein input-Ereignis meldet eine bereits vorgenommene Bearbeitung, daher ist seine Eigenschaft cancelable falsch.
Capturing-Phase
Die Capturing-Phase ist der Weg eines Ereignisses durch Vorfahrenelemente abwärts zu seinem Ziel, der von für Capture registrierten Listenern beobachtet wird.
Der Capture-Listener eines Containers läuft, bevor der Listener einer Schaltfläche als Nachfahrenelement den Klick verarbeitet.
change-Ereignis
Ein change-Ereignis meldet eine übernommene Änderung durch den Nutzer, etwa das Verlassen eines bearbeiteten Textfeldes oder die Auswahl eines neuen Zustands bei einem Kontrollkästchen oder einer Auswahlliste.
Ein geändertes Textfeld löst change aus, wenn der Nutzer es für das nächste Bedienelement verlässt.
checked
Die Eigenschaft checked ist der boolesche Zustand, der unabhängig vom Übermittlungswert angibt, ob ein Kontrollkästchen oder Optionsfeld ausgewählt ist.
Eine Vorschau liest checkbox.checked, um zu entscheiden, ob ein optionaler Abschnitt angezeigt wird.
checkValidity
Die Methode checkValidity() gibt zurück, ob die Regeln erfüllt sind, und löst bei Fehlern invalid-Ereignisse aus, ohne eine Browserrückmeldung anzuzeigen.
Ein benutzerdefinierter Absendeablauf prüft das Formular, bevor er entscheidet, welche Fehler direkt an den Feldern angezeigt werden.
closest
Die Methode closest() prüft ein Element und dann seine Vorfahren auf den nächsten Selektortreffer und gibt null zurück, wenn keiner existiert.
Von einem Symbol ausgehend findet closest("button") die umgebende Aktionsschaltfläche.
code
Die Eigenschaft code bezeichnet eine physische Tastenposition unabhängig von dem Zeichen, das das aktuelle Tastaturlayout erzeugt.
Ein Spiel nutzt code, wenn seine Bewegungssteuerung an festen physischen Positionen bleiben soll.
Constraint-Validierung
Die Constraint-Validierung prüft, ob Formularwerte HTML-Regeln wie Pflichtangaben, Typsyntax, Bereiche, Schritte und Muster erfüllen.
Eine Mengenangabe außerhalb des Bereichs blockiert das normale Absenden, bevor der submit-Listener des Formulars läuft.
contains
Die Methode contains() prüft, ob ein Knoten das Element selbst oder einer seiner Nachfahren ist, und gibt einen booleschen Wert zurück.
Ein delegierter Listener an einer Liste prüft list.contains(button), bevor er die Aktion der Schaltfläche zulässt.
currentTarget
Die Eigenschaft currentTarget bezeichnet das Objekt, dessen Listener läuft, und wird nach Ende der Ereignisauslösung auf null zurückgesetzt.
Innerhalb eines an einer Schaltfläche registrierten Listeners kann Code über currentTarget die Daten dieser Schaltfläche lesen.
CustomEvent
Ein CustomEvent ist ein durch ein Skript erstelltes Ereignis, das Anwendungsdaten in detail tragen und für Bubbling zu Vorfahrenelementen konfiguriert werden kann.
Ein Warenkorbeintrag löst "cart:add" mit seiner Eintragskennung in detail des Ereignisses aus.

D

Datenattribut
Ein Datenattribut ist ein HTML-Attribut, das mit data- beginnt und Anwendungsinformationen speichert, die über das dataset eines Elements verfügbar sind.
Eine Werkzeugleiste liest data-action="clear" als button.dataset.action, um eine bekannte Aktion auszuwählen.
defaultPrevented
Die Eigenschaft defaultPrevented ist ein boolescher Wert, der festhält, ob die Standardaktion eines Ereignisses erfolgreich verhindert wurde.
Ein Listener an einem Vorfahrenelement kann defaultPrevented prüfen, bevor er entscheidet, wie ein Klick behandelt wird.
Dokumentkoordinaten
Dokumentkoordinaten sind Zeigerpositionen, die über pageX und pageY unter Berücksichtigung des Scrollens von der linken oberen Ecke des Dokuments aus gemessen werden.
Ein Klick 100 px unterhalb des oberen Viewportrands nach 300 px Scrollen hat pageY 400.

E

Einzelzeiger-Alternative
Eine Einzelzeiger-Alternative führt eine Ziehfunktion durch Klicks oder Antippen aus, ohne zu verlangen, dass der Zeiger während der Bewegung gedrückt bleibt.
Schaltflächen zum Bewegen ermöglichen einem Touchscreen-Nutzer, einen Eintrag ohne Ziehgeste neu zu positionieren.
Entfernen führender und nachgestellter Leerraumzeichen
Beim Entfernen führender und nachgestellter Leerraumzeichen werden Leerraumzeichen an beiden Enden eines Textes entfernt, bevor eine Regel oder Aktion seinen bedeutsamen Inhalt verwendet.
Die Prüfung name.value.trim() === "" erkennt einen Namen, der ausschließlich aus Leerzeichen besteht.
Ereignis
Ein Ereignis ist ein Signal, das meldet, dass etwas geschehen ist, etwa ein Klick, eine Feldbearbeitung, ein Tastendruck oder der Abschluss des HTML-Parsings.
Ein click-Ereignis lässt die Seite reagieren, wenn eine Person die Weiter-Schaltfläche der Galerie aktiviert.
Ereignisdelegation
Ereignisdelegation verarbeitet Ereignisse mehrerer Nachfahren über einen gemeinsamen Listener an einem Vorfahrenelement, der das relevante Bedienelement ermittelt.
Der einzelne Klick-Listener einer Liste funktioniert weiterhin für neue Schaltflächen zum Entfernen, die später eingefügt werden.
Ereignisobjekt
Ein Ereignisobjekt ist der an einen Listener übergebene Wert, der gemeinsame Ereigniseigenschaften und für die jeweilige Ereignisfamilie spezifische Details enthält.
Ein Tastatur-Listener liest key des empfangenen Ereignisses, um zu entscheiden, ob ein Bereich geschlossen wird.
Ereignisweitergabe
Ereignisweitergabe ist das Durchlaufen des Dokumentbaums durch ein Ereignis, einschließlich des Capturing-Pfads, der Zielphase und eines möglichen Bubbling-Pfads.
Ein einzelner Klick auf eine Schaltfläche kann sowohl von Listenern an der Schaltfläche als auch an ihrer umgebenden Karte beobachtet werden.
Event-Handler-Eigenschaft
Eine Event-Handler-Eigenschaft ist eine Elementeigenschaft wie onclick, die einen Ereignis-Callback enthält und ihn bei einer erneuten Zuweisung ersetzt.
Die Zuweisung einer anderen Funktion an button.onclick ersetzt den früheren Handler dieser Eigenschaft.
Event-Listener
Ein Event-Listener ist eine Funktion, die an einem Ereignisziel registriert wird, damit sie laufen kann, wenn dort ein Ereignis eines bestimmten Typs ausgelöst wird.
Der Listener des Zählers erhöht den gespeicherten Zählerstand jedes Mal, wenn seine Schaltfläche einen Klick erhält.

F

Fehlerübersicht
Eine Fehlerübersicht ist ein Seitenbereich, der Formularprobleme und Links zu ihren Feldern sammelt und nach einem Fehlschlag ein sinnvolles Fokusziel bietet.
Nach einem ungültigen Absendeversuch kann der Nutzer in der fokussierbaren Übersicht wählen, welches Feld er korrigieren möchte.
Fokus
Der Fokus ist der Zustand der Seite, der das Element bezeichnet, das aktuell Tastatureingaben erhält und über document.activeElement verfügbar ist.
Der Aufruf von search.focus() leitet das nächste eingegebene Zeichen in das Suchfeld.
Fokusindikator
Ein Fokusindikator ist eine sichtbare Kennzeichnung des aktuell fokussierten Elements, damit Tastaturnutzer ihre Position auf der Seite erkennen können.
Eine :focus-visible-Umrandung zeigt, welche Schaltfläche der Werkzeugleiste die nächste Tastenaktion erhält.
Fokusmanagement
Fokusmanagement wählt gezielt ein sinnvolles Tastaturziel, wenn Inhalte geöffnet, geschlossen oder entfernt werden oder dem Nutzer Fehler angezeigt werden.
Beim Löschen einer fokussierten Zeile wird der Fokus auf ein Bedienelement einer benachbarten Zeile verschoben, statt die Position zu verlieren.
FormData
FormData ist eine Sammlung geeigneter Name-Wert-Paare eines Formulars, die wiederholte Namen erhalten kann und nicht übermittelte Bedienelemente auslässt.
Wenn mehrere Kontrollkästchen den Namen „topics“ haben, ruft data.getAll("topics") alle ausgewählten Werte gemeinsam ab.
Funktionsreferenz
Eine Funktionsreferenz ist ein Wert, der ein Funktionsobjekt bezeichnet und es Code ermöglicht, diese Funktion zur späteren Verwendung zu übergeben, ohne sie aufzurufen.
Die Übergabe von openPanel registriert die Funktion; die Übergabe von openPanel() ruft sie während der Einrichtung auf.

I

Inaktiver Hintergrund
Ein inaktiver Hintergrund ist Seiteninhalt, der vorübergehend nicht durch gewöhnliche Klicks oder Fokus erreichbar ist, während eine modale Interaktion aktiv ist.
Die Seite hinter einem geöffneten nativen modalen Dialog kann keinen normalen Fokus erhalten, bis der Dialog geschlossen wird.
input-Ereignis
Ein input-Ereignis meldet eine Bearbeitung durch den Nutzer, nachdem sich der Wert eines Bedienelements geändert hat, einschließlich Textbearbeitungen ohne physischen Tastendruck.
Das Einfügen eines Satzes in ein Nachrichtenfeld aktualisiert über dessen input-Listener einen Zähler.

K

key
Die Eigenschaft key meldet den von einer Taste erzeugten Wert unter Berücksichtigung des Tastaturlayouts und von Modifikatortasten wie der Umschalttaste.
Die Umschalttaste kann den key-Wert eines Buchstabens von "a" zu "A" ändern, während seine Position gleich bleibt.
keydown
Ein keydown-Ereignis meldet einen Tastendruck vor dessen normaler Bearbeitungswirkung und kann sich wiederholen, solange die physische Taste gedrückt bleibt.
Der Kurzbefehl prüft bei keydown auf Escape, bevor er den offenen Bereich schließt.

L

Listener-Identität
Die Listener-Identität verbindet Ereignistyp, Callback-Objekt und Capture-Einstellung und bestimmt, ob eine Registrierung doppelt ist oder entfernt wird.
Eine neue Pfeilfunktion kann einen früheren Callback nicht allein deshalb entfernen, weil ihre Rümpfe übereinstimmen.

M

Modaler Dialog
Ein modaler Dialog ist eine Dialoginteraktion, die den Rest der Seite während ihrer Öffnung inaktiv macht und die Nutzerinteraktion auf ihren aktiven Bereich beschränkt.
Der Aufruf von showModal() öffnet den nativen Dialog und setzt den Fokus in seinen Inhalt.
Modifikatortasten-Flag
Ein Modifikatortasten-Flag ist eine boolesche Eigenschaft eines Tastaturereignisses, die angibt, ob während des Ereignisses Umschalt, Strg, Alt oder Meta gedrückt ist.
Der Speicherkurzbefehl akzeptiert entweder ctrlKey oder metaKey zusammen mit dem Buchstaben S.

N

Natives Bedienelement
Ein natives Bedienelement ist ein HTML-Element mit eingebauter Interaktionssemantik und eingebautem Verhalten, etwa eine Schaltfläche, ein Link, ein Kontrollkästchen oder eine Auswahlliste.
Eine gestaltete native Schaltfläche behält ihre Aktivierung mit Enter und Leertaste ohne eigenen Tasten-Listener.
novalidate
Das Formularattribut novalidate überspringt beim Absenden die automatische Constraint-Validierung und lässt Regeln und Validierungsmethoden verfügbar.
Ein benutzerdefinierter Fehlerablauf nutzt novalidate, damit sein submit-Listener jedes Feld selbst prüfen kann.

O

once
Die Listener-Option once veranlasst die automatische Entfernung dieser Registrierung nach ihrem ersten Aufruf für den ausgewählten Ereignistyp.
Ein Willkommensbanner kann once: true für den Klick nutzen, der es für diese Lebensdauer schließt.

P

Passiver Event-Listener
Ein passiver Event-Listener wird mit der Zusicherung registriert, die Standardaktion nicht zu verhindern, sodass der Browser fortfahren kann, ohne auf deren mögliche Verhinderung zu warten.
Ein Aufruf von preventDefault() in einem passiven Berührungs-Listener stoppt das Scrollen des Browsers nicht.
pattern
Das Attribut pattern definiert für unterstützte Textfelder eine Regel als regulären Ausdruck, der zum gesamten Wert passen muss und nur bei nicht leerem Wert angewendet wird.
Ein Muster für fünf Ziffern lehnt sechs Ziffern ab, benötigt aber required, um ein leeres Feld abzulehnen.
pointercancel
Ein pointercancel-Ereignis meldet, dass der Browser die Zeigerinteraktion abgebrochen hat, sodass eine Ziehinteraktion ihren aktiven Zustand löschen muss.
Eine zum Scrollen übernommene Geste kann die benutzerdefinierte Ziehinteraktion durch pointercancel beenden.
pointerId
Die Eigenschaft pointerId bezeichnet während einer Interaktion einen einzelnen Zeiger, sodass gleichzeitige Kontakte getrennt verarbeitet werden können.
Zwei Finger haben unterschiedliche IDs, sodass der Ziehcode nur dem Finger folgen kann, der die Interaktion begonnen hat.
preventDefault
Die Methode preventDefault() verhindert in einem nicht passiven Listener die Standardaktion eines dafür geeigneten Ereignisses, ohne dessen Weitergabe zu stoppen.
Ein submit-Listener ruft preventDefault() auf, bevor er ohne Navigation einen lokalen Eintrag hinzufügt.
Prüfung auf einen Klick außerhalb
Eine Prüfung auf einen Klick außerhalb prüft vor dem Schließen eines aufklappenden Bereichs, ob ein Ereignis außerhalb sowohl dieses Bereichs als auch seines auslösenden Bedienelements begann.
Ein Dokument-Listener, der Klicks auf die Schaltfläche eines Menüs ignoriert, verhindert, dass der öffnende Klick das Menü schließt.

R

relatedTarget
Die Eigenschaft relatedTarget bezeichnet das andere an einem Fokuswechsel beteiligte Element oder ist null, wenn kein solches Element verfügbar ist.
Ein focusout-Listener eines Menüs prüft, ob das Ziel innerhalb des Menüs bleibt.
reportValidity
Die Methode reportValidity() prüft Regeln und fordert den Browser zusätzlich auf, für nicht behandelte Fehler eine Validierungsrückmeldung anzuzeigen.
Eine eigene Prüfschaltfläche ruft reportValidity() auf, um dem Nutzer beim Finden eines ungültigen Feldes zu helfen.
requestSubmit
Die Methode requestSubmit() fordert das Absenden eines Formulars über den normalen Weg mit Validierung und submit-Ereignis an, ohne einen Schaltflächenklick auszulösen.
Eine Werkzeugleiste ruft form.requestSubmit() auf, damit die Validierung und der submit-Listener des Formulars weiterhin laufen.
Roving tabindex
Roving tabindex ist eine Technik zur Gruppennavigation, die einem Element einen normalen Tab-Stopp gibt und diesen Stopp samt Fokus verschiebt, wenn mit Pfeiltasten das Element gewechselt wird.
In einer Werkzeugleiste führt Tab zum aktuellen Element und Pfeiltasten bewegen den Fokus zu benachbarten Bedienelementen.

S

Standardaktion
Eine Standardaktion ist ein vom Browser bereitgestelltes Verhalten, das mit einem Ereignis verbunden ist, etwa einem Link zu folgen, Text einzugeben oder ein Formular abzusenden.
Die Standardaktion des Hilfelinks würde zu seinem Ziel navigieren, sofern der Klick nicht verhindert wird.
stopImmediatePropagation
Die Methode stopImmediatePropagation() stoppt die Ereignisweitergabe und überspringt zusätzlich verbleibende Listener, die am aktuellen Ereignisziel registriert sind.
Wenn der erste Callback diese Methode aufruft, wird ein späterer Callback auf demselben Element übersprungen.
stopPropagation
Die Methode stopPropagation() verhindert, dass ein Ereignis zu weiteren Elementen gelangt, während andere Listener auf seinem aktuellen Element aktiv bleiben.
Eine verschachtelte Aktion kann verhindern, dass ihr Klick den Bubbling-Listener einer umgebenden Karte erreicht.
submit-Ereignis
Ein submit-Ereignis ist ein abbrechbares Formularereignis, das beim normalen Absendeweg ausgelöst wird, nachdem die automatische Validierung das Absenden erlaubt hat.
Der submit-Listener eines Formulars verarbeitet ein gültiges Absenden, indem er lokal einen Eintrag hinzufügt und die Navigation verhindert.
Synchrone Ereignisauslösung
Synchrone Ereignisauslösung bedeutet, dass Listener innerhalb des Aufrufs von dispatchEvent() laufen, bevor die Methode die Kontrolle an den aufrufenden Code zurückgibt.
Eine nach dispatchEvent() ausgegebene Meldung erscheint nach den Meldungen seiner Listener.

T

tabindex
Das Attribut tabindex steuert die Teilnahme an der normalen Tab-Reihenfolge und die Fokussierbarkeit per Code, wobei 0 in der normalen Reihenfolge liegt und −1 außerhalb davon.
Die Fehlerüberschrift nutzt tabindex="-1", damit Code sie fokussieren kann, ohne einen regulären Tab-Stopp hinzuzufügen.
target
Die Eigenschaft target bezeichnet den Ursprung des Ereignisses, der ein verschachteltes Element innerhalb des Bedienelements sein kann, dessen Aktion verarbeitet wird.
Ein Klick auf das Bild innerhalb einer Speichern-Schaltfläche macht das Bild zum target des Klicks.
Tastenbitmaske
Eine Tastenbitmaske stellt die aktuell gedrückten Zeigertasten dar, indem sie numerische Flags in der Eigenschaft buttons des Ereignisses kombiniert.
Das Gedrückthalten der primären und sekundären Taste ergibt buttons 3 und kombiniert damit die Flags 1 und 2.
touch-action
Die CSS-Eigenschaft touch-action legt fest, welche Berührungsgesten des Browsers erlaubt sind, wenn eine Geste auf einem Element beginnt.
Die Verwendung von touch-action: none auf der Ziehfläche reserviert die Bewegung in diesem Bereich für die Ziehinteraktion.

U

Umschaltfläche
Eine Umschaltfläche schaltet einen Aktionszustand ein oder aus und nutzt häufig eine gleichbleibende sichtbare Beschriftung, während aria-pressed den aktuellen Zustand meldet.
Eine Schaltfläche zum Stummschalten behält das Wort „Stummschalten“, während ihr aria-pressed-Wert zwischen wahr und falsch wechselt.

V

ValidityState
Ein ValidityState ist das über die Eigenschaft validity eines Bedienelements bereitgestellte Objekt mit booleschen Flags, die verletzte Regeln bezeichnen.
Eine Mengenangabe kann stepMismatch melden, obwohl sie zwischen Minimum und Maximum liegt.
value
Die Eigenschaft value stellt den aktuellen Wert eines Formularfeldes als Text bereit, auch bei Zahlenfeldern, deren numerischer Inhalt noch umgewandelt werden muss.
Ein Mengenfeld mit "8" benötigt eine Umwandlung, bevor Code einen numerischen Wert addiert.
valueAsNumber
Die Eigenschaft valueAsNumber liest den numerischen Wert eines unterstützten Eingabefeldes direkt und gibt NaN zurück, wenn kein brauchbarer Zahlenwert vorliegt.
Ein leeres Zahlenfeld ergibt NaN, was Code mit Number.isNaN() erkennt.
Viewport-Koordinaten
Viewport-Koordinaten sind Zeigerpositionen, die über clientX und clientY von der linken oberen Ecke des sichtbaren Bereichs aus gemessen werden.
Eine Bewegungsberechnung subtrahiert zwei Client-Koordinaten, ohne das Scrollen der Seite hinzuzufügen.

Z

Zeigerereignis
Ein Zeigerereignis beschreibt die Interaktion mit Zeigegeräten durch eine gemeinsame Ereignisfamilie für Maus-, Berührungs- und Stifteingaben.
Derselbe pointermove-Listener kann Bewegungen einer Maus oder eines Berührungskontakts auslesen.
Zeigererfassung
Die Zeigererfassung leitet nachfolgende Ereignisse eines bestimmten aktiven Zeigers an ein Element, selbst nachdem sich der Zeiger über dessen Begrenzung hinaus bewegt hat.
Eine gezogene Box erfasst den auslösenden Zeiger, damit sie dessen Ereignisse auch bei einer schnellen Bewegung außerhalb ihres Bereichs erhält.
Ziehzustand
Der Ziehzustand umfasst gespeicherte Informationen, die eine aktive Ziehinteraktion sowie ihre anfänglichen Zeigerkoordinaten und die Elementposition bezeichnen.
Während einer Ziehinteraktion vergleicht jede Zeigerbewegung die aktuellen Koordinaten mit dem gespeicherten Start, um eine gezogene Box zu positionieren.
Zielphase
Die Zielphase ist der Teil der Ereignisauslösung am Ursprung des Ereignisses, in dem Capture-Listener vor Listenern ohne Capture laufen.
Beide Listener an der angeklickten Schaltfläche melden während ihres Aufrufs eventPhase 2.
Zugänglicher Name
Ein zugänglicher Name ist der Text, mit dem assistive Technologien ein Bedienelement bezeichnen; er wird durch geeigneten Inhalt, eine Beschriftung oder einen ARIA-Namen bereitgestellt.
Eine Schließen-Schaltfläche, die nur ein Symbol enthält, nutzt aria-label="Close", um die Wirkung des Symbols anzugeben.
Zurücksetzen des Formulars
Das Zurücksetzen eines Formulars stellt die Anfangswerte und Auswahlzustände seiner Bedienelemente wieder her, zu denen auch nicht leere Standardwerte aus dem Markup gehören können.
Nachdem ein Formular einen Eintrag hinzugefügt hat, stellt form.reset() die anfänglichen Feldwerte des Formulars wieder her.
Zusammengesetztes Bedienelement
Ein zusammengesetztes Bedienelement ist eine zusammengehörige Gruppe von Bedienelementen wie Registerkarten oder eine Werkzeugleiste, in der intern mit Pfeiltasten navigiert wird, während Tab hinein- und herausführt.
Die Registerkartengruppe behält einen Tab-Stopp, damit Nutzer die Gruppe passieren können, ohne jede Registerkarte zu besuchen.

Über diese Einheit

Von StudeliFehler melden

Erstelle deine eigenen Lernmaterialien

Mach aus deinen Notizen, Folien und Dokumenten Lernleitfäden, Übungsfragen, Karteikarten und 6 weitere Tools.

Jetzt starten