JavaScript XMLHttpRequest — запит до сервера (застарілий)


XMLHttpRequest (скорочено XHR) — історичний спосіб надіслати запит на сервер без перезавантаження сторінки. Саме з нього почався AJAX.

автор: NagarD

Загальний опис

Це той об'єкт, який у 2005-му змінив вебсайти на вебзастосунки. Ім'я його вже тоді було неточним: XML він не вимагає, а HTTP-запит — це не про XML.

Сьогодні його замінив fetch: той повертає проміс, працює з async/await і читається як звичайний код, тоді як XHR — це купка обробників подій навколо об'єкта зі станами.

Але одна річ у XHR досі є, а у fetch — ні: поступ вивантаження. Подія upload.onprogress дає відсоток надісланого, і саме тому смуги завантаження великих файлів досі часто пишуть на XHR.

автор: NagarD

Порада

Новий код пиши на fetch. XHR бери свідомо й лише заради поступу вивантаження — це єдине, чого fetch дотепер не вміє.

автор: NagarD

Синтаксис

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 Чи надсилати куки в міжсайтових запитах.

Переглядачі

Підтримка: стаціонарні переглядачі
Переглядач Google Chrome Mozilla Firefox Apple Safari Opera Microsoft EDGE Microsoft Internet Explorer
XMLHttpRequest 1+ 1+ 1.2+ 8+ 12+ 7+
Підтримка: мобільні переглядачі
Переглядач Mobile Google Android Mobile Google Chrome Mobile Mozilla Firefox Mobile Apple Safari
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();
автор: NagarD

Коментарі

Коментарів ще немає — будьте першим!

Відповідь для

Увійдіть — коментар з'явиться одразу, без капчі й очікування перевірки.

Пропозиція правки

Ваша версія — : після перевірки замінить чинну. Нова порада чи нотатка — з'явиться на сторінці після перевірки.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія секції «»: після перевірки замінить чинну.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія опису «»: після перевірки замінить чинну.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Зворотний зв'язок
Вхід