Афоризм
Я замужем. Без права переписки.
Последние статьи

 • Активности Android
Многоэкранные Android приложения
 • Fragment dynamic
Динамическая загрузка фрагментов в Android
 • Fragment lifecycle
Жизненный цикл Fragment'ов в Android
 • Fragment example
Пример Fragment'ов в Android
 • Data Binding
Описание и пример Data Binding
 • Пример MVVM
Пример использования MVVM в Android
 • Компонент TreeTable
Описание компонента TreeTable для Swing
 • Пример TreeTable
Пример использования TreeTable
 • Хранилища Android
Внутренние и внешние хранилища данных
 • Пример SQLite
Пример использования SQLite в Android
 • WebSocket
Описание и пример реализации WebSocket
 • Визуальные компоненты
Улучшен компонент выбора даты из календаря
 • Анимация jQuery
Описание и примеры анимации элементов DOM
 • APK-файл Android
Создание apk-файла для android устройств, .dex файлы
 • платформа JaBricks
Платформа OSGi-приложения JaBricks
Поддержка проекта

Если Вам сайт понравился и помог, то будем признательны за Ваш «посильный» вклад в его поддержку и развитие
 • Yandex.Деньги
  410013796724260

 • Webmoney
  R335386147728
  Z369087728698
Перейти к содержанию jQuery

Асинхронные ajax-запросы

Термин ajax появился в 2005 году как акроним словосочетания Asynchronous JavaScript And XML (асинхронный JavaScript и XML). Многие разработчики отнесли данный термин к сомнительным, поскольку они уже использовали подобный подход для взаимодействия с сервером, но зачастую без технологии, определенный в данном акрониме. В конечном счете, сегодня под термином AJAX понимается любая технология, позволяющая из браузера выполнять запросы к серверу, не затрагивая открытую WEB-страницу.

Обычно при взаимодействии с сервером без AJAX пользователь щелкает по ссылке или кнопке, отправляя заполненную форму на сервер; это сопровождается выполнением запроса к серверу. Сервер реагирует на запрос, возвращая пользователю новую WEB-страницу, которую браузер должен загрузить и отобразить на экране. Даже, если в результате выполнения данного запроса необходимо разблокировать или обновить несколько полей формы, сервер вернёт браузеру новую страницу. И пока сервер будет формировать новую страницу, а потом браузер будет её загружать, пользователю придется ждать.

AJAX позволяет отправлять запросы из браузера на сервер без необходимости ожидания и перезагрузки всей страницы. Для запросов, которые требуют ответа сервера, необходимо указать callback-метод, который получит результат запроса и сможет обновить (при необходимости) часть страницы или отдельные поля. При этом пользователь может продолжить работу без ожидания ответа. Данная технология позволяет имитировать ощущение работы в браузере с настольным приложением.

На странице рассмотрено описание метода ajax, определение глобальных настроек методом ajaxSetup, список ajax-настроек и приведены примеры ajax-запросов.

Описание метода ajax

Метод ajax из библиотеки jQuery позволяет осуществлять асинхронные HTTP-запросы к серверу без перезагрузки страницы. Это низкоуровневый метод, имеющий большое количество настроек. Библиотека jQuery имеет два варианта использования ajax:


jQuery.ajax(url,[settings]);
jQuery.ajax(settings);
 
где,
  • url : строка определения URL, куда будет отправлен запрос (адрес запроса);
  • settings : набор значений типа key/value, «завёрнутые» в фигурные скобки и представленные в формате литерала объекта. Значения settings определяют конфигурацию запроса, ни одна из настроек не является обязательной. По умолчанию настройки можно установить с помощью метода $.ajaxSetup()

Отличие второго метода от первого связан с отсутствием url, который может быть определен значениями по умолчанию с использованием метода $.ajaxSetup()

Метод ajaxSetup

Библиотека jQuery для вызова метода ajax позволяет определить некоторые настройки по умолчанию. Для этого следует использовать метод библиотеки ajaxSetup, имеющий следующий формат :


jQuery.ajaxSetup(options);
 

Опции по умолчанию options должны быть определены в формате литерала объекта :

