mirror of
https://github.com/jquery/jquery.git
synced 2024-11-23 02:54:22 +00:00
102 lines
3.1 KiB
JavaScript
102 lines
3.1 KiB
JavaScript
|
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;
|
||
|
|
||
|
jQuery.fn.extend({
|
||
|
serialize: function() {
|
||
|
return jQuery.param( this.serializeArray() );
|
||
|
},
|
||
|
serializeArray: function() {
|
||
|
return this.map(function(){
|
||
|
return this.elements ? jQuery.makeArray( this.elements ) : this;
|
||
|
})
|
||
|
.filter(function(){
|
||
|
return this.name && !this.disabled &&
|
||
|
( this.checked || rselectTextarea.test( this.nodeName ) ||
|
||
|
rinput.test( this.type ) );
|
||
|
})
|
||
|
.map(function( i, elem ){
|
||
|
var val = jQuery( this ).val();
|
||
|
|
||
|
return val == null ?
|
||
|
null :
|
||
|
jQuery.isArray( val ) ?
|
||
|
jQuery.map( val, function( val, i ){
|
||
|
return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
|
||
|
}) :
|
||
|
{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
|
||
|
}).get();
|
||
|
}
|
||
|
});
|
||
|
|
||
|
//Serialize an array of form elements or a set of
|
||
|
//key/values into a query string
|
||
|
jQuery.param = function( a, traditional ) {
|
||
|
var prefix,
|
||
|
s = [],
|
||
|
add = function( key, value ) {
|
||
|
// If value is a function, invoke it and return its value
|
||
|
value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
|
||
|
s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
|
||
|
};
|
||
|
|
||
|
// Set traditional to true for jQuery <= 1.3.2 behavior.
|
||
|
if ( traditional === undefined ) {
|
||
|
traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
|
||
|
}
|
||
|
|
||
|
// If an array was passed in, assume that it is an array of form elements.
|
||
|
if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
|
||
|
// Serialize the form elements
|
||
|
jQuery.each( a, function() {
|
||
|
add( this.name, this.value );
|
||
|
});
|
||
|
|
||
|
} else {
|
||
|
// If traditional, encode the "old" way (the way 1.3.2 or older
|
||
|
// did it), otherwise encode params recursively.
|
||
|
for ( prefix in a ) {
|
||
|
buildParams( prefix, a[ prefix ], traditional, add );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Return the resulting serialization
|
||
|
return s.join( "&" ).replace( r20, "+" );
|
||
|
};
|
||
|
|
||
|
function buildParams( prefix, obj, traditional, add ) {
|
||
|
var name;
|
||
|
|
||
|
if ( jQuery.isArray( obj ) ) {
|
||
|
// Serialize array item.
|
||
|
jQuery.each( obj, function( i, v ) {
|
||
|
if ( traditional || rbracket.test( prefix ) ) {
|
||
|
// Treat each array item as a scalar.
|
||
|
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.
|
||
|
buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
|
||
|
}
|
||
|
});
|
||
|
|
||
|
} else if ( !traditional && jQuery.type( obj ) === "object" ) {
|
||
|
// Serialize object item.
|
||
|
for ( name in obj ) {
|
||
|
buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
|
||
|
}
|
||
|
|
||
|
} else {
|
||
|
// Serialize scalar item.
|
||
|
add( prefix, obj );
|
||
|
}
|
||
|
}
|