diff options
author | Dave Methvin <dave.methvin@gmail.com> | 2012-11-25 14:54:07 -0500 |
---|---|---|
committer | Dave Methvin <dave.methvin@gmail.com> | 2012-11-25 14:54:07 -0500 |
commit | ae215fdcf843862dbddbdfd68117ac2926e35a42 (patch) | |
tree | 13111e35d580f46ea94f8a73077f15f9b665062f /src/serialize.js | |
parent | a938d7b1282fc0e5c52502c225ae8f0cef219f0a (diff) | |
download | jquery-ae215fdcf843862dbddbdfd68117ac2926e35a42.tar.gz jquery-ae215fdcf843862dbddbdfd68117ac2926e35a42.zip |
Fix #12134. Make .serialize() HTML5-compliant; provide a propHook for shimming.
Diffstat (limited to 'src/serialize.js')
-rw-r--r-- | src/serialize.js | 25 |
1 files changed, 12 insertions, 13 deletions
diff --git a/src/serialize.js b/src/serialize.js index b81c15212..0e1624926 100644 --- a/src/serialize.js +++ b/src/serialize.js @@ -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 ); } }); |