]> source.dussan.org Git - jquery.git/commitdiff
Fix #12134. Make .serialize() HTML5-compliant; provide a propHook for shimming.
authorDave Methvin <dave.methvin@gmail.com>
Sun, 25 Nov 2012 19:54:07 +0000 (14:54 -0500)
committerDave Methvin <dave.methvin@gmail.com>
Sun, 25 Nov 2012 19:54:07 +0000 (14:54 -0500)
src/serialize.js

index b81c15212692ad82600c17f8b24296c922af17c4..0e1624926b05fe1857edf5aa996d69509d96b13f 100644 (file)
@@ -1,8 +1,9 @@
 var r20 = /%20/g,
        rbracket = /\[\]$/,
        rCRLF = /\r?\n/g,
-       rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
-       rselectTextarea = /^(?:select|textarea)/i;
+       rcheckTypes = /^(?:checkbox|radio)$/i,
+       rsubmitterTypes = /^(?:submit|button|image|reset)$/i,
+       rsubmittable = /^(?:select|textarea|input|keygen)/i;
 
 jQuery.fn.extend({
        serialize: function() {
@@ -10,12 +11,16 @@ jQuery.fn.extend({
        },
        serializeArray: function() {
                return this.map(function(){
-                       return this.elements ? jQuery.makeArray( this.elements ) : this;
+                       // Can add propHook for "elements" to filter or add form elements
+                       var elements = jQuery.prop( this, "elements" );
+                       return elements ? jQuery.makeArray( elements ) : this;
                })
                .filter(function(){
-                       return this.name && !this.disabled &&
-                               ( this.checked || rselectTextarea.test( this.nodeName ) ||
-                                       rinput.test( this.type ) );
+                       var type = this.type;
+                       // Use .is(":disabled") so that fieldset[disabled] works
+                       return this.name && !jQuery( this ).is( ":disabled" ) &&
+                               rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
+                               ( this.checked || !rcheckTypes.test( type ) );
                })
                .map(function( i, elem ){
                        var val = jQuery( this ).val();
@@ -77,13 +82,7 @@ function buildParams( prefix, obj, traditional, add ) {
                                add( prefix, v );
 
                        } else {
-                               // If array item is non-scalar (array or object), encode its
-                               // numeric index to resolve deserialization ambiguity issues.
-                               // Note that rack (as of 1.0.0) can't currently deserialize
-                               // nested arrays properly, and attempting to do so may cause
-                               // a server error. Possible fixes are to modify rack's
-                               // deserialization algorithm or to provide an option or flag
-                               // to force array serialization to be shallow.
+                               // Item is non-scalar (array or object), encode its numeric index.
                                buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
                        }
                });