JQuery $.ajax() - доступ к объекту XMLHttpRequest

Можно ли получить доступ к объекту XMLHttpRequest из обратного вызова успеха функции $.ajax()? В частности, мне нужен доступ к XMLHttpRequest.responseBody в IE. В документации возвращаемый объект jqXHR не предоставляет свойство .responseBody.

Это, по-видимому, незначительный недостаток, который имеет огромное влияние при работе с двоичными данными. Если свойство .responseBody или базовый объект XMLHttpRequest недоступен, мне придется пропустить jQuery для ajax и закодировать его, дрожать, чистить javascript.

Update

Я искал переменную responceBody, а не переменную responceText, которая легко доступна из $.ajax()

Ответ 1

Вы также можете использовать обратный вызов beforeSend:

$.ajax({
    beforeSend: function(jqXHR, settings){
        // Here you are the XHR object
        console.log(settings.xhr());
    }
});

Ответ 2

Функция 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);
  }
});

Ответ 3

Я тоже хотел найти базовый объект XMLHttpRequest для доступа к свойствам onprogress и upload (найденным в более поздних браузерах, использующих XMLHttpRequest2), чтобы я мог выполнять собственную обработку перехода к загрузке использования хаков. После перекопа через источник jQuery я обнаружил, что вы можете получить его через jQuery.ajaxSettings.xhr(). Это функция, которая возвращает необработанный XMLHttpRequest.

Смотрите здесь: https://github.com/jquery/jquery/blob/master/src/ajax/xhr.js

Надеюсь, что это поможет.

Ответ 4

Я знаю, что это старый вопрос, но я просто решил его.

Что мы знаем о ситуации? Мы знаем, что 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);
  }
});

Ответ 5

Предоставьте поле xhr settings для создания XMLHttpRequest и сохраните ссылку на объект. Быстрый способ сделать это - добавить его к объекту настроек (который доступен через this в обратных вызовах).

$.ajax({
    url: "/whatever",
    xhr: function(){
        return this._xhr = new XMLHttpRequest();
    },
    success: function(){
        console.log("Original XHR:", this._xhr);
    }
});