THM Notes
WebP 1
VorlesungSoSe 26TypeScriptDOMquerySelectorEventsaddEventListenerinnerHTML

WebP 1 – DOM-Zugriff und Events

26. Mai 2026WebP 1

Zusammenfassung

TypeScript wurde entwickelt, um Webseiten interaktiv zu machen. Die Verbindung zwischen TypeScript und HTML geschieht über den DOM (Document Object Model). Über das globale document-Objekt kann TypeScript auf einzelne HTML-Elemente zugreifen, deren Inhalt verändern, Klassen hinzufügen oder entfernen und auf Events reagieren (Klicks, Formulareingaben, Seitenladen). Diese Verbindung nennt das Skript Schnittstellen — TypeScript und HTML kommunizieren über den DOM miteinander.

Schlüsselbegriffe

document

Das globale TypeScript-Objekt, das den DOM repräsentiert. Es entspricht dem <html>-Element als Wurzel des Baums. Über document kann auf alle HTML-Elemente zugegriffen werden.

querySelector

Methode des document-Objekts, die ein einzelnes HTML-Element anhand eines CSS-Selektors auswählt. Beispiel: document.querySelector('#submitForm') wählt das Element mit id='submitForm'.

innerText

Attribut von HTML-Elementen, das den sichtbaren Textinhalt enthält (ohne HTML-Tags). Kann gelesen und geschrieben werden.

innerHTML

Ähnlich wie innerText, enthält aber den vollständigen HTML-Code zwischen öffnendem und schließendem Tag (inklusive HTML-Tags).

value

Attribut von Input-Elementen, das den aktuellen Inhalt des Eingabefelds enthält. Über value.value kann man lesen, was der Nutzer eingegeben hat.

addEventListener

Methode zum Registrieren eines Eventhandlers an einem HTML-Element. Syntax: element.addEventListener('eventname', (event) => { ... }). Die Callback-Funktion wird aufgerufen, wenn das Event eintritt.

Event

Ein Ereignis, das im Browser auftritt — z. B. ein Klick, Tastendruck, Scrollen oder das Laden der Seite. TypeScript kann auf Events reagieren, indem Eventhandler mit addEventListener registriert werden.

DOMContentLoaded

Ein Event des document-Objekts, das ausgelöst wird, sobald das HTML vollständig geparst und der DOM-Baum aufgebaut ist. Erst dann können Elemente sicher selektiert werden.

event.preventDefault()

Methode auf dem Event-Objekt, die das Standardverhalten des Browsers unterbindet. Bei Formularen verhindert es das automatische Neuladen der Seite beim Absenden.

querySelectorAll

Eine Methode des document-Objekts, die eine statische NodeList aller Elemente zurückgibt, die dem angegebenen CSS-Selektor entsprechen.

Event-Target

Das DOM-Element, auf dem das Ereignis ursprünglich ausgelöst wurde. Kann im Eventhandler über event.target ausgelesen werden.

Kernkonzepte

Elemente auswählen

TypeScript greift über das document-Objekt auf den DOM zu. querySelector wählt ein Element anhand eines CSS-Selektors:
// Mit ID-Selektor (#):
const submitForm: HTMLFormElement = document.querySelector('#submitForm');
 
// Mit Name-Attribut innerhalb eines Formulars:
const inputName: HTMLInputElement = document.querySelector('#submitForm[name="fullname"]');
 
// Mit Element-Selektor (erstes h1-Element):
const headline: HTMLElement = document.querySelector('h1');
 
// Alternativ (ältere Methode, nur für IDs):
const element = document.getElementById('submitForm');
Klausurrelevant
querySelector gibt null zurück, wenn kein passendes Element gefunden wird. Vor dem Zugriff auf Attribute oder Methoden sollte immer geprüft werden, ob das Element existiert: if (element) { ... }.

Elemente verändern

innerText und innerHTML

const headline: HTMLElement = document.querySelector('h1');
 
// innerText: Nur Text, keine HTML-Interpretation
headline.innerText = "Neue Überschrift";
 
