Signatur
Beschreibung
Das Ereignis loadstart ist das erste Fortschrittsereignis eines FileReader. Es tritt direkt nach dem Aufruf von readAsText(), readAsDataURL(), readAsArrayBuffer() oder readAsBinaryString() ein. Zu diesem Zeitpunkt hat readyState den Wert 1 (LOADING) und result ist noch null.
Den Handler registrierst du entweder mit addEventListener("loadstart", handler) oder über die Eigenschaft onloadstart. Das Ereignisobjekt ist ein ProgressEvent mit den Eigenschaften loaded (meist 0), total und lengthComputable.
Typischerweise nutzt man loadstart, um die Oberfläche auf den Ladezustand vorzubereiten, also zum Beispiel einen Spinner oder Fortschrittsbalken einzublenden, Schaltflächen zu sperren oder die Startzeit zu protokollieren. Die Ereignisse laufen in dieser Reihenfolge ab: loadstart → progress (0‑mal oder öfter) → load / error / abort → loadend.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $type Pflicht | string | Name des Ereignisses, hier "loadstart". |
|
| $handler Pflicht | (event: ProgressEvent<FileReader>) => void | Callback, das beim Start des Lesevorgangs ein ProgressEvent erhält. event.target ist der FileReader. |
|
| $options | boolean | AddEventListenerOptions | false | Optionale Listener-Optionen wie once oder signal. |
Rückgabewert
addEventListener gibt nichts zurück. Der Handler bekommt ein ProgressEvent übergeben.Beispiele
Ladeanzeige mit addEventListener einblenden
const input = document.querySelector('#datei');
const status = document.querySelector('#status');
input.addEventListener('change', () => {
const file = input.files[0];
if (!file) return;
const reader = new FileReader();
reader.addEventListener('loadstart', (event) => {
status.textContent = `Lese ${file.name} …`;
console.log('readyState:', reader.readyState, 'total:', event.total);
});
reader.addEventListener('loadend', () => {
status.textContent = 'Fertig';
});
reader.readAsText(file);
});
Über die Eigenschaft onloadstart und Entfernen des Listeners
const blob = new Blob(['Hallo Welt'], { type: 'text/plain' });
const reader = new FileReader();
const onStart = () => console.log('Lesen gestartet');
// Variante 1: on-Eigenschaft
reader.onloadstart = () => console.log('onloadstart ausgelöst');
// Variante 2: Listener hinzufügen und wieder entfernen
reader.addEventListener('loadstart', onStart);
reader.removeEventListener('loadstart', onStart);
reader.onload = () => console.log('Ergebnis:', reader.result);
reader.readAsText(blob);
Ereignisreihenfolge und Dauer messen
const readFile = (blob) => new Promise((resolve, reject) => {
const reader = new FileReader();
let start;
reader.addEventListener('loadstart', () => {
start = performance.now();
console.log('loadstart');
});
reader.addEventListener('progress', (e) => {
if (e.lengthComputable) console.log(`progress ${Math.round(e.loaded / e.total * 100)} %`);
});
reader.addEventListener('load', () => resolve(reader.result));
reader.addEventListener('error', () => reject(reader.error));
reader.addEventListener('loadend', () => {
console.log(`loadend nach ${(performance.now() - start).toFixed(1)} ms`);
});
reader.readAsArrayBuffer(blob);
});
const buffer = await readFile(new Blob([new Uint8Array(1024)]));
console.log('Bytes:', buffer.byteLength);
// Wichtig · Fallstricke
- Listener vor dem Lesen registrieren: Das Ereignis wird asynchron ausgelöst, trotzdem sollte der Handler vor dem Aufruf von
readAs…()gesetzt werden, damit er sicher nicht verpasst wird. - Innerhalb von
loadstartistreader.resultimmernull. Auf das Ergebnis greifst du erst inloadoderloadendzu. - Ruft man auf einem
FileReader, der gerade liest (readyState === 1), erneutreadAs…()auf, wirft der Browser einenInvalidStateError. In diesem Fall wird kein zweitesloadstartausgelöst. reader.abort()ist auch direkt imloadstart-Handler erlaubt. Danach folgenabortundloadend.- Bei kleinen Dateien folgen
loadstartundloadendfast sofort aufeinander. Ein Spinner blitzt dann nur kurz auf, deshalb lohnt sich eventuell eine kleine Verzögerung vor dem Einblenden. - Kompatibilität: Das Ereignis wird von allen modernen Browsern unterstützt und steht auch in Web Workern zur Verfügung. Für einfache Fälle sind
Blob.prototype.text()undarrayBuffer()mit Promises eine Alternative, sie haben aber keine Fortschrittsereignisse.