$.ajaxSetup({
   url: "java-online.ru",
   type: "POST",
   global: false,
});

Примечание : на странице Интеграция JSP и jQuery приведены 2 примера использования метода ajax для отправки запросов сервлету на сервер. В примерах продемонстрировано определение параметра URL.

Список настроек

Ниже представлен список настроек, которые можно использовать в методе ajax. Описание настроек «свернуто». Чтобы развернуть описание настройки, подведите к ней курсор мыши и щёлкните.

accepts : набор пар key/value

Допустимые типы содержимого, ожидаемого от сервера.
$.ajax({
  accepts: {
    customtype: 'application/x-some-custom-type'
  },
  // Инструкция по десериализации 'customtype'
  converters: {
    'text customtype': function(result) {
      // Do Stuff
      return newresult;
    }
  },
  // от сервера ожидается 'customtype'
  dataType: 'customtype'
});

async : асинхронный запрос

По умолчанию async=true, т.е. запросы выполняются асинхронно без перезагрузки страницы; на время выполнения запроса страница не останавливает свою работу в ожидании ответа. Если необходимо выполнить синхронный запрос, то установите параметр async в false. Помните, что кроссдоменные запросы и запросы типа "dataType=JSONP" не могут выполняться в синхронном режиме.

Примечание : выполнение синхронных запросов может привести к блокировке страницы, пока выполнение запроса не будет полностью завершено.

beforeSend : функция перед отправкой

Данный параметр определяет функцию, которая должна быть вызвана непосредственно перед отправкой ajax-запроса на сервер. Такая функция может быть полезна для модификации jqXHR-объекта (в версиях jQuery 1.5 вместо jqXHR используется XMLHttpRequest). В функции можно изменить/указать нужные заголовки (headers) и т.д. Объект jqXHR передается в функцию первым аргументом. Вторым аргументом передаются настройки запроса.

Функция, связанная с beforeSend относится к ajax-событиям; если она вернет false, то ajax-запрос будет отменен. Начиная с jQuery версии 1.5 beforeSend вызывается независимо от типа запроса.

cache : кэширование запроса

По умолчанию значение true. Для типов dataType=['script','jsonp'] значение false.

В случае значения false браузер не кэширует выполняемый запрос. Кроме этого, такой запрос будет корректен для запросов типа GET, и он будет сопровождаться добавлением строки "_={timestamp}" в URL.

complete(jqXHR, textStatus ) : callback-функция

функция, вызываемая после завершения ajax-запроса; вызывается после функции-обработчика успешного (success) или аварийного (error) завершения запроса. Функция получает 2 параметра : jqXHR (в версиях библиотеки до 1.5 используется XMLHttpRequest) и статус выполнения запроса ("success", "notmodified", "error", "timeout", "abort", или "parsererror").

Начиная с jQuery-1.5, в complete можно указать массив функций; вызов функций осуществляется в той очередности, в которой они определены в массиве.

contents : формат ответа

Параметр в формате string/regular-expression определяет, как jQuery будет парсить (разбирать) ответ от сервера, в зависимости от его типа.

contentType : тип данных

При отправлении запроса на сервер можно определить тип данных в contentType. По умолчанию используется "application/x-www-form-urlencoded;charset=UTF-8", который подходит в большинстве случаев.

context : контекст

Указывается контекст для всех callback-обработчиков, связанных с выполнением запроса. По умолчанию, context – это объект с настройками текущего ajax-запроса. В качестве контекста можно определить DOM-элемент, который будет использован для сигнализирования завершения запроса. Пример :

$.ajax({
    url: "domen.html",
    context: document.body
}).done(function() {
    // в этом случае this будет равен document.body
    $(this).addClass("done");
});

converters(string:function) : конвертер

Значения по умолчанию : {"* text": window.String, "text html": true, "text json": jQuery.parseJSON, "text xml": jQuery.parseXML}

Метод определяет функцию, с помощью которой будет производиться конвертация значений из одного типа, в другой. Параметр метода представлен объектом в формате {string:function}, где string содержит названия двух типов через пробел ("конвертировать_из конвертировать_в"). Пример приведен при описании настройки accepts.

crossDomain (boolean): кроссдоменный запрос

