2010-04-27 6 views
6

Je l'appel ajax suivant qui fonctionne parfaitement dans Firefox et Chrome, mais pas 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); 
     } 
    }); 
} 

Je sais pertinemment que tous les les variables passent le bon contenu et $ .ajax passe en effet tous les paramètres/valeurs.

C'est ce que je reçois en cas d'erreur:

LOG: @Error: non défini LOG: @Status: parsererror LOG: @Status Texte: OK

Je suis au courant du problème de cache IE et mis en œuvre un paramètre aléatoire pour l'effacer.

est le JSON je reviens ici (je suis en mesure de le voir avec Charles)

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

Enfin ce sont les têtes qui sont envoyés à partir du back-end de retour:

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'); 

Tous des idées?

Répondre

4

Je commenter le contentType et ajouter dataType: "JSON"

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

dataType: Le type de données que vous vous attendez à partir du serveur.

contentType: Lors de l'envoi de données au serveur, utilisez ce type de contenu.

vous indiquez que vous envoyez JSON, mais vous n'êtes pas - peut-être c'est la question?

+0

J'ai ajouté contentType pour voir si cela résout le problème mais cela ne fonctionne pas même avec. merci – Sam3k

1

La plupart du temps, les erreurs d'analyse spécifiques à IE sont causées par des virgules supplémentaires. Par exemple, [1, 2, 3,] est valide dans FF mais pas dans IE. Quoi qu'il en soit, vous devez coller dans la réponse JSON, il est impossible de dire le problème sans cela.

+0

l'objet JSON semble être ok. Je l'ai ajouté à ma question originale afin que vous puissiez jeter un coup d'oeil. – Sam3k

0

Vérifiez si votre page, retourne OK ou si elle retourne 'OK'. Seul 'OK' est JSON valide. Utilisez un outil tel que JSONLint pour vérifier la valeur provenant de la demande.

+0

le JSON a passé le test JSONLint. Je reçois un "HTTP/1.1 200 OK" retour – Sam3k

0

Que faire si vous tapez simplement alert(data); ou var myObject = eval('(' + data + ')');?

Et si vous appelez la fonction directement à partir du navigateur en tapant sur la barre URL de votre appel ajax avec tous les paramètres « get » (& param1 = param1value & param2 = ...)? Vous devriez être capable de lire la réponse.

Quelque chose en réponse JSON rend IE fou.

0

Quelle version de jQuery utilisez-vous?

Si vous vérifiez le code jquery, parsererror est levée lorsque jQuery.httpData() est appelée.Voici le code 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; 
    } 
} 

Peut-être jQuery.httpData() est intéressant de regarder. Autrement dit, vous pouvez vérifier si jQuery.parseJSON est appelée et si elle renvoie effectivement un objet.

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

J'ai aussi rencontré un problème similaire avec un peu .ajax $() (jquery v1.4.2). Cela ne fonctionne pas dans IE8, alors que Firefox fonctionne.

Cependant, j'ai remarqué à partir de la barre d'outils de débogage IE8 que ma page est en mode quirks. Donc, je le force à travailler en mode standard en insérant ce doctype <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">. Soudain, le $ .ajax() fonctionne!

Je ne comprends pas vraiment les quirks/mode standard mais le mot "standard" se sent quelque peu plus proche de Firefox ou Chrome, plutôt que IE. C'est comme ça que j'ai eu l'idée.

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

Questions connexes