XMLHttpRequest 2, Підручник HTML5

XMLHttpRequest2, або, точніше, XMLHttpRequest Level 2, це той самий, відповідальний за AJAX-функціонал об'єкт XMLHttp-Request, оснащений новими можливостями.

Всі вони - по суті, виправлення недоліків попередньої реалізації компонента, що має вже великі досягнення перед Інтернетом, але, на жаль, недосконалою.

Друга проблема – асинхронна передача двійкових даних (наприклад, картинок). Тут все простіше — таких речей взагалі не було передбачено. Зі положення виходили ще більш негарними методами, сором'язливо ховаючи на сторінці кадр з формою завантаження або організуючи отримання файлу у вигляді бінарного рядка.

Ще одна проблема, можливо, менш очевидна, полягала у відсутності механізмів перевірки стану завантаження контенту, механізму індикації.

І ось тепер не потрібно жодних хаків, щоб виконувати такі операції, як кросдоменні запити, процес завантаження файлів, завантаження та відправлення двійкових даних.

Насамперед XMLHttpRequest Level 2 діє в рамках нової моделі взаємодії - протоколу Cross Origin Resource Sharing (CORS), що дозволяє проводити запити з одного домену на інший. На практиці при цьому в схемі взаємодії нічого не змінюється, просто браузер, у разі звернення до іншого, замість викидання виключення (origin mismath) додає до запитів один заголовок:

Який може бути виданий як одному сайту, так і цілому домену. Цей параметр еквівалентний об'єкту event. origin в Web Messages.

Ось як прозоро відбувається xmlhttp-запит з одного домену на інший:

Var xhr = новий XMLHttpRequest();

Xhr. onload = function(e)

Var data = JSON. parse (this. response);

Навіть нецікаво — на стороні користувача нічого не змінювалося!

Для роботиз даними виду, відмінного від рядків, з'явилися властивості responseType і response, що дозволяють явно вказати браузеру формат очікуваних у результаті відповіді даних. Після встановлення відповідного значення responseType властивість XMLHttpRequest. response міститиме значення в одному з наступних форматів: DOMString, ArrayBuffer, Blob, Document.

Ось як виглядає асинхронне надсилання картинки з новим XMLHttpRequest:

Var xhr = новий XMLHttpRequest(); xhr. open('GET', 'image. jpeg', true); xhr. responseType = 'frraybuffer'; xhr. onload = function(e)< if (this. status == 200)

Var bilder = новий BlobBuilder();

Bilder. append(this. response):

Var blob = bilder. getBlob('image. jpg');

Взагалі, про тип ArrayBuffer слід розповісти окремо.

А ось так можна зробити те саме, використовуючи тип Blob (якщо у нас немає необхідності працювати з окремими байтами):

Var xhr = новий XMLHttpRequest(); xhr. open('GET', '/path/to/image. png', true); xhr. responseType = 'blob'; xhr. onload = function(e) < if (this. status == 200) < var blob = це. response;

Var img=document. createElement('img'); img. src = window. URL. createObjectURL(blob);

Дані в різних форматах тепер можна надсилати на сервер. Ось приклади для тих же arrayBuffer і Blob:

Var uInt8Array = New Uint8Array([1, 2, 3]);

Xhr. send(uInt8Array. buffer);

Var blob = новий BlobBuilder();

Blob. append('I am just blob fule...'); blob. getBlob('text/plain');

На практиці такі можливості означають, що тепер для нас доступна, наприклад, відправлення файлу частинами, а також завантаження та збереження файлу в HTML5 File System.

Ще одна корисна властивість оновленого елемента - можливість роботи з даними,що надходять із форми як єдиного об'єкта — FormData(), инкрустирующего всі елементи форми (так-так, і ). Відправлення даних виглядає цілком стандартно:

FormData = New FormData(form);

Тут form – об'єкт HTML Form. А можна робити й так:

Var formData = новий FormData(); formData. append('user', 'vanya'); formData. append('role', 'admin'); formData. append('id', 17);

Слід зазначити, що розробники, мабуть, перебували під сильним враженням можливостей та підходів бібліотеки jquery, але хіба це погано?