jQuery.ajax()
Метод jQuery.ajax() выполняет асинхронный HTTP-запрос к серверу. При таком запросе данные на сервер отправляются без перезагрузки текущей страницы. Это низкоуровневый метод, который позволяет указать большое количество настроек. Он лежит в основе остальных ajax-методов в jQuery. Если нет необходимости указывать много настроек, лучше использовать упрощённые методы, например jQuery.get() или load().
Варианты использования
jQuery.ajax(URL[, настройки]) => jqXHR- Выполняет ajax-запрос с переданными настройками и возвращает расширенный XMLHttpRequest-объект. URL-адрес запроса указывается первым аргументом. Параметры запроса (
настройки) задаются в виде объекта. Все настройки запроса по умолчанию имеют определённые значения, поэтому их указывать необязательно. Кроме того, с помощью методаjQuery.ajaxSetup()можно изменить дефолтные значения настроек для всех ajax-запросов. Описание всех настроек приводится ниже. jQuery.ajax(настройки) => jqXHR- Выполняет ajax-запрос с переданными настройками. Отличие данного варианта от предыдущего только в том, что URL-адрес указывается в настройках запроса.
Параметры ajax-запроса
accepts :object-
Объект, в котором для значений параметра
dataTypeуказывается конкретный MIME-тип. При выполнении запроса к серверу в заголовкеAcceptsуказывается MIME-тип содержимого, ожидаемого от сервера. Из параметраacceptsберётся MIME-тип, соответствующий указанномуdataType. По умолчанию объект имеет примерно такой вид:accepts: { text: 'text/plain', html: 'text/html', xml: 'application/xml, text/xml', json: 'application/json, text/javascript' }При использовании нестандартного значенияdataTypeобязательно необходимо указать соответствующий ему MIME-тип с помощью параметраaccepts. async :boolean = true-
По умолчанию все запросы выполняются асинхронно, то есть после отправки запроса на сервер браузер продолжает выводить страницу (выполнять скрипты) без ожидания ответа от сервера.
Для синхронного выполнения запроса необходимо установить значениеfalse. Однако, в этом случае дальнейшая загрузка страницы и выполнение скриптов полностью блокируются до тех пор, пока не будет получен ответ с сервера. Кроссдоменные запросы и запросы с параметромdataType:'jsonp'не поддерживают синхронное выполнение. beforeSend :function(jqXHR, настройки)-
Функция, запускаемая непосредственно перед отправкой ajax-запроса на сервер. Фактически, данная функция - это обработчик ajax-события
beforeSend. Она может использоваться для редактирования jqXHR-объекта перед его отправкой, например, можно указать нужные заголовки и т.п. В функцию передаются два аргумента:- jqXHR-объект;
- объект с настройками запроса.
false, тогда ajax-запрос будет отменён.
СобытиеbeforeSendсрабатывает независимо от типа запроса. cache :boolean = зависит_от_dataType-
Булевый параметр, определяющий необходимость кэширования страниц запроса браузером:
true- кэшировать страницы запроса.false- не кэшировать страницы запроса.
dataType'script'или'jsonp'используется значениеfalse. Для остальныхdataTypeиспользуется значениеtrue. complete :function(jqXHR, статус_запроса)-
Функция, запускаемая после завершения ajax-запроса. Данная функция - это обработчик ajax-события
complete(наступает после событийsuccessилиerror). В функцию передаются два аргумента:- jqXHR-объект;
- строка, содержащая статус запроса:
success
,notmodified
,nocontent
,error
,timeout
,abort
илиparsererror
.
completeнеобходимо указать массив нужных функций. После завершения ajax-запроса по очереди будут выполнены все эти функции. contents :object-
Определяет, как разбирать (парсить) ответ от сервера в зависимости от типа содержимого. Задаётся в виде объекта, в котором для каждого типа определено регулярное выражение. Пример:
contents: { xml: /xml\b/, html: /html\b/, json: /json\b/ } contentType :string,boolean = 'application/x-www-form-urlencoded; charset=UTF-8'-
Указывает тип данных, передаваемых серверу. По умолчанию используется значение
'application/x-www-form-urlencoded; charset=UTF-8', которое подходит в большинстве случаев. Чтобы не отправлять заголовки с типом данных, необходимо использовать значениеfalse. При отправке данных всегда используется кодировка UTF-8, даже если явно указать другую кодировку. Это следует учитывать при обработке данных на сервере. context :object-
Указывается объект, в контексте которого будут выполняться все связанные с данным запросом обработчики событий. То есть данный объект будет доступен в переменной
this. По умолчанию в качестве контекста используется объект, содержащий настройки запроса. В качестве контекста можно указать DOM-элемент, например:$.ajax({ url: 'webgent.ru', context: DOM_Element }).done(function() { $(this).addClass('done'); }); converters :object-
Объект, в котором определено, как преобразовывать ответ от сервера, если тип полученных данных отличается от ожидаемого типа (указан в
dataType). Имя каждого свойства задаётся в формате'получаемый_тип ожидаемый_тип'. Значением каждого свойства указывается функция, которая используется для преобразования. По умолчанию объект имеет вид:converters: { /* Любой полученный тип данных ('*' - любой тип) в текст: преобразовать с помощью String() */ '* text': String, /* Текст в html: не преобразовывать (true) */ 'text html': true, /* Текст в json-выражение: преобразовать с помощью JSON.parse() */ 'text json': JSON.parse, /* Текст в xml: преобразовать с помощью jQuery.parseXML() */ 'text xml': jQuery.parseXML } crossDomain :boolean = зависит_от_URL-
Булевый параметр, которому автоматически устанавливается значение
trueдля кроссдоменных запросов илиfalseдля запросов на тот же домен. Если самостоятельно установить значениеtrue, тогда запросы на тот же домен всё равно будут считаться кроссдоменными. Это может понадобиться, если на стороне сервера происходит перенаправление на другой домен. data :string,object-
Данные для отправки на сервер. Данные задаются в виде строки или объекта, который предварительно будет преобразован в строку запроса (можно отменить в свойстве
processData). Эта строка присоединяется к URL для GET-запросов. dataFilter :function(данные, dataType)-
Функция, используемая для предварительной обработки данных, полученных с сервера. Она должна возвращать обработанные данные. Функция принимает два аргумента:
- данные с сервера в виде строки;
- значение свойства
dataType.
dataType :string-
Строка, указывающая тип данных, ожидаемых с сервера. Если параметр не указан, jQuery самостоятельно определяет тип полученных данных, основываясь на MIME-типе ответа с сервера. Параметр
dataTypeможет принимать одно из следующих значений:'text','html','xml','json','jsonp'или'script'. error :function(jqXHR, статус_запроса, статус_ошибки)-
Функция, которая запустится, если при выполнении запроса произойдёт ошибка и запрос не выполнится. Данная функция - это обработчик ajax-события
error. В функцию передаются три аргумента:- jqXHR-объект;
- строка, содержащая статус запроса (тип ошибки):
timeout
,error
,abort
илиparsererror
; - строка, содержащая HTTP-статус ошибки (
Not Found
,Internal Server Error
и т.д.).
errorнеобходимо указать массив нужных функций. Все функции будут выполнены по очереди.
Обработчики событияerrorне запускаются для кроссдоменных запросов сdataType, имеющим значение'script'или'jsonp'. global :boolean = true-
Булевый параметр, определяющий необходимость запуска глобальных ajax-событий для данного запроса. По умолчанию эти события будут запущены. Для отмены глобальных ajax-событий (
ajaxStart,ajaxStopи т.п.) необходимо установить значениеfalse. headers :object-
Объект с заголовками, которые будут добавлены в запрос. Заголовок
'X-Requested-With: XMLHttpRequest'отправляется всегда, но с помощью данного свойства можно изменить его значение. Все заголовки добавляются до срабатывания событияbeforeSend, то есть они будут доступны для редактирования в обработчике данного события. ifModified :boolean = false-
Значение
trueразрешает запросу получить статусsuccess
только в том случае, если ответ с сервера изменился с момента прошлого запроса. Данная проверка выполняется сравнением заголовковLast-ModifiedиETag. По умолчанию используется значениеfalse, то есть заголовки игнорируются. isLocal :boolean = зависит_от_протокола-
Булевый параметр, определяющий, локально ли расположен ресурс. По умолчанию значение параметра зависит от протокола. Локальными считаются протоколы:
file,*-extensionиwidget.
Значениеtrueопределяет текущее окружение как локальную среду (например, файловая система - это локальная среда), даже если jQuery считает, что это не так.
Если необходимо изменить свойствоisLocal, рекомендуется делать это глобально с помощью метода$.ajaxSetup(). jsonp :string,boolean-
При выполнении ajax-запроса типа
'jsonp'в URL добавляется GET-параметр, в котором передаётся имя для обращения к функцииsuccess(имя функции берётся из свойстваjsonpCallback). По умолчанию в качестве имени этого GET-параметра используется значение'callback'(
). Для обработки JSON-данных с помощью методаhttp://webgent.ru?callback=...successответ с сервера должен иметь вид
.echo $_GET['callback']."(JSON-данные)"
Если в качестве значения свойстваjsonpустановить значениеfalse, тогда дополнительный GET-параметр не будет добавлен к URL (может использоваться для обеспечения безопасности GET-запроса). Однако, в этом случае необходимо указать собственное имя функцииsuccessв свойствеjsonpCallback. Пример:$.ajax({ jsonp: false, jsonpCallback: 'parseResponse' })Для данного примера ответ с сервера должен иметь вид
.echo "parseResponse(JSON-данные)" jsonpCallback :string,function()-
Задаёт дополнительное имя, по которому можно обратиться к функции
successтекущего запроса. Значением свойства может быть строка или функция, которая возвращает имя в виде строки. По умолчанию именем функцииsuccessявляется идентификатор, установленный библиотекой jQuery. Использование собственного значения нежелательно.
Результат выполнения jsonp-запроса в конечном итоге сводится к запуску определённой функции, аргументом которой указан объект с JSON-данными. Имя запускаемой функции задаётся в ответе с сервера.
При выполнении ajax-запроса на сервер передаётся внутреннее имя функцииsuccess(значение свойстваjsonpCallback) в виде дополнительного GET-параметра, определяемого свойствомjsonp(кроме случаяjsonp: false). Это позволяет результатом jsonp-запроса сделать запуск методаsuccess. Если, например,{jsonp: 'jsonpFunction'}, тогда для запуска методаsuccessответ с сервера должен иметь вид
.echo $_GET['jsonpFunction']."(JSON-данные)" method :string = 'GET'-
HTTP-метод, используемый для запроса (например,
'GET','POST','PUT'). По умолчанию используется метод'GET'. mimeType :string- MIME-тип данных, ожидаемых с сервера. Данное значение записывается в соответствующее свойство XMLHttpRequest-объекта.
password :string- Пароль, который будет использоваться в ответ на запрос авторизации с сервера.
processData :boolean = true-
Если в свойстве
dataпередаваемые данные указаны в виде объекта, тогда перед отправкой запроса этот объект преобразовывается в строку запроса, соответствующую типу'application/x-www-form-urlencoded'. Чтобы не преобразовывать данные (например, для отправки DOM-документа), необходимо установить значениеfalse. scriptCharset :string-
Применяется только для GET-запросов с типом
'jsonp'или'script'. Устанавливает атрибутcharsetтегу<script>, то есть задаёт кодировку символов ('UTF-8','cp1251'и т.п.). Данный параметр может пригодиться, если кодировка на стороне клиента отличается от серверной. statusCode :object-
Объект, свойствами которого являются числовые HTTP-коды ответа с сервера (
200,301,404и т.п.). Значениями свойств устанавливаются функции, запускаемые при соответствующем ответе с сервера. Пример:statusCode: { 301: function() { alert('page moved permanently'); } 404: function() { alert('page not found'); } }Для успешных запросов функции принимают те же аргументы, что и обработчики событияsuccess. Для неуспешных запросов (включая3xx-редиректы) функции принимают аргументы, как обработчики событияerror. success :function(данные, статус_запроса, jqXHR)-
Функция, которая запустится при успешном выполнении запроса. Данная функция - это обработчик ajax-события
success. В функцию передаются три аргумента:- переданные с сервера данные, преобразованные в соответствии с указанным
dataType; - строка, содержащая статус запроса:
success
,notmodified
илиnocontent
; - jqXHR-объект.
successнеобходимо указать массив нужных функций. Все функции будут выполнены по очереди. - переданные с сервера данные, преобразованные в соответствии с указанным
timeout :number-
Задаёт время ожидания ответа от сервера в миллисекундах. При превышении данного интервала запрос будет прерван со срабатыванием события
error(статусtimeout
).
Время начинает отсчитываться с момента вызова функции$.ajax(). При этом необходимо учитывать, что ajax-запрос не всегда запускается сразу. Браузер может отложить его выполнение из-за перегрузки другими запросами, вследствие чего запрос может быть прерван таймаутом даже не начавшись.
В браузере Firefox 3.0+ запросы типа'script'и'jsonp'нельзя прервать таймаутом. Они будут выполнены даже после истечения времени. traditional :boolean = false-
Определяет способ преобразования объектов и массивов в строку запроса:
true- стандартное преобразование (без преобразования вложенных объектов и массивов).false- глубокое преобразование (рекурсивное преобразование всех вложенных объектов и массивов).
type :string = 'GET'-
Аналог свойства
method. Использовался в ранних версиях jQuery. По умолчанию имеет значение'GET'. url :string = текущий_URL- Строка, содержащая URL для отправки запроса. По умолчанию запрос отправляется на текущий URL.
username :string- Логин, который будет использоваться в ответ на запрос авторизации с сервера.
xhr :function() = зависит_от_браузера-
Функция для создания XMLHttpRequest-объекта. По умолчанию используется
ActiveXObjectдля IE илиXMLHttpRequestдля остальных браузеров. Можно установить любую другую функцию, возвращающую XMLHttpRequest-объект. xhrFields :object-
Параметр, позволяющий изменять свойства XMLHttpRequest-объекта. Задаётся в виде объекта со свойствами, значения которых необходимо изменить. Например:
/* Для кроссдоменных запросов может потребоваться изменить значение свойства withCredentials */ xhrFields: { withCredentials: true }
jqXHR-объект
jQuery XMLHttpRequest-объект (jqXHR) является улучшенным (дополненным) вариантом браузерного XMLHttpRequest-объекта. Например, он содержит свойства responseText, responseXML и метод getResponseHeader(). Для запросов типа 'jsonp', где не предполагается использование XMLHttpRequest-объекта, jQuery создаёт jqXHR-объект с нуля, делая его максимально похожим на браузерный XMLHttpRequest-объект.
jqXHR-объект содержит метод overrideMimeType(). Он может использоваться в обработчике события beforeSend для редактирования заголовка, который определяет тип содержимого, ожидаемого с сервера:
$.ajax({
beforeSend: function(xhr) {
xhr.overrideMimeType('text/plain; charset=x-user-defined');
}
})
jqXHR-объект является Deferred-объектом (точнее его Promise-версией) и обладает соответствующими свойствами и методами. Это позволяет установить несколько обработчиков на один запрос, и даже установить обработчик уже после завершения запроса (если запрос уже выполнен, тогда обработчик запустится немедленно). jqXHR-объект имеет методы:
jqXHR.done(обработчик)- Альтернативный способ установки обработчика ajax-события
success. jqXHR.fail(обработчик)- Альтернативный способ установки обработчика ajax-события
error. jqXHR.always(обработчик)- Альтернативный способ установки обработчика ajax-события
complete. Для успешного запроса в обработчик будут переданы аргументы, как в методеsuccess(). Для неуспешного запроса в обработчик передаются аргументы, как в методеerror(). jqXHR.then(обработчик_1, обработчик_2)- Альтернативный способ установки обработчиков ajax-событий
successиerror. Первый обработчик устанавливается на событиеsuccess, второй - на событиеerror.
Для совместимости с XMLHttpRequest-объектом jqXHR-объект содержит следующие свойства и методы:
readyStatestatusstatusTextresponseXMLилиresponseTextsetRequestHeader(name, value)getAllResponseHeaders()getResponseHeader()statusCode()abort()
Механизм onreadystatechange не поддерживается, но его возможности можно заменить методами done(), fail() и always().
Обработчики событий
Параметры beforeSend, error, dataFilter, success и complete используются для установки обработчиков событий, которые запускаются в определённое время:
beforeSend- перед отправкой запроса.error- в случае неуспешного запроса.dataFilter- при получении данных с сервера.success- в случае успешного запроса (послеdataFilter).complete- после завершения запроса (послеerrorилиsuccess).
Переменная this во всех обработчиках содержит ссылку на объект, указанный в параметре context при вызове $.ajax().
Получение данных с сервера
Данные, полученные с сервера доступны в обработчике события success. Они передаются в него первым аргументом:
$.ajax({
url: 'http://webgent.ru',
success: function(data) {
alert('Полученные данные: ' + data);
}
})
/* или */
$.ajax('http://webgent.ru')
.done(function(data) {
alert('Полученные данные: ' + data);
}
})
Если тип полученных данных 'text' или 'xml', тогда они также будут доступны в свойствах responseText или responseXML jqXHR-объекта соответственно.
Типы данных
Данные, полученные с сервера, перед передачей в обработчик события success подвергаются предварительной обработке (параметр converters). Вид обработки зависит от типа полученных данных (параметр dataType). По умолчанию jQuery определяет значение параметра dataType на основе MIME-типа, взятого из заголовка Content-Type. Чтобы самостоятельно определить, как интерпретировать ответ с сервера, необходимо использовать одно из следующих значений:
'text'- ответ с сервера передаётся в обработчикsuccessбез предварительной обработки. Данные также доступны в свойствеresponseTextjqXHR-объекта.'html'- ответ с сервера передаётся в обработчикsuccessбез предварительной обработки. Данные также доступны в свойствеresponseTextjqXHR-объекта.'xml'- ответ с сервера преобразуется в XML-документ с помощью функцииjQuery.parseXML()перед передачей в обработчикsuccess. Данный XML-документ также доступен в свойствеresponseXMLjqXHR-объекта.'json'- ответ с сервера преобразуется в JSON-объект с помощью функцииJSON.parse()перед передачей в обработчикsuccess.'jsonp'- ответ с сервера выполняется в виде JavaScript-кода (см. описание параметровjsonpиjsonpCallback).'script'- ответ с сервера выполняется в виде JavaScript-кода, после чего преобразуется в текст и передаётся в обработчикsuccess.
Отправка данных на сервер
По умолчанию ajax-запросы выполняются, используя HTTP-метод GET. Если требуется использовать другой метод (например, POST), тогда необходимо указать его в параметре method. В соответствии со стандартом W3C при отправке данных с помощью метода POST используется кодировка UTF-8.
Данные для отправки на сервер задаются в параметре data:
- строкой в формате
'имя_1=значение_1&имя_2=значение_2...'; - объектом вида
{имя_1: значение_1, имя_2: значение_2, ...}. Данный объект перед отправкой на сервер преобразуется в строку запроса с помощью функцииjQuery.param().
Если в параметре processData отменить преобразование данных в строку запроса, тогда на сервер можно отправить любой объект (например, XML-документ). В этом случае необходимо изменить значение параметра contentType на более подходящий MIME-тип.
Дополнительные настройки
Параметр global позволяет отменить выполнение обработчиков глобальных ajax-событий (ajaxSend, ajaxError и т.п.). Для кроссдоменных запросов ('script' или 'jsonp') они отключены по умолчанию.
Если сервер выполняет HTTP-авторизацию перед ответом, тогда с помощью параметров username и password можно указать логин и пароль соответственно.
Ajax-запросы ограничены по времени, что позволяет выявить ошибку в случае превышения данного времени. Изменить ограничение по времени можно с помощью параметра timeout, но лучше изменять его сразу для всех запросов с помощью функции jQuery.ajaxSetup().
Некоторые браузеры перед выполнением запроса сначала ищут результат предыдущего запроса в кэше. Чтобы запретить использовать кэшированные данные, используется параметр cache.
Параметр scriptCharset позволяет указать для SCRIPT-запросов, в какой кодировке получен ответ с сервера. Актуально, если кодировка страницы отличается от серверной.
Ajax-запросы выполняются асинхронно, то есть параллельно с основным потоком скрипта. Чтобы сделать запрос синхронным, необходимо для параметра async установить значение false. В этом случае выполнение основного кода приостанавливается до полного завершения запроса.
Функция $.ajax() возвращает созданный XMLHttpRequest-объект. jQuery самостоятельно создаёт этот объект, но с помощью параметра xhr можно задать собственную функцию, которая будет создавать XMLHttpRequest-объект. Возвращаемый функцией объект, как минимум, должен обеспечивать низкоуровневый интерфейс для контроля и управления запросом. В частности, метод abort() должен прерывать выполнение запроса в любой момент времени.
Расширенный Ajax
Реализация AJAX в jQuery предоставляет широкие возможности при выполнении запросов:
- Использование предварительных фильтров позволяет редактировать параметры запроса непосредственно перед отправкой запроса.
- Параметр
convertersпозволяет получать данные с сервера в любом формате. - Функция
jQuery.ajaxTransport()позволяет использовать собственную функцию для отправки запроса на сервер.
Примеры
/* Отправить данные на сервер (например, для сохранения) и сообщить после выполнения */
$.ajax({
method: 'POST',
url: 'http://your-server.ru',
data: {name: userName, password: userPassword},
success: function() {
alert('Данные отправлены.');
}
})
/* Отправить на сервер XML-документ без преобразования. */
/* При неуспешном запросе сообщить об ошибке. */
$.ajax({
url: 'http://your-server.ru',
processData: false,
data: xmlDocument,
error: function() {
alert('Запрос не выполнен.');
}
})
/* Загрузить и выполнить JavaScript-файл. */
$.ajax({
url: 'http://your-server.ru/js/form_check.js',
dataType: 'script'
})