Если необходимо выполнить кроссдоменный запрос (типа jsonp) в ту же доменную зону, то необходимо установить параметр в true. Это позволит выполнить перенаправление запроса с сервера на другой домен. Данная настройка появилась в jQuery-1.5.

data : данные

Тип отправляемых на сервер данных: PlainObject, String или Array.
Если используется HTTP метод GET, то данные будут добавлены в URL.

Если данные представлены типом PlainObject или Array, то они должны быть описаны в виде литерала. Например, объект PlainObject должен иметь следующий вид : {name1:value1, name2:value2 ...}. При использовании массива данных, значения указываются в квадратных скобках; например, { a: [1,2] }.

dataFilter(data, type):function : фильтрация ответа

Тип : function(String data, String type) => Anything
Anything – это виртуальный тип, используемый в документации jQuery, который индицирует используемый или ожидаемый тип данных.

Функция, которая осуществляет предварительную обработку присланных сервером данных. Функция получает в качестве параметров данные data, их тип dataType, и возвращает обработанные данные.

dataType : тип данных

Тип ожидаемых от сервера данных. Если тип не определен, то jQuery попытается определить его автоматически с помощью полученного от сервера MIME. Кроме этого, имеется возможность указать, как следует интерпретировать эти данные. Это делается с помощью параметра dataType. Возможные значения этого параметра:
  • "xml" — полученный xml-документ в текстовом виде. С документом можно работать стандартными средствами jQuery (также, как и с html).
  • "html" — полученный html в текстовом виде. Если он содержит скрипты в тегах <script>, то они будут автоматически выполнены после того, как только html-текст будет помещен в DOM.
  • "script" — полученные данные будут исполнены как javascript-код. Переменные, которые обычно содержат ответ от сервера будут содержать объект jqXHR.
  • "json", "jsonp" — полученные данные будут предварительно преобразованы в javascript-объект. Если преобразование окажется неудачным, то будет вызвано исключение ошибки разбора ответа. Если сервер, к которому было выполнено обращение, находится в другом домене, то вместо json следует использовать jsonp.
  • "text" — ожидаемые от сервера данные в виде обычного текста, без предварительной обработки.

Примечание :
1. Если запрос отправляется на сторонний домен (dataType равно jsonp или script), обработчики ошибки выполнения (error), а так же глобальные события не сработают.
2. Тип данных, определенный в dataType не должен противоречить предоставляемой сервером MIME-информации. Например, xml-данные должны быть представлены сервером как text/xml или application/xml. Если это не будет выполнено, jQuery попытается конвертировать полученные данные в указанный тип.

error(jqXHR jqXHR, String textStatus, String errorThrown) : функция обработки ошибки

Функция, вызываемая при неудачном завершении запроса к серверу. В качестве параметров функция получает :
• jqXHR : строка с описанием произошедшей ошибки, а также объект исключения, если такое произошло. В версии до 1.5 вместо jqXHR используется XMLHttpRequest.
• textStatus : ["timeout", "error", "notmodified" и "parsererror", null].

Функция error относится к ajax-событиям.

Примечание : обработчик не вызывается для cross-domain скриптов и cross-domain JSONP запросов.

global(default true) : глобальное событие

Определение глобального события ajax-запроса. По умолчанию значение true. Если у данного параметра определить значение false, то глобальные события для данного запроса типа ajaxStart и ajaxStop вызываться не будут. Это можно использовать для управления различными Ajax-событиями.

headers({}) : дополнительный заголовок

Дополнительный заголовок в виде объекта из пар key/value может быть отправлен на сервер с использованием транспорта XMLHttpRequest. Заголовок X-Requested-With: XMLHttpRequest добавляется всегда, но здесь можно изменить его значение по умолчанию. Заголовок может быть также переопределен в функции beforeSend. Опция появилась в jQuery-1.5.

ifModified(default: false) : флаг изменений

При значении этой настройки true, запрос будет выполнен со статусом "successful", лишь в том случае, если ответ от сервера отличается от предыдущего ответа. Это выполняется проверкой заголовка Last-Modified. По умолчанию значение false; игнорировать заголовок. Начиная с jQuery 1.4 также проверяется предоставляемый сервером 'etag', сигнализирующий что запрашиваемые данные не изменены с предыдущего запроса.

