Get to know MDN better
This page was translated from English by the community. Learn more and join the MDN Web Docs community.
This feature is well established and works across many devices and browser versions. It’s been available across browsers since июль 2015 г..
* Some parts of this feature may have varying levels of support.
Это инструкция по использованию XMLHttpRequest для обмена информацией между сайтом и сервером по HTTP-протоколу.
Мы разберём как частые примеры использования XMLHttpRequest, так и более редкие.
Для отправки HTTP-запроса нужно создать XMLHttpRequest-объект, указать URL и отправить запрос. В результате запроса мы получим от сервера объект с подробной информацией, вроде тела ответа и HTTP-статуса.
Запрос, сделанный посредством XMLHttpRequest, может загружать данные синхронно или асинхронно. Тип запроса определяется опциональным async аргументом (третий по счёту) метода XMLHttpRequest.open(). Если он равен true или не задан, запрос выполнится асинхронно, в противном случае — синхронно.
В чем разница между двумя типами запросов, а так же примеры использования, вы можете найти в статье с подробным описанием синхронных и асинхронных запросов. По возможности избегайте синхронных запросов, они блокируют взаимодействие пользователя с сайтом.
Обратите внимание: Название XMLHttpRequest не означает, что вы можете передавать только XML документы. "XML" в названии остался из времён, когда основным форматом для обмена информацией был XML.
Конструктором XMLHttpRequest() определены несколько типов ответа. В ответе содержится важная информация о статусе запроса. При указании некоторых типов ответа могут потребоваться дополнительные действия для обработки и получения результата, рассмотрим эти случаи.
Если с помощью XMLHttpRequest загрузить XML-документ, в свойстве responseXML будет DOM-объект, содержащий распарсенный XML-документ, работать напрямую с которым будет сложно. Есть четыре основных способа анализа этого документа:
Обратите внимание: Теперь с помощью responseXML можно парсить HTML. Подробнее читайте в статье HTML в XMLHttpRequest.
Если вы используете XMLHttpRequest для получения содержимого HTML-страницы, в свойстве responseText будет "сырой" HTML, работать с которым неудобно. Есть три способа упростить работу с этим "сырым" HTML:
Хотя обычно XMLHttpRequest используется для отправки и получения текстового содержимого, с его помощью можно обмениваться и двоичными данными. Есть несколько проверенных способов заставить XMLHttpRequest посылать двоичные данные. Они заключаются в использовании метода overrideMimeType().
Однако, существуют и более современные способы, так как атрибут responseType теперь поддерживает ряд дополнительных типов содержимого, что существенно упрощает отправку и получение двоичных данных.
Для примера рассмотрим фрагмент, где используется "arraybuffer" как значение responseType для загрузки содержимого как объекта ArrayBuffer, в котором хранятся сырые двоичные данные.
Больше примеров в статье Отправка и получение бинарных данных.
XMLHttpRequest позволяет подписываться на различные события, которые могут произойти в процессе обработки запроса: периодические уведомления о состоянии запроса, сообщения об ошибках и так далее.
Следуя спецификации XMLHttpRequest поддерживает событие progress и реализует интерфейс ProgressEvent. Для получения информации о прогрессе загрузки используйте события:
progressНаступает каждый раз при изменении объёма переданных данных.
loadНаступает по завершению передачи, когда все данные доступны в response.
В 3-6 строках добавляются обработчики для различных событий, происходящих при передаче данных с помощью XMLHttpRequest.
Важно: Обработчики нужно добавлять до вызова метода open(). В противном случае progress-события не будут обработаны.
Обработчик события progress, представленный функцией updateProgress() в этом примере, получает количество байт, которое должно быть передано, и количество уже переданных байт в полях total и loaded. Но если длина сообщения неизвестна, поле lengthComputable будет равно false.
События о ходе выполнения есть как у входящих, так и у исходящих передач. Обработчики событий входящих передач задаются для объекта XMLHttpRequest, как в примере выше, а для исходящих — на XMLHttpRequest.upload:
Обратите внимание: отслеживание прогресса недоступно для протокола file:.
События о ходе выполнения наступают для каждого полученного пакета данных, включая последний, поэтому в случае, когда последний пакет получен и соединение закрыто, событие progress всё равно наступит. Это позволяет нам отслеживать прогресс, добавляя обработчик только для progress-события.
Также можно обработать все три события, завершающие загрузку (abort, load, or error) через событие loadend:
Заметьте, что событие loadend никак не сообщает, что вызвало конец передачи. Впрочем, это никак не мешает использовать его, если нужно сделать что-то вне зависимости от причины.
Есть два способа передать данные форм с помощью XMLHttpRequest:
FormData API – самый простой и быстрый способ, но данные, полученные с его помощью, нельзя превратить в строку с помощью JSON.stringify. Использование только XHR сложнее, но этот способ самый гибкий и мощный.
Отправка формы без FormData API в большинстве случаев не требует других API. Единственное исключение, если вам нужно отправить один или несколько файлов, тогда придётся использовать FileReader API.
HTML-форму <form> можно отправить четырьмя способами:
Рассмотрим отправку формы с двумя полями: foo и baz. Если использовать метод POST, сервер получит строку, похожую на одну из показанных ниже, в зависимости от типа кодирования, который вы используете:
Метод: POST; тип кодирования: application/x-www-form-urlencoded (по умолчанию):
Content-Type: application/x-www-form-urlencoded foo=bar&baz=The+first+line.%0D%0AThe+second+line.%0D%0AМетод: POST; тип кодирования: text/plain:
Content-Type: text/plain foo=bar baz=The first line. The second line.Метод: POST; тип кодирования: multipart/form-data:
Content-Type: multipart/form-data; boundary=---------------------------314911788813839 -----------------------------314911788813839 Content-Disposition: form-data; name="foo" bar -----------------------------314911788813839 Content-Disposition: form-data; name="baz" The first line. The second line. -----------------------------314911788813839--А если вы решите использовать метод GET, к адресу формы будет добавлена строка вида:
?foo=bar&baz=The%20first%20line.%0AThe%20second%20line.Всё это возможно благодаря браузеру и тегу <form>. Но если вам требуется выполнить все операции только с помощью JavaScript, вам придётся проинструктировать интерпретатор обо всех выполняемых операциях. Отправка формы с помощью чистого XHR слишком сложна, чтобы рассказать вам о ней во всех деталях. Поэтому мы решили опубликовать здесь целый (пусть и учебный) фреймворк, который поддерживает все четыре способа отправки и даже загрузку файлов:
Чтобы воспользоваться фреймворком, создайте страницу с названием register.php (и укажите его в атрибуте action одной из форм в примере) с минимальным содержимым:
Для активации выполните код:
Важно: Наш фреймворк использует FileReader API для передачи файлов. Это новый API и его невозможно использовать в IE9 и ниже. В связи с этим, загрузки только с использованием AJAX воспринимаются лишь как экспериментальные. Если вам не требуется загружать бинарные файлы, то данный фреймворк работает в большинстве современных браузеров.
Обратите внимание: Лучший способ отправить бинарные данные – использовать ArrayBuffers или Blobs в связке с методом send() и методом readAsArrayBuffer() из FileReader API. Но так как цель нашего примера – поддержка возможности представить сырые данные в виде строки, мы использовали метод sendAsBinary() в связке с readAsBinaryString() из FileReader API. Таким образом, приведенный выше код имеет смысл использовать только в том случае, если вы имеете дело с небольшими файлами. Если вы не планируете загружать двоичное содержимое, вместо этого воспользуйтесь FormData API.
The FormData constructor lets you compile a set of key/value pairs to send using XMLHttpRequest. Its primary use is in sending form data, but can also be used independently from a form in order to transmit user keyed data. The transmitted data is in the same format the form's submit() method uses to send data, if the form's encoding type were set to "multipart/form-data". FormData objects can be utilized in a number of ways with an XMLHttpRequest. For examples, and explanations of how one can utilize FormData with XMLHttpRequests, see the Using FormData Objects page. For didactic purposes here is a translation of the previous example transformed to use the FormData API. Note the brevity of the code:
Примечание: As we said, FormData objects are not stringifiable objects. If you want to stringify a submitted data, use the previous pure-AJAX example. Note also that, although in this example there are some file <input> fields, when you submit a form through the FormData API you do not need to use the FileReader API also: files are automatically loaded and uploaded.
Let's create two functions:
And to test:
If you want to know if the current page has changed, refer to the article about document.lastModified.
Современные браузеры поддерживают межсайтовые запросы по стандарту Cross-Origin Resource Sharing (CORS). Для этого серверу необходимо дополнительно указывать заголовок origin. В противном случае, выбрасывается исключение INVALID_ACCESS_ERR.
Для межсайтового обхода кеширования в конец URL-запроса достаточно добавить случайную строку в GET-параметры, то есть сразу после «?», например:
http://foo.com/bar.html -> http://foo.com/bar.html?12345 http://foo.com/bar.html?foobar=baz -> http://foo.com/bar.html?foobar=baz&12345Таким образом, каждый новый запрос будет происходить по новому URL, не браться из кэша.
Автоматизировать этот подход можно следующим образом:
Рекомендуемый способ разрешить межсайтовые запросы - использовать HTTP-заголовок Access-Control-Allow-Origin в ответе на XMLHttpRequest.
Если в завершение XMLHttpRequest вы получаете status=0 и statusText=null – это означает, что запрос не был разрешен к выполнению. Его статус остался UNSENT. Частая причина, что указанный XMLHttpRequest origin (во время создания XMLHttpRequest) был изменён в следствии вызова open(). Такое может произойти, например, когда есть XMLHttpRequest, который запускается при событии onunload окна. XMLHttpRequest создается, когда окно, которое должно быть закрыто, всё ещё существует, но отправка запроса (другими словами, вызов open()) происходит, когда это окно уже потеряло свой фокус, а другое – получило. Наиболее эффективный способ избежать этой проблемы - установить слушателя на событие нового окна DOMActivate, которое устанавливается, как только у закрытого окна срабатывает событие unload.
| XMLHttpRequest # interface-xmlhttprequest |
Enable JavaScript to view this browser compatibility table.
This page was last modified on 24 мар. 2025 г. by MDN contributors.
Your blueprint for a better internet.
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998–2026 by individual mozilla.org contributors. Content available under a Creative Commons license.