JavaScript XMLHttpRequest — запит до сервера (застарілий)
XMLHttpRequest (скорочено XHR) — історичний спосіб надіслати запит на сервер без перезавантаження сторінки. Саме з нього почався AJAX.
Загальний опис
Це той об'єкт, який у 2005-му змінив вебсайти на вебзастосунки. Ім'я його вже тоді було неточним: XML він не вимагає, а HTTP-запит — це не про XML.
Сьогодні його замінив fetch: той повертає проміс, працює з async/await і читається як звичайний код, тоді як XHR — це купка обробників подій навколо об'єкта зі станами.
Але одна річ у XHR досі є, а у fetch — ні: поступ вивантаження. Подія upload.onprogress дає відсоток надісланого, і саме тому смуги завантаження великих файлів досі часто пишуть на XHR.
- Порада
-
Новий код пиши на
автор: NagarDfetch. XHR бери свідомо й лише заради поступу вивантаження — це єдине, чогоfetchдотепер не вміє.
Синтаксис
const xhr = new XMLHttpRequest();\nxhr.open("GET", url);\nxhr.send();
методи
| Метод | Опис |
|---|---|
| open | Ініціалізує запит: метод і адреса. |
| send | Надсилає запит. |
| abort | Перериває запит. |
| setRequestHeader | Задає заголовок запиту. |
| getResponseHeader | Читає заголовок відповіді. |
властивості
| Властивість | Опис |
|---|---|
| status | HTTP-код відповіді. |
| statusText | Текст статусу відповіді. |
| readyState | Стан запиту: 0–4 (4 — завершено). |
| responseText | Тіло відповіді текстом. |
| responseType | Очікуваний формат: text, json, blob… |
| response | Тіло відповіді у форматі responseType. |
| timeout | Ліміт часу запиту в мілісекундах. |
| withCredentials | Чи надсилати куки в міжсайтових запитах. |
Переглядачі
| Переглядач | ||||||
|---|---|---|---|---|---|---|
| XMLHttpRequest | 1+ | 1+ | 1.2+ | 8+ | 12+ | 7+ |
| Переглядач | ||||
|---|---|---|---|---|
| XMLHttpRequest | yes | yes | yes | yes |
Приклади
+ запропонувати свій приклад у пісочниці
Те, заради чого XHR ще живий: смуга поступу вивантаження.
HTML
<form id="upload-form">
<input type="file" name="photo">
</form>
<progress id="progressBar" max="100" value="0"></progress>
JS
const form = document.getElementById('upload-form');
const progressBar = document.getElementById('progressBar');
const xhr = new XMLHttpRequest();
xhr.open('POST', '/upload');
// заради ЦЬОГО XHR і лишився: fetch так не вміє
xhr.upload.onprogress = event => {
if (event.lengthComputable) {
progressBar.value = Math.round(event.loaded / event.total * 100);
}
};
xhr.onload = () => console.log('Готово:', xhr.status);
xhr.onerror = () => console.log('Помилка мережі (у пісочниці сервера немає)');
xhr.send(new FormData(form));
// звичайний GET сьогодні пишуть інакше:
// const data = await (await fetch('/api')).json();
Коментарі
Коментарів ще немає — будьте першим!