Signatur
Beschreibung
Das error-Ereignis tritt auf Elementen auf, die eine externe Ressource laden, etwa <img>, <script>, <link>, <iframe> (eingeschränkt), <video>/<audio> (über <source> bzw. media.error) oder <object>. Ausgelöst wird es, wenn der Ladevorgang fehlschlägt (Netzwerkfehler, HTTP-404, CORS-Ablehnung) oder die Ressource zwar geladen wurde, aber nicht nutzbar ist (z. B. kaputtes Bildformat).
Registrieren lässt sich ein Handler per element.addEventListener("error", handler) oder über die Eigenschaft element.onerror = handler. Das Ereignis ist ein einfaches Event (kein ErrorEvent), bubbelt nicht und ist nicht abbrechbar. Wer Ladefehler zentral abfangen will, muss den Listener daher in der Capture-Phase auf window oder document registrieren.
Typische Anwendungsfälle sind Ersatzbilder (Fallback) für defekte Bild-URLs, das Nachladen eines Skripts von einem alternativen CDN, Fehler-Monitoring (Tracking fehlgeschlagener Ressourcen) sowie das saubere Zurücksetzen einer Lade-Anzeige.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $type Pflicht | string | Der Ereignistyp, hier "error". |
|
| $handler Pflicht | (event: Event) => void | Callback, der ein einfaches Event-Objekt erhält; event.target ist das betroffene Element. |
|
| $options | boolean | AddEventListenerOptions | false | Optionen wie capture, once oder signal. Für zentrale Überwachung { capture: true } verwenden, da das Ereignis nicht bubbelt. |
Rückgabewert
addEventListener liefert nichts zurück. Der Handler erhält ein Event mit type === "error".Beispiele
Ersatzbild bei defekter Bild-URL (addEventListener)
const img = document.createElement('img');
img.addEventListener('error', () => {
console.warn(`Bild nicht ladbar: ${img.src}`);
img.src = '/images/platzhalter.png';
}, { once: true }); // once verhindert Endlosschleife, falls auch der Platzhalter fehlt
img.src = '/images/gibt-es-nicht.jpg';
document.body.append(img);
Skript mit CDN-Fallback per onerror-Eigenschaft
const loadScript = (src) => new Promise((resolve, reject) => {
const script = document.createElement('script');
script.src = src;
script.onload = () => resolve(src);
script.onerror = () => {
script.remove();
reject(new Error(`Laden fehlgeschlagen: ${src}`));
};
document.head.append(script);
});
const init = async () => {
try {
await loadScript('https://cdn-a.example.com/lib.js');
} catch (err) {
console.warn(err.message);
await loadScript('/vendor/lib.js'); // lokaler Fallback
}
console.log('Bibliothek bereit');
};
init();
Zentrales Monitoring aller Ressourcenfehler (Capture-Phase)
const onResourceError = (event) => {
const el = event.target;
if (el instanceof HTMLElement) {
const url = el.src || el.href || '(unbekannt)';
console.error(`Ressourcenfehler <${el.tagName.toLowerCase()}>: ${url}`);
// navigator.sendBeacon('/log', JSON.stringify({ url }));
}
};
// capture: true ist nötig, weil error nicht bubbelt
window.addEventListener('error', onResourceError, true);
// Später wieder entfernen – gleiche capture-Angabe verwenden!
const stopMonitoring = () => window.removeEventListener('error', onResourceError, true);
// Wichtig · Fallstricke
- Kein Bubbling: Ein Listener auf
documentoderwindowohnecapture: trueerfasst Ressourcenfehler von Elementen nicht.window.onerror(für JS-Laufzeitfehler, mitErrorEvent) ist ein anderes Ereignis. - Keine Fehlerdetails: Aus Sicherheitsgründen gibt es weder HTTP-Status noch Meldung. Wer Details braucht, prüft die URL separat mit
fetch()oder nutzt die Resource Timing API. - Endlosschleifen: Setzt der Handler ein Ersatzbild, das ebenfalls fehlt, löst dies erneut
erroraus. Abhilfe:{ once: true }oderimg.onerror = nullvor dem Umsetzen vonsrc. - Handler früh registrieren: Den Listener vor dem Setzen von
srcanhängen; bei bereits im HTML stehenden Elementen kann der Fehler vor Ausführung des Skripts passiert sein – dannimg.complete && img.naturalWidth === 0prüfen. - Medien: Bei
<video>/<audio>mit<source>-Kindern feuerterrorauf dem jeweiligen<source>; Details liefertmedia.error(MediaError). - iframe: Zuverlässige
error-Ereignisse gibt es bei<iframe>praktisch nicht; eine 404-Seite lädt aus Browsersicht „erfolgreich“. - Sicherheit: Inline-Attribute wie
<img onerror=\"...\">sind ein klassischer XSS-Vektor, wenn nutzergenerierte Inhalte perinnerHTMLeingefügt werden. Inline-Handler werden zudem durch eine strikte CSP (ohne'unsafe-inline') blockiert – besseraddEventListenerverwenden. - Browser-Kompatibilität: in allen modernen Browsern seit langem unterstützt.