2010-03-24 18 views
5

Mi código funcionó bien en JQuery 1.3.2, pero en 1.4.2 parece estar roto. Lo que debe recibir en el post es algo como esto:En JQuery 1.4.2 .ajax convierte JSON incorrectamente

?pks=108;pks=107 

lo que ahora se ve es:

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

Cuando Trazo este código a través, el objeto JSON parece estar bien hasta que entra. ajax Firebug, después de recibir la respuesta, se muestra el mensaje fue:

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

que no es lo que tengo en jQuery 1.3.2. ¿De dónde provienen esos aparatos adicionales?

+0

Podría publicar su código por favor. –

+0

Su línea fuente está equivocada, que es de donde provienen los corchetes. Es posible que desee utilizar algo como violinista para ver lo que realmente se devuelve desde el servidor web. –

+0

Resulta que no tenía nada de malo ya que se rompió cuando actualicé de jQuery 1.3.2 a 1.4.2. Parece que jQuery ha cambiado su comportamiento, ver respuesta a continuación. – cnobile

Respuesta

8

JQuery 1.4 released a change para serialización de parametros anidados. Desde su sitio:

jQuery 1.4 agrega soporte para la serialización de param anidada en jQuery.param, utilizando el enfoque popularizado por PHP y soportado por Ruby on Rails. Por ejemplo, {foo: ["bar", "baz"]} se serializará como "foo [] = bar & foo [] = baz".

En jQuery 1.3, {foo: ["bar", "baz"]} se serializó como "foo = bar & foo = baz". Sin embargo, no había forma de codificar un Array de un solo elemento utilizando este enfoque. Si necesita el comportamiento antiguo, puede volver a activarlo configurando la configuración Ajax tradicional (globalmente a través del jQuery.ajaxSettings.traditional o caso por caso mediante la bandera tradicional).

Los [] soportes se utilizan normalmente para indicar una matriz, y esto parece ser lo que están tratando de hacer más evidente aquí creo que (como su cadena de consulta podría ser leído al ver que un valor se sobrescribe por el otro).

Editar: creo que probablemente podría seguir su sugerencia de utilizar ya sea:

// 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

Interesante, no sabía que había un cambio en cómo se estaba haciendo esto. Puedo resolver fácilmente el problema en mi código de Django mediante la búsqueda de: request.POST.get (PKS [] ') en lugar de: request.POST.get (PKS ''). Django me da la lista correctamente. El único problema que veo con este cambio es que el código de marco ahora depende del comportamiento idiosincrásico del kit de herramientas de JavaScript, JQuery en este caso. – cnobile

Cuestiones relacionadas