isLocal(default: в зависимости от текущего протокола) : локальный источник

Параметр позволяет установить статус источника страницы локальным (равносильно файловой системе), даже если бы jQuery распознал его иначе. Следующие протоколы определяются как локальные : file, *-extension, и widget. Если необходимо определить параметр isLocal, то рекомендуется это делать с помощью функциии $.ajaxSetup(), а не в настройках отдельных ajax-запросов. Настройка появилась в версии 1.5.1.

jsonp : добавляемая в url callback функция

Настройка определяет наименование callback функции, которая добавляется в url при JSONP-запросе. По умолчанию, используется "callback", например "httр://site-name.ru?callback=...". При значении параметра false исключается добавление в url наименования функции. В этом случае необходимо явно определить значение свойства jsonpCallback; например, {jsonp:false, jsonpCallback:"callbackFunction"}. Если Вы не доверяете источнику ajax-запроса, то используйте значение false в целях безопасности.

jsonpCallback : callback функция

Определение наименования callback-функции, которая будет вызвана при ответе сервера на jsonp-запрос. По умолчанию jQuery генерирует произвольное наименование функции, упрощающее работу библиотеки. Одна из причин необходимости опреления собственной callback-функции связана с улучшением кеширования GET-запросов при обработке jsonp-запроса.

Начиная с версии 1.5 в данном параметре можно указывать callback-функцию, которая будет обрабатывать ответ сервера. В этом случае, функция должна возвращать полученные от сервера данные.

mimeType : тип данных

Параметр определения типа данных ожидаемого ответа от сервера в MIME-формате. Настройка добавлена в версии 1.5.1

password : пароль

Пароль аутентификации на сервере, если это требуется.

processData : преобразование данных

По умолчанию данные, передаваемые на сервер, предварительно преобразуются в строку url-формата (name1=value1&name2=value2&...), соответствующую "application/x-www-form-urlencoded". При отправке данных, которые не требуется преобразовывать в строку (например, DOM-документ), необходимо определить значение опции равным false (опцию отключить).

scriptAttrs : дополнительные атрибуты кроссдоменного ajax-запроса

Определение дополнительных атрибутов в виде объекта, который может быть использован в кроссдоменном ajax-запросе для типов dataType=['script','jsonp']. Формат описания объекта key/value.

scriptCharset : кодировка кроссдоменного ajax-запроса

Определение кодировки кроссдоменного запроса. Данный параметр определяет кодировку на чужом домене, отличную от кодировки на сервере родного домена, и используется для кроссдоменных ajax-запросов, dataType при этом может быть либо "jsonp", либо "script".

statusCode : сопоставление кодам функции

Определение соответствий кодам выполнения запроса callback-функций. Например, для кода 404 (страница не найдена) можно открыть окно alert с выводом сообщения :

$.ajax({
  statusCode:{
    404:function(){
      alert('Страница не найдена');
    }
  }
});
Callback-функции удачного выполнения запроса будут получать те же аргументы, что и функции-обработчики удачного выполнения запроса (см. описание success), а функции, срабатывающие на коды ошибок, будут иметь те же аргументы, что и функция error.

success : callback-функция удачного выполнения запроса

Callback-функция, определенная данным параметром, вызывается при удачном завершении запроса. Функция получает 3 параметра : function(anything data, String textStatus, jqXHR jqXHR).

  • data – присланные сервером данные;
  • textStatus – строка со статусом выполнения;
  • jqXHR – в более ранних версиях библиотеки (до 1.5) вместо jqXHR используется XMLHttpRequest.

Начиная с версии 1.5 вместо одной функции параметр может принимать массив функций, вызываемые поочередно.

success относится к ajax-событиям.

timeout : время ожидания ответа

Время ожидания ответа от сервера в миллисекундах. Если за это время ответ не будет получен, то запрос завершится с ошибкой, т.е. возникнет описанное выше событие error со статусом "timeout". При значении равным 0 запрос выполняется без timeout'a. Параметр timeout переопределяет значение, определенное в функции $.ajaxSetup().

