410013796724260
• Webmoney
R335386147728
Z369087728698
Перейти к содержанию jQuery
Асинхронные ajax-запросыТермин ajax появился в 2005 году как акроним словосочетания Asynchronous JavaScript And XML (асинхронный JavaScript и XML). Многие разработчики отнесли данный термин к сомнительным, поскольку они уже использовали подобный подход для взаимодействия с сервером, но зачастую без технологии, определенный в данном акрониме. В конечном счете, сегодня под термином AJAX понимается любая технология, позволяющая из браузера выполнять запросы к серверу, не затрагивая открытую WEB-страницу. Обычно при взаимодействии с сервером без AJAX пользователь щелкает по ссылке или кнопке, отправляя заполненную форму на сервер; это сопровождается выполнением запроса к серверу. Сервер реагирует на запрос, возвращая пользователю новую WEB-страницу, которую браузер должен загрузить и отобразить на экране. Даже, если в результате выполнения данного запроса необходимо разблокировать или обновить несколько полей формы, сервер вернёт браузеру новую страницу. И пока сервер будет формировать новую страницу, а потом браузер будет её загружать, пользователю придется ждать. AJAX позволяет отправлять запросы из браузера на сервер без необходимости ожидания и перезагрузки всей страницы. Для запросов, которые требуют ответа сервера, необходимо указать callback-метод, который получит результат запроса и сможет обновить (при необходимости) часть страницы или отдельные поля. При этом пользователь может продолжить работу без ожидания ответа. Данная технология позволяет имитировать ощущение работы в браузере с настольным приложением. На странице рассмотрено описание метода ajax, определение глобальных настроек методом
Описание метода ajaxМетод ajax из библиотеки jQuery позволяет осуществлять асинхронные HTTP-запросы к серверу без перезагрузки страницы. Это низкоуровневый метод, имеющий большое количество настроек. Библиотека jQuery имеет два варианта использования ajax: jQuery.ajax(url,[settings]); jQuery.ajax(settings);
Отличие второго метода от первого связан с отсутствием 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('Страница не найдена'); } } }); 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 } }); События ajax-запросаAjax-запрос включает следующие события, описание которых представлено в предыдущем разделе :
Данные события позволяют подключить соответствующие обработчики. $.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; } } }); |