Signatur
Beschreibung
Das Ereignis loadstart ist das erste Ereignis im Ladezyklus eines HTMLMediaElement (<audio> oder <video>). Es wird ausgelöst, wenn der Browser mit dem Ressourcenauswahl-Algorithmus fertig ist und mit dem Laden beginnt, etwa nach dem Setzen von src, nach dem Aufruf von load() oder beim ersten Parsen des Elements mit preload-Einstellung.
Die typische Reihenfolge ist: loadstart → durationchange → loadedmetadata → loadeddata → progress → canplay → canplaythrough. Deshalb eignet sich loadstart gut, um einen Ladeindikator (Spinner) einzublenden, die Oberfläche eines Players zurückzusetzen oder Ladezeiten zu messen.
Du kannst den Handler per addEventListener("loadstart", handler) oder über die Eigenschaft onloadstart registrieren. Das Ereignis ist ein einfaches Event, es steigt nicht auf (bubbles: false) und lässt sich nicht abbrechen. Zu diesem Zeitpunkt stehen noch keine Metadaten wie duration oder videoWidth bereit.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $type Pflicht | string | Der Ereignisname, hier immer "loadstart". |
|
| $handler Pflicht | (event: Event) => void | Callback, das ein einfaches Event erhält. event.target ist das Medienelement. |
|
| $options | boolean | AddEventListenerOptions | false | Optionen wie once, signal oder capture. Da das Ereignis nicht aufsteigt, brauchst du für Delegation capture: true. |
Beispiele
Ladeindikator beim Start des Ladens einblenden
const video = document.querySelector('video');
const spinner = document.querySelector('.spinner');
video.addEventListener('loadstart', () => {
spinner.hidden = false;
console.log('Laden gestartet:', video.currentSrc || video.src);
});
video.addEventListener('canplay', () => {
spinner.hidden = true;
});
video.src = '/media/intro.mp4';
Ladezeit bis zur Abspielbereitschaft messen
const audio = new Audio();
let startTime = 0;
audio.onloadstart = () => {
startTime = performance.now();
};
audio.oncanplaythrough = () => {
const dauer = Math.round(performance.now() - startTime);
console.log(`Abspielbereit nach ${dauer} ms`);
};
audio.src = '/media/podcast.mp3';
audio.preload = 'auto';
Listener mit AbortController wieder entfernen
const video = document.querySelector('video');
const controller = new AbortController();
const onLoadStart = (event) => {
console.log('loadstart für', event.target.id);
};
video.addEventListener('loadstart', onLoadStart, { signal: controller.signal });
// Später, z. B. beim Zerstören der Player-Komponente:
controller.abort();
// Alternativ: video.removeEventListener('loadstart', onLoadStart);
// oder bei on-Property: video.onloadstart = null;
Delegation per Capture für mehrere Player
// loadstart steigt nicht auf – daher capture: true
document.addEventListener('loadstart', (event) => {
if (event.target instanceof HTMLMediaElement) {
event.target.closest('.player')?.classList.add('is-loading');
}
}, true);
// Wichtig · Fallstricke
- Kein Bubbling:
loadstartsteigt nicht auf. Ein Listener auf einem übergeordneten Element greift nur mitcapture: true. - Listener früh registrieren: Bei Elementen im HTML mit
srckann das Ereignis schon feuern, bevor dein Skript läuft. Registriere den Listener vor dem Setzen vonsrcoder prüfe zusätzlichnetworkStatebzw.readyState. - Mehrfaches Auslösen: Jeder Wechsel von
srcund jeder Aufruf vonload()löst erneutloadstartaus. Zuvor kannemptiedoderabortkommen. - Keine Metadaten:
durationist hier nochNaN,videoWidthist0. Für diese Werte brauchst duloadedmetadata. - preload="none": Einige Browser (vor allem mobile Safari) laden erst bei einer Nutzeraktion. Dann kommt
loadstartmöglicherweise erst beim Abspielen. - Nicht verwechseln mit
XMLHttpRequest/FileReader: Dort heißt das Ereignisloadstartebenfalls, ist aber einProgressEvent. - Kompatibilität: Das Ereignis wird von allen modernen Browsern unterstützt.