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-объекта перед его отправкой, например, можно указать нужные заголовки и т.п. В функцию передаются два аргумента:
  1. jqXHR-объект;
  2. объект с настройками запроса.
Если функция вернёт значение false, тогда ajax-запрос будет отменён.

Событие beforeSend срабатывает независимо от типа запроса.
cache :boolean = зависит_от_dataType
Булевый параметр, определяющий необходимость кэширования страниц запроса браузером:
  • true - кэшировать страницы запроса.
  • false - не кэшировать страницы запроса.
По умолчанию для dataType 'script' или 'jsonp' используется значение false. Для остальных dataType используется значение true.
complete :function(jqXHR, статус_запроса)
Функция, запускаемая после завершения ajax-запроса. Данная функция - это обработчик ajax-события complete (наступает после событий success или error). В функцию передаются два аргумента:
  1. jqXHR-объект;
  2. строка, содержащая статус запроса: 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)
Функция, используемая для предварительной обработки данных, полученных с сервера. Она должна возвращать обработанные данные. Функция принимает два аргумента:
  1. данные с сервера в виде строки;
  2. значение свойства dataType.
dataType :string
Строка, указывающая тип данных, ожидаемых с сервера. Если параметр не указан, jQuery самостоятельно определяет тип полученных данных, основываясь на MIME-типе ответа с сервера. Параметр dataType может принимать одно из следующих значений: 'text', 'html', 'xml', 'json', 'jsonp' или 'script'.
error :function(jqXHR, статус_запроса, статус_ошибки)
Функция, которая запустится, если при выполнении запроса произойдёт ошибка и запрос не выполнится. Данная функция - это обработчик ajax-события error. В функцию передаются три аргумента:
  1. jqXHR-объект;
  2. строка, содержащая статус запроса (тип ошибки): timeout, error, abort или parsererror;
  3. строка, содержащая 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' (http://webgent.ru?callback=...). Для обработки JSON-данных с помощью метода 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. В функцию передаются три аргумента:
  1. переданные с сервера данные, преобразованные в соответствии с указанным dataType;
  2. строка, содержащая статус запроса: success, notmodified или nocontent;
  3. 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'
})