aboutsummaryrefslogtreecommitdiffstats
path: root/src/ajax
diff options
context:
space:
mode:
authorJohn Resig <jeresig@gmail.com>2007-09-05 17:06:05 +0000
committerJohn Resig <jeresig@gmail.com>2007-09-05 17:06:05 +0000
commitf96bf1041553775a94c1034c97e253e350217173 (patch)
treeec325ec45526f3caddac0157f98645ca7aaad64c /src/ajax
parentf28f199dc0a353135ef8b9afa2f3d25c6ffd2c75 (diff)
downloadjquery-f96bf1041553775a94c1034c97e253e350217173.tar.gz
jquery-f96bf1041553775a94c1034c97e253e350217173.zip
Integration of Mike Alsup's excellent form serialization code. The benefits are as follows:
- New method: .serializeArray() This returns an array of name/value pairs representing the contents of a form, or individual input elements. - Enhancement: .serialize() The results are correct now (as opposed to the mess from before), and allows you to serializes forms directly (rather than just the input elements). - Enhancement: .val() This now returns the correct value when dealing wih selects. Additionally, when dealing with multiple selects, it returns an array of values. Based upon Mike's code: http://malsup.com/jquery/form/comp/form.js and test suite: http://malsup.com/jquery/form/comp/test.html
Diffstat (limited to 'src/ajax')
-rw-r--r--src/ajax/ajax.js24
-rw-r--r--src/ajax/ajaxTest.js32
2 files changed, 46 insertions, 10 deletions
diff --git a/src/ajax/ajax.js b/src/ajax/ajax.js
index dd54d0c30..ffe30481d 100644
--- a/src/ajax/ajax.js
+++ b/src/ajax/ajax.js
@@ -62,9 +62,25 @@ jQuery.fn.extend({
},
serialize: function() {
- return jQuery.param( this );
- }
-
+ return jQuery.param(this.serializeArray());
+ },
+ serializeArray: function() {
+ return this.map(function(){
+ return jQuery.nodeName(this, "form") ?
+ jQuery.makeArray(this.elements) : this;
+ })
+ .filter(function(){
+ return this.name && !this.disabled &&
+ (this.checked || /select|textarea/i.test(this.nodeName) ||
+ /text|hidden|password/i.test(this.type));
+ })
+ .map(function(i, elem){ var val = jQuery(this).val();
+ return val == null ? null :
+ val.constructor == Array ?
+ jQuery.map( val, function(i, val){ return {name: elem.name, value: val};
+ }) :
+ {name: elem.name, value: val};
+ }).get(); }
});
// Attach a bunch of functions for handling common AJAX events
@@ -440,7 +456,7 @@ jQuery.extend({
s.push( encodeURIComponent(j) + "=" + encodeURIComponent( a[j] ) );
// Return the resulting serialization
- return s.join("&");
+ return s.join("&").replace(/%20/g, "+");
}
});
diff --git a/src/ajax/ajaxTest.js b/src/ajax/ajaxTest.js
index c694cc127..f158bae21 100644
--- a/src/ajax/ajaxTest.js
+++ b/src/ajax/ajaxTest.js
@@ -3,7 +3,7 @@ module("ajax");
// Safari 3 randomly crashes when running these tests,
// but only in the full suite - you can run just the Ajax
// tests and they'll pass
-if ( !jQuery.browser.safari ) {
+//if ( !jQuery.browser.safari ) {
test("$.ajax() - success callbacks", function() {
expect( 8 );
@@ -163,11 +163,31 @@ test("$.ajax - dataType html", function() {
});
test("serialize()", function() {
- expect(1);
- // ignore button, IE takes text content as value, not relevant for this test
- equals( $(':input').not('button').serialize(),
- 'action=Test&text2=Test&radio1=on&radio2=on&check=on&=on&hidden=&foo%5Bbar%5D=&name=name&=foobar&select1=&select2=3&select3=1&test=&id=',
+ expect(6);
+
+ equals( $('#form').serialize(),
+ "action=Test&radio2=on&check=on&hidden=&foo%5Bbar%5D=&name=name&select1=&select2=3&select3=0&select3=1",
+ 'Check form serialization as query string');
+
+ equals( $('#form :input').serialize(),
+ "action=Test&radio2=on&check=on&hidden=&foo%5Bbar%5D=&name=name&select1=&select2=3&select3=0&select3=1",
+ 'Check input serialization as query string');
+
+ equals( $('#testForm').serialize(),
+ 'T3=%3F%0AZ&H1=x&H2=&PWD=&T1=&T2=YES&My+Name=me&S1=abc&S3=YES&S4=',
'Check form serialization as query string');
+
+ equals( $('#testForm :input').serialize(),
+ 'T3=%3F%0AZ&H1=x&H2=&PWD=&T1=&T2=YES&My+Name=me&S1=abc&S3=YES&S4=',
+ 'Check input serialization as query string');
+
+ equals( $('#form, #testForm').serialize(),
+ "action=Test&radio2=on&check=on&hidden=&foo%5Bbar%5D=&name=name&select1=&select2=3&select3=0&select3=1&T3=%3F%0AZ&H1=x&H2=&PWD=&T1=&T2=YES&My+Name=me&S1=abc&S3=YES&S4=",
+ 'Multiple form serialization as query string');
+
+ equals( $('#form, #testForm :input').serialize(),
+ "action=Test&radio2=on&check=on&hidden=&foo%5Bbar%5D=&name=name&select1=&select2=3&select3=0&select3=1&T3=%3F%0AZ&H1=x&H2=&PWD=&T1=&T2=YES&My+Name=me&S1=abc&S3=YES&S4=",
+ 'Mixed form/input serialization as query string');
});
test("$.param()", function() {
@@ -618,4 +638,4 @@ test("custom timeout does not set error message when timeout occurs, see #970",
}
-}
+//}