Ответ 1
Вы также можете использовать обратный вызов beforeSend:
$.ajax({
beforeSend: function(jqXHR, settings){
// Here you are the XHR object
console.log(settings.xhr());
}
});
Можно ли получить доступ к объекту XMLHttpRequest
из обратного вызова успеха функции $.ajax()
? В частности, мне нужен доступ к XMLHttpRequest.responseBody
в IE. В документации возвращаемый объект jqXHR
не предоставляет свойство .responseBody
.
Это, по-видимому, незначительный недостаток, который имеет огромное влияние при работе с двоичными данными. Если свойство .responseBody
или базовый объект XMLHttpRequest
недоступен, мне придется пропустить jQuery для ajax и закодировать его, дрожать, чистить javascript.
Я искал переменную responceBody
, а не переменную responceText
, которая легко доступна из $.ajax()
Вы также можете использовать обратный вызов beforeSend:
$.ajax({
beforeSend: function(jqXHR, settings){
// Here you are the XHR object
console.log(settings.xhr());
}
});
Функция xhr для запроса ajax может быть переопределена.
$.ajax({
...
xhr: function(){
var xhr = jQuery.ajaxSettings.xhr();
// do stuff with xhr;
return xhr;
}
});
Или, чтобы уточнить ответ Мануэля Битто, к экземпляру xhr можно получить доступ из обратного вызова beforeSend:
$.ajax({
beforeSend: function(jqXHR, settings){
var xhr = jQuery.ajaxSettings.xhr();
settings.xhr = xhr
// Do stuff with the xhr instance for this request
xhr.onprogress = function(){
}
console.log(xhr);
}
});
Я тоже хотел найти базовый объект XMLHttpRequest для доступа к свойствам onprogress и upload (найденным в более поздних браузерах, использующих XMLHttpRequest2), чтобы я мог выполнять собственную обработку перехода к загрузке использования хаков. После перекопа через источник jQuery я обнаружил, что вы можете получить его через jQuery.ajaxSettings.xhr()
. Это функция, которая возвращает необработанный XMLHttpRequest.
Смотрите здесь: https://github.com/jquery/jquery/blob/master/src/ajax/xhr.js
Надеюсь, что это поможет.
Я знаю, что это старый вопрос, но я просто решил его.
Что мы знаем о ситуации? Мы знаем, что jQuery больше не проходит вокруг исходного объекта XmlHttpRequest и никаких ссылок на него. Мы знаем, что вместо этого он проходит вокруг "надмножества", имеющего большинство атрибутов. И мы знаем, что jQuery по-прежнему использует XmlHttpRequest для вызова AJAX.
Итак, если браузер по-прежнему получает обратный вызов и передается фактический XmlHttpRequest, можем ли мы его программно получить? Используя arguments.callee.caller
, Да. Мы. Может.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments/callee
К тому времени, когда ваш крючок срабатывает (success
, fail
, что угодно), у вас есть всего несколько гарантий: вы находитесь в callstack callback, первая функция (обратный вызов) имеет XHR, и у нее нет caller
.
Итак, прокрутите столбец (arguments.callee.caller.arguments.callee.caller...
) до тех пор, пока caller
не будет null
, а затем просмотрите arguments
! Первым аргументом будет объект события обратного вызова, и это событие будет иметь объект XHR, созданный браузером в атрибуте srcElement
.
$.ajax({
url: 'https://httpbin.org/redirect-to?url=http%3A%2F%2Fexample.com%2F',
type: 'get',
success: function(data, textStatus, jqXHR) {
var caller = arguments.callee.caller;
while(caller.arguments.callee.caller != null) {
caller = caller.arguments.callee.caller;
}
console.log(caller.arguments[0]);
console.log(caller.arguments[0].srcElement.responseURL);
}
});
Предоставьте поле xhr settings для создания XMLHttpRequest и сохраните ссылку на объект. Быстрый способ сделать это - добавить его к объекту настроек (который доступен через this
в обратных вызовах).
$.ajax({
url: "/whatever",
xhr: function(){
return this._xhr = new XMLHttpRequest();
},
success: function(){
console.log("Original XHR:", this._xhr);
}
});