2010-06-05 6 views
0

Mon appel ajax jQuery échoue avec une erreur non définie. Mon code js ressemble à ceci:L'appel ajax jQuery échoue avec une erreur indéfinie

$.ajax({ 
    type: "POST", 
    url: "Data/RealTime.ashx", 
    data: "{}", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    timeout: 15000, 
    dataFilter: function(data, type) { 
     alert("RAW DATA: " + data + ", TYPE: "+ type); 
     return data; 
    }, 
    error: function(xhr, textStatus, errorThrown) { 
     alert("FAIL: " + xhr + " " + textStatus + " " + errorThrown); 
    }, 
    success: function(data) { 
     alert("SUCCESS"); 
    } 
}); 

Ma ajax source est un gestionnaire d'ASP.NET générique:

[WebService(Namespace = "http://my.website.com")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
public class RealTime : IHttpHandler 
{ 
    public void ProcessRequest(HttpContext context) 
    { 
     context.Response.ContentType = "application/json"; 
     context.Response.Write("{ data: [1,2,3] }"); 
     context.Response.End(); 
    } 

    public bool IsReusable 
    { get { return false; } } 
} 

Maintenant, si je retourne un objet vide ("{ }") dans mon gestionnaire, l'appel réussir. Mais quand je retourne un autre objet JSON, l'appel échoue.

Le gestionnaire dataFilter montre que je reçois un objet correct. Firebug affiche la réponse comme prévu, et l'onglet JSON montre que l'objet est analysé correctement.

Alors, quelle pourrait être la cause?

[Modifier] j'aurais fait écrit « quand je reviens tout invalide objet JSON, l'appel échoue »! : D

+2

Ce que vous avez n'est pas valide JSON, qu'est-ce que vous obtenez quand vous le changez: 'context.Response.Write (" {\ "data \": [1,2,3]} "); –

+0

Merci beaucoup, ça l'a fait. Firebug est évidemment un peu moins strict sur l'analyse, donc je n'y ai pas pensé du tout. Vous pouvez copier ceci dans une réponse pour que je puisse l'accepter. – Groo

+0

Firebug n'analyse pas * JSON *, il analyse * Javascript * - il y a une différence. Si vous aviez utilisé Firebug pour passer cette chaîne dans une implémentation Javascript d'un analyseur JSON strict, vous auriez eu des erreurs. – Pointy

Répondre

2

Vous avez besoin d'un JSON valide! :)

Modifier cette ligne:

context.Response.Write("{ data: [1,2,3] }"); 

à ceci:

context.Response.Write("{ \"data\": [1,2,3] }"); 

jQuery 1.4+ ne tolère pas JSON invalide comme autrefois (échoue silencieusement/de manière étrange), alors il suffit d'ajouter les guillemets doubles et vous êtes tous ensemble. Pour un outil pratique pour tester la validité JSON, checkout JSONLint:

+0

Oui, la dernière fois que j'ai utilisé ce truc était avec jQuery 1.3.2, et cela a fonctionné. C'est marrant, il ne m'est jamais venu à l'idée d'essayer le vieux projet et de voir ce qu'il se passe. :) – Groo

+0

Les cadres sont devenus plus stricts ... – Pointy

+0

@Groo - Ah ouais c'est le problème le plus commun avec ceux-ci, mais comme @Pointy dit qu'ils sont plus stricts ... mais pour une raison, c'est si le 'JSON natif Fonction .parse' est présent, nous pouvons utiliser l'implémentation beaucoup plus rapide du navigateur pour faire le travail, gagner pour tout le monde une fois que tous les navigateurs supportent la propriété, jQuery est juste l'emballage jusque-là :) –