Отсчет времени начинается с момента вызова функции $.ajax. В случае параллельного запуска нескольких запросов браузер отложит выполнение текущего запроса. В этом случае возникнет timeout, хотя запрос фактически не был отправлен.

В версии библиотеки 1.4 и младше при завершении времени ожидания объект XMLHttpRequest переходит в состояние ошибки и доступ к его полям может вызвать исключение. В Firefox 3.0+ запросы типа script и JSONP не будут прерваны timeout'ом при превышении времени ожидания; они будут завершены даже после того как это время истечет.

traditional : стиль сериализации

Определите значение данного параметра равным true, чтобы использовать традиционные параметры преобразования (сериализации).

type : тип запроса

Определение типа выполняемого запроса : GET или POST. По умолчанию используется GET.

url : адрес

Определение адреса URL, куда будет отправлен ajax-запрос.

username : имя пользователя

Определение имени пользователя для аутентификации на сервере, если это необходимо.

xhr : callback-функция

Callback-функция формирования объекта XMLHttpRequest, длля браузеров IE этим объектом является ActiveXObject. Данный параметр позволяет определить собственную версию объекта.

xhrFields : набор значений

Набор пар {name:value} для определения значений соответствующих полей объекта XMLHttpRequest. К примеру, при необходимости можно установить значение true для свойства withCredentials при выполнении кроссдоменного запроса :
$.ajax({
   url: a_cross_domain_url,
   xhrFields: {
      withCredentials: true
   }
});
В версии библиотеки 1.5 свойство withCredentials не поддерживается нативным XMLHttpRequest, и, следовательно, при кроссдоменном запросе этот параметр будет проигнорирован. Начиная с версии 1.5.1. это исправлено.

События ajax-запроса

Ajax-запрос включает следующие события, описание которых представлено в предыдущем разделе :

  • beforeSend возникает непосредственно перед отправкой запроса на сервер;
  • error возникает в случае неудачного выполнения запроса;
  • dataFilter возникает при поступлении данных от сервера;
  • success возникает в случае успешного выполнения запроса;
  • complete возникает в случае любого завершения запроса.

Данные события позволяют подключить соответствующие обработчики.

$.ajax({
  url: "https://ajax-home.net/test.html",
  success: function() {
      alert('Успешное завершение запроса.');
  }
});

Метод $.ajax() начиная с версии 1.5 возвращает объект jqXHR, который помимо прочего реализует интерфейс deferred, что позволяет определять дополнительные обработчики выполнения. Помимо стандартных для объекта deferred методов .done(), .fail() и .then() в jqXHR реализованы методы .success(), .error() и .complete(), которые, начиная с версии 1.8, станут нежелательными для использования.

$.ajax({
  url: "https://ajax-home.net/test.html",
  beforeSend: function(xhr) {
    xhr.overrideMimeType("text/plain;charset=x-user-defined");
  }
}).done(function(data) {
    console.log( "Пример данных : ", data.slice(0, 100));
});

Некоторые типы запросов типа jsonp или кроссдоменные GET-запросы не предусматривают использование объектов XMLHttpRequest. В этом случае, передаваемые в обработчики XMLHttpRequest и textStatus будут содержать значение undefined.

Внутри обработчиков, переменная this определяет значение параметра context. В случае, если он не был задан, this будет содержать объект настроек.

Выполнение ajax-запроса

Пример наиболее простого варианта вызова ajax-запроса без задания параметров : $.ajax(). Значения по умолчанию определены глобально с использованием $.ajaxSetup().

Запрос к серверу осуществляется по умолчанию методом GET. При необходимости запрос можно отправить методом POST, определив соответствующее значение в настройке type. Отправляемые методом POST данные XMLHTTPRequest согласно стандарту W3C будут преобразованы в UTF-8, если они определены в другой кодировке.

Параметр запроса data может быть определен либо в формате передачи данных в url (key1=value1&key2=value2), либо в формате литерала объекта {key1: 'value1', key2: 'value2'}, который jQuery преобразует с помощью $.param(). Преобразование можно отменить определением значения настройки processData равным false. В случае необходимости отправки данных без преобразования, например, xml-объект, необходимо изменить параметр contentType с application/x-www-form-urlencoded на более подходящий MIME-тип.

