2010-03-24 5 views
5

Mon code a bien fonctionné dans JQuery 1.3.2, mais dans 1.4.2 il semble être cassé. Ce qu'il devrait faire dans le poste est quelque chose comme ceci:Dans JQuery 1.4.2 .ajax convertit JSON incorrect

?pks=108;pks=107 

Ce que j'obtiens maintenant est:

?pks[]=108;pks[]=107; 

Quand je trace ce code à travers, l'objet JSON semble être bien jusqu'à son entrée. ajax. Firebug, après la réponse est reçue, montre le poste était:

Parameters application/x-www-form-urlencoded 
pks[] 108 
pks[] 107 
Source 
pks%5B%5D=108&pks%5B%5D=107 

Ce qui est pas ce que je suis sur JQuery 1.3.2. D'où viennent ces accolades supplémentaires?

+0

Pouvez-vous envoyer votre code s'il vous plaît. –

+0

Votre ligne source est erronée, d'où proviennent les parenthèses. Vous pouvez utiliser quelque chose comme fiddler pour voir ce qui est réellement retourné depuis le serveur web. –

+0

Comme il s'est avéré que je n'avais rien de mal, car il a cassé quand j'ai mis à jour de jQuery 1.3.2 à 1.4.2. Il semble que jQuery a changé de comportement, voir la réponse ci-dessous. – cnobile

Répondre

8

JQuery 1.4 released a change pour Sérialisation de paramètres imbriqués. De leur site:

jQuery 1.4 ajoute la prise en charge de la sérialisation param imbriquée dans jQuery.param, en utilisant l'approche popularisée par PHP et supportée par Ruby on Rails. Par exemple, {foo: ["bar", "baz"]} sera sérialisé comme "foo [] = bar & foo [] = baz".

Dans jQuery 1.3, {foo: ["bar", "baz"]} a été sérialisé en tant que "foo = bar & foo = baz". Cependant, il n'y avait aucun moyen d'encoder un tableau à un seul élément en utilisant cette approche. Si vous avez besoin de l'ancien comportement, vous pouvez le réactiver en définissant le paramètre Ajax traditionnel (globalement via jQuery.ajaxSettings.traditional ou au cas par cas via le drapeau traditionnel).

Les [] supports sont normalement utilisés pour indiquer un tableau, et cela semble être ce qu'ils essaient de faire plus évident ici, je pense (comme votre chaîne de requête peut être lue pour voir qu'une valeur est écrasée par l'autre).

Modifier: Je pense que vous pourriez probablement suivre leur suggestion d'utiliser soit:

// Globally set it to use the old 1.3.* way of doing things. 
jQuery.ajaxSettings.traditional = true; 

// Enables the 1.3.* way for a single Ajax request only 
$.ajax({ data: stuff, traditional: true }); 
+1

Intéressant, je ne savais pas qu'il y avait un changement dans la façon dont cela se faisait. Je peux facilement résoudre le problème dans mon code Django en recherchant: request.POST.get ('PKS []) au lieu de: request.POST.get ('PKS'). Django me donne la liste correctement. Le seul problème que je vois avec ce changement est que le code du framework dépend maintenant du comportement idiosyncratique de la boîte à outils JavaScript, JQuery dans ce cas. – cnobile