// innerHTML: Mit HTML-Tags (Vorsicht bei Nutzereingaben!)
headline.innerHTML = "Neue <strong>Überschrift</strong>";
// → Das Wort "Überschrift" wird fettgedruckt angezeigt
Achtung
innerHTML interpretiert HTML-Tags im Text. Wenn man Nutzereingaben direkt in innerHTML schreibt, können Angreifer schädlichen Code einschleusen (Cross-Site-Scripting, XSS). Für reine Textausgaben immer innerText verwenden.

value bei Input-Elementen

const inputName: HTMLInputElement = document.querySelector('#submitForm[name="fullname"]');
 
// Wert lesen (was der Nutzer eingegeben hat):
const name: string = inputName.value;
 
// Wert schreiben (Feld vorausfüllen):
inputName.value = "Max Muster";

Klassen manipulieren

const box: HTMLElement = document.querySelector('.box');
 
box.classList.add("aktiv");          // Klasse hinzufügen
box.classList.remove("versteckt");   // Klasse entfernen
box.classList.toggle("dunkel");      // Hinzufügen falls nicht vorhanden, entfernen falls vorhanden
box.classList.contains("aktiv");     // Prüfen ob Klasse vorhanden (gibt boolean zurück)
classList.toggle ist besonders nützlich für Darkmode-Schalter oder aufklappbare Menüs.

style.display

Elemente können direkt ein- und ausgeblendet werden:
element.style.display = "none";    // Verstecken
element.style.display = "block";   // Zeigen
Tipp
Besser ist es, CSS-Klassen zu togglen (.classList.toggle("versteckt")), als Inline-Styles zu setzen. CSS-Regeln sind leichter wartbar und können im Stylesheet zentralisiert werden.

Events und Eventhandler

Webentwicklung ist event-getrieben: Fast alles, was passiert, wird durch ein Event ausgelöst. Ein Eventhandler ist eine Funktion, die auf ein bestimmtes Event reagiert.
Eventhandler registrieren:
const submitForm: HTMLFormElement = document.querySelector('#submitForm');
const inputName: HTMLInputElement = document.querySelector('#submitForm[name="fullname"]');
const headline: HTMLElement = document.querySelector('h1');
 
submitForm.addEventListener('submit', (event) => {
  event.preventDefault();                            // Kein Neuladen der Seite!
  const name: string = inputName.value;
  headline.innerText = `Willkommen ${name}`;
});
Jeder Eventhandler besteht aus drei Teilen:
  • Was: Das Event-Typ ('submit', 'click', 'DOMContentLoaded')
  • Wo: Das HTML-Element, an dem der Handler registriert ist (submitForm)
  • Wie: Die Callback-Funktion, die ausgeführt wird ((event) => { ... })

Wichtige Event-Typen

EventTritt auf bei
'click'Mausklick auf ein Element
'submit'Absenden eines Formulars
'DOMContentLoaded'HTML vollständig geladen und DOM bereit
'mouseover'Maus bewegt sich auf ein Element
'keydown'Tastendruck
'scroll'Scrollen der Seite

DOMContentLoaded — sicherer Start

TypeScript-Code greift auf DOM-Elemente zu. Diese existieren erst, wenn das HTML vollständig geparst wurde. Deshalb sollte TypeScript-Code, der den DOM manipuliert, erst nach dem DOMContentLoaded-Event ausgeführt werden:
document.addEventListener('DOMContentLoaded', () => {
  // Erst jetzt sind alle HTML-Elemente verfügbar
  const button: HTMLElement = document.querySelector('#meinButton');
 
  button.addEventListener('click', () => {
    button.innerText = "Geklickt!";
  });
});
Info
Als Alternative zu DOMContentLoaded kann man das <script>-Tag im HTML mit dem Attribut defer versehen: <script src="mein.js" defer></script>. Das hat denselben Effekt — das Skript wird erst nach dem Parsen des HTML ausgeführt.

event.preventDefault() beim Submit-Event

