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-объект содержит следующие свойства и методы:
readyState
status
statusText
responseXML
илиresponseText
setRequestHeader(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
без предварительной обработки. Данные также доступны в свойствеresponseText
jqXHR-объекта.'html'
- ответ с сервера передаётся в обработчикsuccess
без предварительной обработки. Данные также доступны в свойствеresponseText
jqXHR-объекта.'xml'
- ответ с сервера преобразуется в XML-документ с помощью функцииjQuery.parseXML()
перед передачей в обработчикsuccess
. Данный XML-документ также доступен в свойствеresponseXML
jqXHR-объекта.'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' })