Создание объекта, определяющего способ передачи данных через 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
}
});