Signatur
Beschreibung
Mit abort() brechen Sie eine Anfrage ab, die bereits mit send() abgeschickt wurde und noch nicht fertig ist. Das ist nützlich, wenn das Ergebnis nicht mehr gebraucht wird, etwa wenn der Nutzer die Seite verlässt, auf „Abbrechen“ klickt oder bei einer Live-Suche schon einen neuen Suchbegriff eingegeben hat.
Wird die Anfrage abgebrochen, während sie noch läuft (readyState ist 1 mit gesendeter Anfrage, 2 oder 3), passiert Folgendes in dieser Reihenfolge:
readyStatewird auf4(DONE) gesetzt und einreadystatechange-Event wird ausgelöst.- Falls ein Upload läuft, werden auf
xhr.uploaddie Eventsabortundloadendausgelöst. - Auf dem
XMLHttpRequest-Objekt selbst werdenabortundloadendausgelöst. Die Eventsloadunderrorwerden nicht ausgelöst. - Danach wird
readyStateohne weiteres Event auf0(UNSENT) zurückgesetzt.statusist0, die Antwort ist leer.
Wird abort() aufgerufen, wenn keine Anfrage läuft (also vor send() oder nach dem Abschluss), gibt es keine Fehlermeldung und die Events abort und loadend werden nicht ausgelöst. Deshalb kann man abort() gefahrlos auch „auf Verdacht“ aufrufen. Das Objekt kann danach mit einem neuen open()-Aufruf wiederverwendet werden.
Rückgabewert
undefined).Beispiele
Anfrage nach eigener Zeitgrenze abbrechen
const xhr = new XMLHttpRequest();
xhr.open('GET', '/api/report');
xhr.addEventListener('load', () => {
clearTimeout(timer);
console.log('Fertig:', xhr.status);
});
xhr.addEventListener('abort', () => {
console.log('Abgebrochen, readyState:', xhr.readyState, 'status:', xhr.status);
});
xhr.send();
// Nach 3 Sekunden abbrechen, falls noch keine Antwort da ist
const timer = setTimeout(() => xhr.abort(), 3000);
Live-Suche: veraltete Anfrage verwerfen
let currentXhr = null;
const search = (term) => {
// Vorherige, noch laufende Suche abbrechen (bei fertiger Anfrage passiert nichts)
currentXhr?.abort();
const xhr = new XMLHttpRequest();
currentXhr = xhr;
xhr.open('GET', `/api/search?q=${encodeURIComponent(term)}`);
xhr.responseType = 'json';
xhr.onload = () => {
if (xhr.status === 200) {
console.log(`Treffer für "${term}":`, xhr.response);
}
};
xhr.send();
};
document.querySelector('#suche').addEventListener('input', (e) => {
search(e.target.value);
});
Datei-Upload per Button abbrechen
const input = document.querySelector('#datei');
const cancelBtn = document.querySelector('#abbrechen');
input.addEventListener('change', () => {
const formData = new FormData();
formData.append('file', input.files[0]);
const xhr = new XMLHttpRequest();
xhr.open('POST', '/upload');
xhr.upload.onprogress = (e) => {
if (e.lengthComputable) {
console.log(`Fortschritt: ${Math.round((e.loaded / e.total) * 100)} %`);
}
};
const cancel = () => xhr.abort();
cancelBtn.addEventListener('click', cancel);
xhr.onabort = () => console.log('Upload vom Nutzer abgebrochen');
xhr.onloadend = () => cancelBtn.removeEventListener('click', cancel);
xhr.send(formData);
});
// Wichtig · Fallstricke
- Kein
error-Event: Ein Abbruch löstabortaus, nichterror. Wer nuronerrorbehandelt, bekommt den Abbruch nicht mit. Aufräumarbeiten sollten inloadendstehen, denn dieses Event kommt in jedem Fall. readystatechangebeachten: Beim Abbruch kommt noch einreadystatechangemitreadyState === 4undstatus === 0. Code, der nur aufreadyState === 4prüft, hält die abgebrochene Anfrage sonst für abgeschlossen. Prüfen Sie zusätzlichstatus.- Serverseitig:
abort()beendet nur die Verbindung auf Seite des Clients. Hat der Server die Anfrage schon erhalten (z. B. einenPOST), kann er sie trotzdem vollständig ausführen. Deshalb eignet sichabort()nicht, um Aktionen mit Nebenwirkungen zuverlässig zu verhindern. - Synchrone Anfragen (
open(…, false)) blockieren den Haupt-Thread und lassen sich währenddessen nicht mitabort()abbrechen. - Moderne Alternative: Bei
fetch()übernimmtAbortControllermitAbortSignaldiese Aufgabe, zum Beispiel mitAbortSignal.timeout(). Für einfache Zeitlimits bietet XHR außerdem die Eigenschafttimeoutmit dem Eventtimeout. - Kompatibilität: Wird von allen Browsern unterstützt, auch von sehr alten, sowie in Web Workern. In Node.js gibt es
XMLHttpRequestnicht von Haus aus.