Es posible acceder a la XMLHttpRequest objeto de que el éxito de devolución de llamada de la $.ajax() función? Específicamente necesito tener acceso a XMLHttpRequest.responseBody en IE. Por el documentación la devuelve jqXHR objeto no exponga el .responseBody propiedad.

Esto parece ser un menor de supervisión que tiene un gran impacto cuando se trata de datos binarios. Si el .responseBody de la propiedad o el subyacente XMLHttpRequest objeto no es accesible voy a tener que saltar de jQuery con ajax y el código en, el estremecimiento, javascript puro.

Actualización

Estoy hecho buscando la responceBody variable, no la responceText variable que es fácilmente accesible desde dentro de $.ajax()

InformationsquelleAutor Justin808 | 2011-06-01

5 Comentarios

  1. 8

    Puede utilizar beforeSend de devolución de llamada también:

    $.ajax({
        beforeSend: function(jqXHR, settings){
            //Here you are the XHR object
            console.log(settings.xhr());
        }
    });
    • No sé por qué esto no tiene más votos, parece que la mejor solución para mí.
    • Yo creo que es porque durante años no se podía contar con beforeSend necesariamente de trabajo para todos los navegadores. Supongo que es un asunto que ha sido fijada a lo largo del tiempo, pero creo que la gente todavía la pistola antes de utilizar cualquier caso, excepto para los más importantes, tales como el éxito y el error.
    • El proble es que ir devuelve una nueva instancia de XMLHttpRequest, en vez de las que se utilizan para la solicitud, por lo que los cambios no surtirán efecto.
  2. 6

    El xhr función de la petición ajax se puede modicar.

    $.ajax({
      ...
      xhr: function(){
        var xhr = jQuery.ajaxSettings.xhr();
        //do stuff with xhr;
        return xhr;
      }
    
    });

    O a la elaborada en Manuel Bitto la respuesta de la xhr instancia se puede acceder desde beforeSend de devolución de llamada:

    $.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. 2

    Yo también estaba mirando para conseguir en el subyacente objeto XMLHttpRequest para llegar a la ‘onprogress’ y ‘subir’ propiedades (que se encuentra en el más reciente de los navegadores que uso XMLHttpRequest2) para que yo pueda hacer nativo de progreso de la carga de manipulación en lugar de usar hacks. Después de cavar a través de jQuery fuente he encontrado que se PUEDE obtener a través de jQuery.ajaxSettings.xhr(). Es una función que devuelve un raw XMLHttpRequest.

    Ver aquí: https://github.com/jquery/jquery/blob/master/src/ajax/xhr.js

    Espero que ayude.

    • Una nueva instancia… no el que se usa para la solicitud actual
  4. 1

    Sé que esto es una vieja pregunta, pero me acaba de resolver esto.

    ¿Qué sabemos acerca de la situación? Sabemos que jQuery no pasa alrededor de la original del objeto XmlHttpRequest, ni ninguna referencias a la misma. Sabemos que en cambio si pasa alrededor de un superconjunto» que ha la mayoría de los de los atributos. Y, sabemos que jQuery todavía utiliza un XmlHttpRequest para hacer la llamada AJAX.

    Por lo tanto, si el navegador recibe una llamada y se aprobó el real XmlHttpRequest, podemos acceder a él a través de programación? El Uso De arguments.callee.caller, Sí. Nosotros. Puede.

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments/callee

    Por el tiempo de su gancho de incendios (success, fail, lo que sea), usted tiene sólo un par de garantías: Usted está en la devolución de llamada pila de llamadas, la primera función (la de devolución de llamada) tiene el XHR, y no tiene caller.

    Así, el bucle a través de la pila de llamadas (arguments.callee.caller.arguments.callee.caller...) hasta el caller es null, y luego mirar la arguments! El primer argumento será el Evento de devolución de llamada de objeto, y que el evento contará con la XHR objeto creado por el navegador en el srcElement atributo.

    $.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. 1

    Proporcionar el xhr campo de configuración para crear el XMLHttpRequest, y conservar una referencia al objeto. Una forma rápida de hacer esto es mediante la adición de la configuración del objeto (que es accesible a través de this en las devoluciones de llamada).

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

Dejar respuesta

Please enter your comment!
Please enter your name here