Signatur
Beschreibung
Das Ereignis loadeddata tritt auf, wenn das Medienelement die Daten für die aktuelle Wiedergabeposition geladen hat. Dabei wechselt readyState erstmals auf mindestens HAVE_CURRENT_DATA (Wert 2). Bei einem Video ist das in der Regel der erste Frame, der sich jetzt anzeigen oder auf ein <canvas> zeichnen lässt.
Innerhalb der Ladeereignisse steht loadeddata nach loadstart, durationchange und loadedmetadata, aber vor canplay und canplaythrough. Deshalb eignet es sich gut, um Vorschaubilder (Thumbnails) zu erzeugen, einen Ladeindikator auszublenden oder Bedienelemente freizuschalten, die ein sichtbares Bild brauchen.
Sie können einen Handler mit addEventListener("loadeddata", handler) registrieren oder über die Eigenschaft onloadeddata zuweisen. Das Ereignis steigt nicht im DOM auf (bubbles: false) und lässt sich nicht abbrechen. Ein Listener muss deshalb direkt am Medienelement hängen, oder Sie fangen das Ereignis in der Capture-Phase ab.
loadeddata bedeutet nicht, dass genug Daten für eine flüssige Wiedergabe vorhanden sind. Dafür sind canplay bzw. canplaythrough zuständig.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $type Pflicht | string | Der Ereignisname "loadeddata". |
|
| $handler Pflicht | (event: Event) => void | Callback, das ein normales Event-Objekt erhält. event.target ist das auslösende HTMLMediaElement. |
|
| $options | boolean | AddEventListenerOptions | false | Optionen wie { once: true }, capture oder signal (zum Entfernen über einen AbortController). |
Rückgabewert
addEventListener gibt nichts zurück. Der Handler erhält ein Event ohne zusätzliche Eigenschaften.Beispiele
Ladeindikator ausblenden, sobald der erste Frame da ist
const video = document.querySelector('#player');
const spinner = document.querySelector('.spinner');
const onLoadedData = (event) => {
const media = event.target;
console.log('readyState:', media.readyState);
spinner.hidden = true;
};
video.addEventListener('loadeddata', onLoadedData);
// Später, z. B. beim Abbauen der Komponente:
// video.removeEventListener('loadeddata', onLoadedData);
Vorschaubild aus dem ersten Frame erzeugen
const createThumbnail = (src) => new Promise((resolve, reject) => {
const video = document.createElement('video');
video.muted = true;
video.preload = 'auto';
video.crossOrigin = 'anonymous'; // nötig für fremde Quellen mit CORS
video.src = src;
video.addEventListener('loadeddata', () => {
const canvas = document.createElement('canvas');
canvas.width = video.videoWidth;
canvas.height = video.videoHeight;
canvas.getContext('2d').drawImage(video, 0, 0);
resolve(canvas.toDataURL('image/jpeg', 0.8));
}, { once: true });
video.addEventListener('error', () => reject(video.error), { once: true });
});
const dataUrl = await createThumbnail('/media/clip.mp4');
document.querySelector('#thumb').src = dataUrl;
console.log(dataUrl.slice(0, 23));
Zuweisung über die Eigenschaft onloadeddata
const audio = new Audio('/media/podcast.mp3');
audio.onloadeddata = () => {
console.log(`Dauer: ${audio.duration.toFixed(1)} s – bereit für Anzeige`);
};
// Handler wieder entfernen:
// audio.onloadeddata = null;
Race-Condition vermeiden: prüfen, ob die Daten schon geladen sind
const whenDataLoaded = (media) => new Promise((resolve) => {
if (media.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA) {
resolve(media); // Ereignis ist bereits vorbei
} else {
media.addEventListener('loadeddata', () => resolve(media), { once: true });
}
});
const video = document.querySelector('video');
await whenDataLoaded(video);
console.log('Erster Frame verfügbar');
// Wichtig · Fallstricke
- Späte Registrierung: Wenn der Listener erst nach dem Laden angehängt wird, verpasst er das Ereignis. Prüfen Sie deshalb vorher
readyState >= 2(siehe Beispiel 4). - Kein Bubbling:
document.addEventListener('loadeddata', …)reagiert nur mitcapture: true. - Mobile Browser und
preload: Safari auf iOS und viele Android-Browser laden beipreload="none"oderpreload="metadata"ohne Nutzerinteraktion keine Framedaten. Dann feuertloadeddataerst nachplay()oderload(). - Canvas und CORS: Wenn Sie Frames aus fremden Quellen ohne passenden CORS-Header (und ohne
crossOrigin) zeichnen, wird das Canvas „tainted“.toDataURL()bzw.getImageData()werfen dann einenSecurityError. - Mehrfaches Auslösen: Bei einem Wechsel von
srcoder einem Aufruf vonload()kann das Ereignis erneut feuern. Nutzen Sie{ once: true }, wenn Sie nur einmal reagieren wollen. - Schwarzer Frame: Manche Browser liefern bei
loadeddataeinen noch nicht dekodierten oder schwarzen Frame. Als robustere Alternative für Thumbnails bietet sichcurrentTime = 0.1mit dem EreignisseekedoderrequestVideoFrameCallback()an. - Das Ereignis wird von allen modernen Browsern unterstützt (Baseline).