Wenn ein Formular abgesendet wird, lädt der Browser von sich aus die Seite neu. Das ist historisch so und heute meist unerwünscht. event.preventDefault() verhindert dieses Standardverhalten:
formular.addEventListener('submit', (event) => {
  event.preventDefault();  // Kein Seiten-Reload!
  // Jetzt kann TypeScript die Eingaben verarbeiten
});

Event-Bubbling

Events steigen im DOM-Baum nach oben — von Kind zu Elternelement. Ein Klick auf einen <span> innerhalb eines <button> löst zuerst das Click-Event des <span> aus, dann das des <button>, dann des <div> usw. bis zum document.
Das nennt man Event-Bubbling. Es ist meist gewünscht (ein Handler am Container fängt alle Kind-Events ab), kann aber mit event.stopPropagation() unterbrochen werden.

Vollständiges Beispiel

document.addEventListener('DOMContentLoaded', () => {
  const form: HTMLFormElement = document.querySelector('#registrierungsformular');
  const inputName: HTMLInputElement = document.querySelector('#name');
  const inputEmail: HTMLInputElement = document.querySelector('#email');
  const meldung: HTMLElement = document.querySelector('#meldung');
 
  form.addEventListener('submit', (event) => {
    event.preventDefault();
 
    const name: string = inputName.value;
    const email: string = inputEmail.value;
 
    if (name === "" || email === "") {
      meldung.innerText = "Bitte alle Felder ausfüllen!";
      meldung.classList.add("fehler");
    } else {
      meldung.innerText = `Willkommen, ${name}! Registrierung erfolgreich.`;
      meldung.classList.remove("fehler");
    }
  });
});

Lernkarten

Frage

Was macht document.querySelector('#meinButton')?

Antwort

Es sucht im DOM nach dem ersten Element mit id='meinButton' und gibt es zurück. Wird kein Element gefunden, gibt querySelector null zurück. Der Parameter ist ein CSS-Selektor — also # für IDs, . für Klassen.

Frage

Was ist der Unterschied zwischen innerText und innerHTML?

Antwort

innerText gibt den reinen Textinhalt zurück (ohne HTML-Tags). innerHTML gibt den vollständigen HTML-Code-Inhalt zurück (inklusive Tags). Bei der Ausgabe von Nutzereingaben immer innerText verwenden, um XSS-Angriffe zu vermeiden.

Frage

Wozu dient event.preventDefault() beim Submit-Event?

Antwort

Formulare laden beim Absenden von sich aus die Seite neu. preventDefault() verhindert dieses Standardverhalten. So kann TypeScript die Formulardaten verarbeiten, ohne dass die Seite neu geladen wird.

Frage

Was ist Event-Bubbling?

Antwort

Events steigen im DOM-Baum nach oben: Ein Klick auf ein Kind-Element löst auch das Klick-Event aller Elternelemente aus. Das kann mit event.stopPropagation() unterbrochen werden.

Frage

Wann soll der DOMContentLoaded-Event verwendet werden?

Antwort

TypeScript-Code, der auf DOM-Elemente zugreift, muss warten, bis der DOM vollständig aufgebaut ist. DOMContentLoaded wird ausgelöst, sobald das HTML vollständig geparst wurde. Alternative: script-Tag mit dem defer-Attribut.

Frage

Was ist der Unterschied zwischen document.querySelector und document.querySelectorAll?

Antwort

querySelector liefert nur das erste gefundene Element zurück. querySelectorAll gibt eine Liste (NodeList) aller passenden Elemente zurück.

Frage

Wie kann man verhindern, dass ein Event im DOM-Baum weiter nach oben steigt (Event-Bubbling)?

Antwort

Indem man innerhalb des Eventhandlers die Methode event.stopPropagation() aufruft.

Übungsfragen

Welcher querySelector-Aufruf wählt ein Element mit id='navigation' aus?

Was gibt inputElement.value zurück?

Was macht classList.toggle('aktiv') an einem Element?

Welche Eigenschaft verwendet man, um den CSS-Stil display direkt im Code auf none zu setzen?