Обработчики событий .ajaxSend(), .ajaxError() и др. можно отключать параметром global. Это может быть полезно в случаях, когда в этих обработчиках запускается/останавливается анимация загрузки, а запросы выполняются часто и быстро. В этом случае для таких запросов будет полезно отключить выполнение обработчиков. Для кроссдоменных запросов script и jsonp параметр global отключается автоматически.

Если для выполнения ajax-запроса требуются данные аутентификации логин/пароль, то их можно указать в настройках username и password ajax-запроса.

Выполнение ajax-запроса требует определенного времени, и может завершиться с ошибкой (статус "timeout"), если ответ от сервера не поступит вовремя. Параметром "timeout" можно ограничить или увеличить время ожидания ответа.

Выполнение запросов ajax происходит асинхронно. Если необходимо выполнить синхронный ajax-запрос, то следует отключить настройку async. В этом случае при ожидании ответа от сервера страница будет "подвисать".

Замечание: большинство браузеров не могут выполнять ajax-запросы на ресурсы с доменами, отличными от текущего. Однако, это ограничение не распространяется на запросы типа jsonp и script.

Получение ответа от сервера

Поступившие от сервера данные в зависимости от значения параметра dataType могут быть предоставлены в виде строки или объекта. Эти данные всегда доступны в первом параметре обработчика выполнения ajax-запроса :


$.ajax({
    url: "https://ajax-home.net/test.html",
    success: function(data){
        alert("Получены следующие данные: " + data);
    }
});
 

Полученные от сервера данные типов text и xml будут доступны также и в jqXHR; в полях responseText и responseXML соответственно.

Примеры выполнения ajax-запросов

Подгрузить файл some.js и выполнить скрипты :

$.ajax({
    type: "GET",
    url: "some.js",
    dataType: "script"
});

Выполнить POST-запрос :

$.ajax({
    type: "POST",
    url: "test.php",
    data: {firstName : "John",
	       lastName : "Conner"},
    success: function(txt){
        alert(Поступили данные: " + txt);
    }
});

Обновить содержимое страницы :

$.ajax({
    url: "users.html",
    cache: false
}).done (function(html){
    $("#results").append(html);
});

Выполнить синхронный запрос, полученные данные записать в переменную code :

let code = $.ajax({
  url: "test.php",
  async: false
 }).responseText;

Отправить данные типа XML-объект на сервер. Чтобы исключить преобразование объекта в строку необходимо установить processData=false. При удачном завершения ajax-запроса вызовем функцию handleResponse :

var xmlDoc = [create xml-document];
var xmlRequest = $.ajax({
  url: "test.php",
  processData: false,
  data: xmlDoc
});
 
xmlRequest.done (handleResponse);

Отправить на сервер данные в виде идентификатора id и сообщить пользователю об успешной доставке. В случае ошибки открыть окно с сообщением.


let menuId = $("ul.nav").first().attr("id");
let request = $.ajax({
    url: "script.php",
    method: "POST",
    data: { id : menuId },
    dataType: "html"
});
 
request.done(function( msg ) {
    $("#log").html(msg);
});
 
request.fail(function(jqXHR, textStatus) {
    alert("Запрос не выполнен : " + textStatus);
});

Конвертор ajax-запроса

Конвертор ajax-запроса позволяет подготовить полученные от сервера данные, если их формат не совпадает с определенными в настройках dataType. Поскольку converters является настройкой ajax, то он может быть определен глобально в методе ajaxSetup.

Пример глобального конвертора


$.ajaxSetup({
    converters: {
        "mydatatype json": function(result) {
            // Do stuff
            return newresult;
        }
    }
});
 

Converter может быть задан для конкретного ajax-запроса (не глобально). Следующий пример демонстрирует способ конвертации ответа сервера из xml в текст только для этого запроса :

Пример локального конвертора


$.ajax( 
    dataType: "xml mydatatype",
    converters: {
        "xml mydatatype": function(xmlValue) {
            // ... получить текстовые данные из xml
            return textValue;
        }
    }
}); 
  Рейтинг@Mail.ru