2014-06-29 4 views
1

L'appel ajax ci-dessous soumet des données de formulaire et reçoit les commentaires d'un serveur sous la forme d'un objet/tableau codé json. Fonctionne sur IE10, et les dernières versions de FF et Chrome.IE8 et Jquery .post ajax call ne fonctionnant pas

Ne fonctionne pas dans IE8. En utilisant les outils de développement IE8, je pouvais voir que le tableau json était effectivement retourné depuis mon serveur vers mon navigateur. Cependant, à la ligne avec l'instruction "$ .each", il ignore complètement cette boucle, comme s'il n'y avait pas de données dans la réponse ajax.

Est-ce que quelqu'un sait quel est le problème? J'ai lu d'autres forums suggérés en utilisant datatype = json, mais je ne sais pas comment l'intégrer dans mon code. D'autres ont suggéré de changer .post à .ajax. Mais je ne veux pas faire de changements avant de comprendre pourquoi IE8 échoue à cela.

$.post("<?php echo Router::url(array('controller'=>'Bookings','action'=>'saveBooking_ajax')); ?>", $(".reservationform").serialize(), function() { 

      }) 
       .done(function(data) { 

        parseddata = JSON.parse(data); 

        //IE8 totally skips this next part even if parseddata has data 
        $.each(parseddata, function(key, value) { 
         if (key == "status") status = value; 
         if (key == "message") message = value; 
         if (key == "failuretype") failuretype = value; 
         if (key == "bookingref") bookingref = value; 
        }); 

exemple de réponse de retour du serveur:

{"status":true,"failtype":"USER","message":"","timeslots":[[{"18:00:00":"6:00 pm"},{"18:10:00":"6:10 pm"},{"18:20:00":"6:20 pm"},{"18:30:00":"6:30 pm"},{"18:40:00":"6:40 pm"},{"19:20:00":"7:20 pm"},{"19:30:00":"7:30 pm"},{"19:40:00":"7:40 pm"},{"20:20:00":"8:20 pm"},{"20:30:00":"8:30 pm"},{"20:40:00":"8:40 pm"}]]} 

REPONDRE A L'AIDE @BARMAR RÉPONSE

J'ai changé le code pour utiliser le paramètre "JSON" dans le cadre de mon. post-appel.

Je crois que cela analyse automatiquement le retour en tant qu'objet json, donc je n'ai plus besoin d'appeler JSON.parse (data) dans la fonction done(). JSON.parse (data) ne fonctionne pas dans IE8 de toute façon. Notez que je n'ai pas essayé d'utiliser "$ .parseJSON()" comme suggéré par Barmar.

  //parseddata = JSON.parse(data); 

également directement suggesed je puis Accession à la variables d'objet de retour:

  status = data.status; 
      message = data.message; 
      failtype = data.failtype; 
      timeslots = data.timeslots; 

Cela semble fonctionner dans la plupart des cas. Mais ne fonctionne pas dans IE8 pour variable "Status"! parce que la variable "status" a été typée comme une chaîne sans valeur pour une raison quelconque, et ne peut pas passer la valeur de data.status qui est une vraie valeur booléenne non-chaîne. Par conséquent, la variable "status" reste comme "". D'autres variables semblent bien. Ceci est étrange car cela fonctionne sur d'autres navigateurs modernes, la variable "status" est déjà typée comme une chaîne vide "", et malgré data.status = true, elle attribue avec succès la valeur à "status", ce qui donne variable "status" la version chaîne de la valeur booléenne "true". Désolé, mais malgré l'impossibilité d'IE8 d'avoir une valeur booléenne pure pour une variable de chaîne, je pense que je devrais arrêter d'utiliser "status" comme nom de variable pour le fait que quelque part inconnu est déjà tapé et initialisé comme "". Voir l'écran de débogage dans firefox où var "status" est mystérieusement pré-tapé comme une chaîne vide. Les mêmes spectacles dans IE. J'ai également réalisé que je devrais déclarer des variables dans les rappels en utilisant "var". Ne pas utiliser var leur avait permis d'avoir une portée globale et conservaient les mêmes valeurs que les rappels précédents.

Quoi qu'il en soit, je réponds à cette question en réponse à la question originale.

Répondre

3

Je ne pense pas IE8 a JSON.parse(). Utilisez $.parseJSON(). Ou spécifiez l'argument datatype à `$.après:

$.post("url", $(".reservationform").serialize, "json") 
    .done(function(parseddate) { 
     status = parseddata.status; 
     message = parseddata.message; 
     failuretype = parseddata.failuretype; 
     bookingref = parseddata.bookingref; 
}); 

Vous n'avez pas besoin d'utiliser $.each() pour lire les valeurs hors des données. C'est un objet Javascript, il suffit d'accéder directement aux propriétés.

+0

désolé mais puis-je vous demander de me montrer un exemple de la façon d'accéder directement aux données? J'ai édité mon poste pour montrer un exemple de message de retour – aDvo

+0

Je voudrais ajouter une vérification pour voir si le format de données est correct: status = (parseddata.status && parseddata.status! == null)? parseddata.status: null; – frenchie

+0

@aDvo Ma réponse montre comment accéder directement aux données, en utilisant 'parseddata.status', etc. – Barmar