2010-04-27 25 views
6

Tengo la siguiente llamada AJAX, que funciona perfectamente en Firefox y Chrome, pero no IE:

function getAJAXdates(startDate, numberOfNights, opts) { 

    var month = startDate.getMonth() + 1; 
    var day  = startDate.getDate(); 
    var year = startDate.getFullYear(); 
    var d  = new Date(); 

    var randNum = Math.floor(Math.random()*100000000); 

    $.ajax({ 
     type  : "GET", 
     dataType : "json", 
     url   : "/availability/ajax/bookings?rand="+randNum,  
     cache  : false, 
     data  : 'month='+month+'&day='+day+'&year='+year+'&nights='+numberOfNights, 
     contentType : 'application/json; charset=utf8', 
     success  : function(data) { 
      console.log('@data: '+data); 
      insertCellData(data, opts, startDate); 
     }, 
     error:function(xhr, status, errorThrown) { 
      console.log('@Error: '+errorThrown); 
      console.log('@Status: '+status); 
      console.log('@Status Text: '+xhr.statusText); 
     } 
    }); 
} 

Sé que es un hecho de que toda la las variables pasan el contenido correcto y $ .ajax está de hecho pasando todos los parámetros/valores.

Esto es lo que me pasa en caso de error:

REGISTRO: @error: undefined REGISTRO: @status: parsererror REGISTRO: @status texto: OK

Estoy consciente del problema de caché IE e implementado un parámetro aleatorio para aclararlo.

Aquí es el JSON i regrese (soy capaz de verlo con Charles)

{ 
    "availability":[ 
     { 
     "inventory_id":"5", 
     "booking_id":"21", 
     "start_date":"05-01-2010", 
     "number_nights":4, 
     "text":"deFrancisco, Martin - $500.00 ACTIVE", 
     "type":"BOOKING" 
     } 
    ] 
} 

Finalmente estos son los encabezados que se envían de vuelta desde el servidor:

header('Content-Type: application/json; charset=utf8'); 
header("Cache-Control: no-cache"); 
header("Expires: 0"); 
header('Access-Control-Max-Age: 3628800'); 
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE'); 

Cualquier ideas?

Respuesta

4

me gustaría comentar el contentType y añadir tipoDatos: "json"

de http://api.jquery.com/jQuery.ajax/

tipoDatos: El tipo de datos que usted está esperando respuestas del servidor.

contentType: Al enviar datos al servidor, use este tipo de contenido.

indica que está enviando json, pero no lo está - quizás este es el problema?

+0

agregué contentType para ver si resuelve el problema pero no funciona incluso sin él. gracias – Sam3k

1

La mayoría de las veces, los errores de análisis específicos de IE se deben a comas adicionales. Por ejemplo, [1, 2, 3,] es válido en FF pero no en IE. De todos modos, debe pegar en la respuesta JSON, es imposible decir el problema sin eso.

+0

el objeto JSON parece estar bien. Lo agregué a mi pregunta original para que pueda echar un vistazo. – Sam3k

0

Compruebe si su página simplemente devuelve OK o si devuelve 'OK'. Solo 'OK' es JSON válido. Use una herramienta como JSONLint para verificar el valor que proviene de la solicitud.

+0

el JSON pasó la prueba JSONLint. Obtengo un mensaje "HTTP/1.1 200 OK" – Sam3k

0

¿Qué pasa si simplemente escribe alert(data); o var myObject = eval('(' + data + ')');?

Y si se llama a la función directamente desde el navegador escribiendo en la barra de direcciones de su llamada AJAX con todos los parámetros en "obtener" (& param1 = param1value & param2 = ...)? Deberías poder leer la respuesta.

Algo en la respuesta JSON está volviendo loca a IE.

0

¿Qué versión de jQuery estás usando?

Si comprueba el código de jquery, se lanza parsererror cuando se llama a jQuery.httpData().Aquí está el código de jQuery:

if (status === "success") { 
    // Watch for, and catch, XML document parse errors 
    try { 
    // process the data (runs the xml through httpData regardless of callback) 
    data = jQuery.httpData(xhr, s.dataType, s); 
    } catch(err) { 
    status = "parsererror"; 
    errMsg = err; 
    } 
} 

Tal jQuery.httpData() es digno de mirar. Es decir, puede verificar si se llama a jQuery.parseJSON y si realmente devuelve un objeto.

if (typeof data === "string") { 
    // Get the JavaScript object, if JSON is used. 
    if (type === "json" || !type && ct.indexOf("json") >= 0) { 
    console.log(data); //add this 
    data = jQuery.parseJSON(data); 
    console.log("data parsed successfully"); //add this 
1

También he encontrado un problema similar con $ .ajax() (jquery v1.4.2). No está funcionando en IE8, mientras que en Firefox está funcionando.

Sin embargo, he notado desde la barra de herramientas de depuración IE8 que mi página está en modo peculiar. Por lo tanto, forzosamente hago que funcione en modo estándar insertando este doctype <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">. De repente, el $ .ajax() funciona!

Realmente no entiendo sobre peculiaridades/modo estándar, pero la palabra "estándar" de alguna manera se siente más cerca de Firefox o Chrome, en lugar de IE. Así que así fue como entendí la idea.

@see http://en.wikipedia.org/wiki/Quirks_mode

Cuestiones relacionadas