Signatur
Beschreibung
Das Ereignis suspend wird an einem <audio>- oder <video>-Element ausgelöst, wenn der Browser das Herunterladen von Mediendaten absichtlich anhält. Das ist kein Fehler. Typische Gründe: Es ist schon genug für die Wiedergabe gepuffert, das Attribut preload="metadata" oder preload="none" begrenzt das Vorladen, oder der Browser spart auf mobilen Geräten Bandbreite und Akku.
Zum Zeitpunkt des Ereignisses hat networkState meist den Wert HTMLMediaElement.NETWORK_IDLE (1). Die Ressource ist gewählt, wird aber gerade nicht geladen. Sobald wieder Daten gebraucht werden, zum Beispiel durch play() oder einen Sprung mit currentTime, lädt der Browser weiter und löst erneut progress-Ereignisse aus.
Das Ereignis lässt sich nicht abbrechen und steigt nicht im DOM auf (bubbles ist false). Du kannst es mit addEventListener("suspend", …) oder über die Eigenschaft onsuspend abfangen. Nützlich ist es für Lade-Anzeigen, zur Fehlersuche beim Puffern oder um eine Lade-Animation auszublenden, wenn der Browser das Vorladen beendet hat.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $type Pflicht | string | Der Ereignisname, hier immer "suspend". |
|
| $handler Pflicht | (event: Event) => void | Die Callback-Funktion. Sie erhält ein normales Event-Objekt ohne zusätzliche Eigenschaften. Das Medienelement bekommst du über event.target. |
|
| $options | boolean | AddEventListenerOptions | false | Optionale Einstellungen wie once, signal oder capture. |
Rückgabewert
addEventListener gibt nichts zurück. Der Handler bekommt ein Event, das nicht abbrechbar ist und nicht aufsteigt.Beispiele
Unterbrochenes Laden protokollieren
const video = document.querySelector('video');
video.addEventListener('suspend', (event) => {
const el = event.target;
const gepuffert = el.buffered.length
? el.buffered.end(el.buffered.length - 1).toFixed(1)
: '0';
console.log(`Laden pausiert – gepuffert bis ${gepuffert}s, networkState: ${el.networkState}`);
});
Lade-Anzeige mit der Eigenschaft onsuspend ausblenden
const audio = document.querySelector('audio');
const spinner = document.querySelector('#spinner');
audio.addEventListener('loadstart', () => {
spinner.hidden = false;
});
// Alternative zu addEventListener: nur ein Handler möglich
audio.onsuspend = () => {
spinner.hidden = true;
console.log('Browser lädt vorerst nicht weiter.');
};
Listener mit AbortController wieder entfernen
const video = document.createElement('video');
video.preload = 'metadata';
video.src = 'https://example.com/film.mp4';
const controller = new AbortController();
const onSuspend = () => console.log('Nur Metadaten geladen, Download pausiert');
video.addEventListener('suspend', onSuspend, { signal: controller.signal });
// Später, z. B. beim Entfernen der Komponente:
video.addEventListener('loadedmetadata', () => {
controller.abort(); // entspricht removeEventListener('suspend', onSuspend)
}, { once: true });
document.body.append(video);
// Wichtig · Fallstricke
- Kein Fehlerzeichen:
suspendheißt nicht, dass etwas schiefgegangen ist. Für echte Probleme sindstalled(Daten kommen unerwartet nicht an),errorundabortzuständig. - Uneinheitliches Verhalten: Wann und wie oft das Ereignis kommt, hängt vom Browser ab. Manche Browser lösen es mehrmals aus, manche bei vollständig gepufferten oder kleinen Dateien sofort nach
loadedmetadata. Baue keine Programmlogik, die sich auf eine feste Reihenfolge verlässt. - Mobile Geräte: iOS Safari und Chrome für Android laden oft erst nach einer Nutzeraktion. Dann kommt
suspendschon früh, auch beipreload="auto". - Das Ereignis steigt nicht auf. Ein Listener an einem Elternelement bekommt es also nur mit
{ capture: true }mit. - Die Unterstützung ist in allen modernen Browsern seit Jahren stabil vorhanden.