Side navigation
#448 closed enhancement (fixed)
Opened November 29, 2006 01:39AM UTC
Closed November 30, 2006 08:52PM UTC
Last modified June 20, 2007 01:27AM UTC
Handling Parameter Arrays
Reported by: | squinn | Owned by: | |
---|---|---|---|
Priority: | major | Milestone: | |
Component: | ajax | Version: | 1.1a |
Keywords: | Cc: | ||
Blocked by: | Blocking: |
Description
I have a situation where I have a bunch of form elements that all have the same name, and I need to submit their values to the server as a unit using that name. I also have other data that I need to submit as part of the same request, so I'm using syntax like the following:
$.post("myurl", {
someName: [1, 2, 3],
regularThing: "blah"
});
I would expect for jQuery to turn that into a URL something like:
myurl?someName=1&someName=2&someName=3®ularThing=blah
in order to follow the "normal" HTML form submission rules when more then one input element has the same name (the server side technology - in my case JSP - then normally converts the values back into an array since it sees more then one value with the same key name). Instead, jQuery is currently turning that request it into something like:
myurl?someName=1,2,3®ularThing=blah
I've changed the "param" function in my version of jQuery to handle this, and it seems to work well. Could this be added to the main distribution? The following is my updated "param" function:
Serialize an array of form elements or a set of
key/values into a query string
param: function(a) {
var s = [];
If an array was passed in, assume that it is an array
of form elements
if ( a.constructor == Array || a.jquery ) {
Serialize the form elements
for ( var i = 0; i < a.length; i++ )
s.push( a[i].name + "=" + encodeURIComponent( a[i].value ) );
Otherwise, assume that it's an object of key/value pairs
} else {
// Serialize the key/values
for ( var j in a ) {
If the value is an array then the key names need to be repeated
if(a[j].constructor == Array) {
for ( var i = 0; i < a[j].length; i++ )
s.push( j + "=" + encodeURIComponent( a[j][i] ) );
} else {
s.push( j + "=" + encodeURIComponent( a[j] ) );
}
}
}
Return the resulting serialization
return s.join("&");
}
Thanks,
-Shawn
Attachments (0)
Change History (5)
Changed November 29, 2006 01:55AM UTC by comment:1
Changed November 29, 2006 08:38PM UTC by comment:2
version: | → 1.1 |
---|
Looks good to me. If no one disagrees, it will be added to jQuery 1.1.
Changed November 29, 2006 09:49PM UTC by comment:3
Sounds like a good addition.
Some quick tests (don't worry, all of them check out):
var params = {foo:"bar", baz:42, quux:"All your base are belong to us"}; //foo=bar&baz=42&quux=All%20your%20base%20are%20belong%20to%20us var params = {someName: [1, 2, 3], regularThing: "blah" }; //someName=1&someName=2&someName=3®ularThing=blah var params = {"foo[]":["baz", 42, "All your base are belong to us"]}; foo[]=baz&foo[]=42&foo[]=All%20your%20base%20are%20belong%20to%20us var params = {"foo[bar]":"baz", "foo[beep]":42, "foo[quux]":"All your base are belong to us"}; //foo[bar]=baz&foo[beep]=42&foo[quux]=All%20your%20base%20are%20belong%20to%20us
For those wondering about the brackets, when PHP processes the param string, it will turn
foo[]=baz&foo[]=42&foo[]=All%20your%20base%20are%20belong%20to%20us
into
an array named "foo" that looks like this:
#!php $foo[0] = "baz" $foo[1] = 42 $foo[2] = "All your base are belong to us"
and
foo[bar]=baz&foo[beep]=42&foo[quux]=All%20your%20base%20are%20belong%20to%20us
into an associative array named "foo" that looks like this:
#!php $foo['bar'] = "baz" $foo['beep'] = 42 $foo['quux'] = "All your base are belong to us"
Changed November 30, 2006 02:13AM UTC by comment:4
good
Changed November 30, 2006 08:52PM UTC by comment:5
resolution: | → fixed |
---|---|
status: | new → closed |
Fixed in SVN.
Wow, that code got formatted real ugly. Here it the recommendation again more cleary: