Signatur
Beschreibung
Event.target verweist auf das Objekt, das das Ereignis ausgelöst hat. Bei einem Klick ist das also das innerste Element unter dem Mauszeiger, auch wenn der Listener weiter oben im DOM-Baum hängt. Der Wert bleibt während der gesamten Weiterleitung des Ereignisses (Capturing, Target- und Bubbling-Phase) gleich.
Wichtig ist der Unterschied zu Event.currentTarget: currentTarget ist das Element, an dem der gerade ausgeführte Listener registriert ist, target dagegen der eigentliche Auslöser. Diese Unterscheidung ist die Grundlage der Ereignisdelegation: Man registriert einen einzigen Listener auf einem Container und wertet über event.target aus, welches Kind-Element betroffen war. Das spart Listener und funktioniert auch für Elemente, die erst später dynamisch eingefügt werden.
Da target vom Typ EventTarget ist, kann es neben Elementen auch window, document, ein XMLHttpRequest, ein WebSocket oder ein beliebiges eigenes EventTarget-Objekt sein. Bei DOM-Ereignissen ist es oft ein Textknoten-freies Element, kann aber ein verschachteltes Kind wie <span> oder <svg> sein, weshalb man in der Praxis häufig closest() einsetzt.
Rückgabewert
Element. Ist null, solange ein mit new Event() erzeugtes Ereignis noch nicht versendet wurde.Beispiele
target vs. currentTarget beim Klick
// HTML: <div id="box"><button id="btn"><span>OK</span></button></div>
const box = document.querySelector('#box');
box.addEventListener('click', (event) => {
console.log('target:', event.target.tagName);
console.log('currentTarget:', event.currentTarget.id);
});
// Klick auf den Text "OK"
Ereignisdelegation in einer Liste mit closest()
// HTML: <ul id="todos"><li data-id="1">Einkaufen <button class="delete">✕</button></li></ul>
const list = document.querySelector('#todos');
list.addEventListener('click', (event) => {
// Auch Klicks auf verschachtelte Kinder des Buttons erfassen
const button = event.target.closest('button.delete');
if (!button || !list.contains(button)) return;
const item = button.closest('li');
console.log(`Lösche Eintrag ${item.dataset.id}`);
item.remove();
});
// Funktioniert auch für später eingefügte Einträge
list.insertAdjacentHTML('beforeend', '<li data-id="2">Putzen <button class="delete">✕</button></li>');
Formularfelder generisch auswerten
// HTML: <form id="profil"><input name="vorname"><input name="nachname"></form>
const form = document.querySelector('#profil');
const daten = {};
form.addEventListener('input', (event) => {
const { name, value } = event.target;
daten[name] = value;
console.log(daten);
});
target bei eigenen EventTarget-Objekten
const bus = new EventTarget();
const event = new Event('ping');
console.log(event.target); // vor dem Versenden
bus.addEventListener('ping', (e) => {
console.log(e.target === bus);
});
bus.dispatchEvent(event);
// Wichtig · Fallstricke
- Nicht mit
currentTargetverwechseln: Bei verschachteltem Markup (z. B. Icon im Button) lieferttargetdas innere Element. Wer das Element mit dem Listener braucht, nutztevent.currentTargetoderevent.target.closest(...). - Shadow DOM: Ereignisse aus einem Shadow-Tree werden beim Verlassen retargeted. Außerhalb zeigt
targetauf den Shadow-Host, nicht auf das innere Element. Den echten Pfad liefertevent.composedPath()(beimode: 'closed'nur eingeschränkt). - Typprüfung:
targetist nicht zwingend einElement. Es kann auchwindow,documentoder ein Textknoten sein, etwa bei manchen Selektions- oder Drag-Ereignissen in älteren Browsern. Vor dem Aufruf vonclosest()odermatches()mitevent.target instanceof Elementabsichern. In TypeScript ist deshalb ein Cast nötig. - Asynchroner Zugriff:
targetbleibt nach dem Versenden erhalten,currentTargetwird dagegen aufnullgesetzt. InsetTimeout- oderawait-Fortsetzungen ist deshalb nurtargetverlässlich. Event.srcElementist ein veralteter, nicht standardkonformer Alias aus dem alten Internet Explorer. Stattdessen immertargetverwenden.- Die Eigenschaft ist schreibgeschützt. Zuweisungen werden stillschweigend ignoriert, im Strict Mode lösen sie einen
TypeErroraus.