Создание объекта, определяющего способ передачи данных через ajax-запрос
jQuery.ajaxTransport() – обрабатывает пользовательские настройки Ajax запроса или изменяет существующие настройки перед каждой отправкой запроса через $.ajax().
jQuery.ajaxTransport( dataType, handler )
- dataTypes — название типа данных, который будет использоваться.м;
- handler(options, originalOptions, jqXHR) — обработчик, который будет возвращать новый объект транспортировки с данными в первом аргументе.
- options — настройки текущего запроса;
- originalOptions — настройки по умолчанию (из ajaxSettings);
- jqXHR — объект jqXHR (в версиях до jquery-1.5, вместо него использовался XMLHttpRequest)
jQuery.ajaxTransport() представляет собой объект с двумя методами: send и abort, которые используются в методе $.ajax(). Данную настройку нужно использовать в крайнем случае, а так же только если предварительная фильтрация и преобразования являются недостаточными для достижения нужного эффекта.
Поскольку каждый запрос работает с своим собственным объектом транспорта, его нельзя задать напрямую. Вместо этого, вам нужно создать функцию, которая вернёт новый объект транспорта.
Генераторы транспорта регистрируются с помощью метода $.ajaxTransport(). Пример:
$.ajaxTransport( dataType, function( options, originalOptions, jqXHR ) { if( /* transportCanHandleRequest */ ) { return { send: function( headers, completeCallback ) { // Код отправки }, abort: function() { // Код отмены } }; } });
где:
- headers — объект (ключ/значение) для указания заголовков запроса, для передачи transport-объектом, если есть поддержка.;
- completeCallback – функция обратного вызова, используется для уведомления AJAX о завершении запроса.
completeCallback имеет следующий синтаксис:
function( status, statusText, responses, headers ) {}
где:
- status – статус HTTP-кода ответа, как например 200 для успешного запроса или 404 в случае, если ресурс не найден;
- statusText – строка, параметр statusText из ответа;
- responses – необязательный параметр, объект, содержащий dataType/value, который содержит ответ по всех форматах, который может обеспечить transport-объект (например, собственный XMLHttpRequest-объект будет установлен в
{xml: XMLData, text: textData}
для ответа содержащий XML-документ); - headers – необязательный параметр, строка, содержащая все заголовки ответа, если transport имеет к ним доступ (схоже с XMLHttpRequest.getAllResponseHeaders())
Как и в случае использования jQuery.ajaxPrefilter(), jQuery.ajaxTransport() можно прикрепить к конкретному типу данных (dataType):
$.ajaxTransport( "script", function( options, originalOptions, jqXHR ) { // Will only be called for script requests });
Пример реализации минимальными средствами транспорта изображения:
$.ajaxTransport( "image", function( s ) { if ( s.type === "GET" && s.async ) { var image; return { send: function( _ , callback ) { image = new Image(); function done( status ) { if ( image ) { var statusText = ( status === 200 ) ? "success" : "error", tmp = image; image = image.onreadystatechange = image.onerror = image.onload = null; callback( status, statusText, { image: tmp } ); } } image.onreadystatechange = image.onload = function() { done( 200 ); }; image.onerror = function() { done( 404 ); }; image.src = s.url; }, abort: function() { if ( image ) { image = image.onreadystatechange = image.onerror = image.onload = null; } } }; } })
Взаимодействие с собственными типами данных
В реализация AJAX в jQuery имеется набор стандартных типов данных, таких как text, JSON, XML и HTML. Используйте параметр converters в jQuery.ajaxSetup(), чтобы дополнить или изменить метод обработки типа данных , используемых в jQuery.ajax().
Взглянув на стандартные правила конвертации, вы сможете понять как настроить свои:
// Список преобразователей данных // 1) формат ключа(key): "исходный_тип конечный тип" // (разделенные одиночным пробелом) // 2) Символ "*" может быть использован для исходного_типа, объединяя все типы данных converters: { // преобразовать любой формат в текст "* text": window.String, // текст в html (true = не трансформировать) "text html": true, // текст в json выражение "text json": jQuery.parseJSON, // текст в xml "text xml": jQuery.parseXML }
Когда вы указываете параметр converters глобально в jQuery.ajaxSetup() или для каждого вызова jQuery.ajax(), объект будет вызываться конверторами по умолчанию, заменив те, которые переопределены и оставив остальные не тронутыми.
Например в исходниках jQuery используется jQeury.ajaxSetup(), что бы добавить конвертор “text script”.
jQuery.ajaxSetup({ accepts: { script: "text/javascript, application/javascript" }, contents: { script: /javascript/ }, converters: { "text script": jQuery.globalEval } });