2010-05-12 5 views
0

J'ai une application de chat très simple sur un site qui fonctionne très bien.Jquery JSON .each() ne fonctionne pas dans Google Chrome

Elle prie par ajax comme ceci:

$.ajax({ 
url: "fetch/"+CHAT_SESSION_ID+"/"+LAST_MESSAGE_ID, 
dataType: "json", 
cache: false, 
success: function(data) { 
    if (data.session_active == 0) { //If other chatter ended session 
      alert("Session Ended"); 
    } 
    else 
    { 
      $.each(data.messages, function(i,msg){ 
       alert(msg.message.Body); 
      )}; 
     } 
    } 
}); 

et obtient une réponse JSON qui lookes comme ceci:

{ "session_active": "1", "messages": [ {"message": {"MsgID": "100", "UserID": "1", "Body": "heyy"}}, ]} 

Il fonctionne très bien dans au moins FF et Saf mais dans Chrome n'a jamais passe le .each! Cela me rend fou, j'ai essayé tout ce que j'ai rencontré en ligne pendant des jours, mais je n'arrive pas à faire les choses correctement.

Aidez quelqu'un! Je peux fournir un serveur de tests si quelqu'un veut le lancer lui-même;)

+1

Avez-vous essayé de le déboguer dans Firebug (extension firefox)? Il pourrait effectivement montrer un avertissement ou une erreur même si elle fonctionne dans Firefox. –

+0

Essayez également les outils de développement en allant dans le menu dans le coin supérieur droit de l'écran dans Chrome et aller "Développeur -> Outils de développement". Le bouton "show console" en bas à gauche de l'écran ou l'un des onglets, tels que "Resources", peut vous aider à vous assurer que le mime/encodage des données JSON est correctement identifié. – cryo

Répondre

4

Peut-être que la virgule de fin dans votre tableau de messages cause un problème. Voir les réponses à la question suivante:

Can you use a trailing comma in a JSON object?

+0

ya, semble être mal formé – Jason

+0

+ 1, pas sûr si c'est le problème réel, mais il va exploser dans IE – jvenema

+0

Awesome! Doit avoir été cette virgule, n'a pas pris la peine de l'enlever, car il semblait fonctionner dans tous les autres navigateurs. – gust1n

0

possible mimetype incorrect: Si vous regardez le code d'analyse syntaxique de jQuery, il semble que si les données JSON n'est pas une chaîne passée à $.parseJSON(data) il retourne null . Cela peut poser un problème, car si le type MIME de la réponse AJAX est incorrectement identifié par Chrome et n'interprète pas la réponse AJAX comme du texte, il renvoie null et transmet donc null à la fonction AJAX. Le mimetype servi avec la réponse AJAX (ou peut-être son absence) peut donc être aussi le problème:

parseJSON: function(data) { 
    if (typeof data !== "string" || !data) { 
     return null; 
    } 

    // Make sure leading/trailing whitespace is removed (IE can't handle it) 
    data = jQuery.trim(data); 

    // Make sure the incoming data is actual JSON 
    // Logic borrowed from http://json.org/json2.js 
    if (/^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@") 
     .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]") 
     .replace(/(?:^|:|,)(?:\s*\[)+/g, ""))) { 

     // Try to use the native JSON parser first 
     return window.JSON && window.JSON.parse ? 
      window.JSON.parse(data) : 
      (new Function("return " + data))(); 

    } else { 
     jQuery.error("Invalid JSON: " + data); 
    } 
}, 

malformée JSON: L'autre raison pour laquelle cela pourrait fonctionner dans Firefox et les autres navigateurs, mais pas Google Chrome est la fonction d'analyse jQuery tente d'utiliser la fonction native window.JSON.parse(data) sur new Function("return " + data) si l'analyse JSON native est disponible dans ce navigateur.

L'analyse syntaxique de Google Chrome est peut-être plus stricte que celle de Firefox qui consiste à utiliser des virgules comme indiqué par la norme au http://www.json.org/ comme indiqué dans la réponse de Danilo Celic.

Questions connexes