From 04b92e78315c9c5650db6d8c25f90e7158070862 Mon Sep 17 00:00:00 2001 From: Ben Alman Date: Wed, 16 Dec 2009 20:41:56 +0800 Subject: [PATCH] Reorganized param code slightly to once again define buildParams as a named function expression, as moving it outside the param closure would necessitate moving and rewriting the add function as well. --- src/ajax.js | 69 +++++++++++++++++++++++++++++------------------------------ 1 file changed, 34 insertions(+), 35 deletions(-) diff --git a/src/ajax.js b/src/ajax.js index aed8dac..df418eb 100644 --- a/src/ajax.js +++ b/src/ajax.js @@ -595,7 +595,7 @@ jQuery.extend({ var s = [], // Set jQuery.param.traditional to true for jQuery <= 1.3.2 behavior. - param_traditional = jQuery.param.traditional; + traditional = jQuery.param.traditional; function add( key, value ){ // If value is a function, invoke it and return its value @@ -603,37 +603,6 @@ jQuery.extend({ s[ s.length ] = encodeURIComponent(key) + '=' + encodeURIComponent(value); } - // Recursively encode parameters from object. - function buildParams( prefix, obj ) { - - if ( jQuery.isArray(obj) ) { - // Serialize array item. - jQuery.each( obj, function(i,v){ - if ( param_traditional ) { - 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" || jQuery.isArray(v) ? i : "" ) + "]", v ); - } - }); - - } else if ( !param_traditional && typeof obj === "object" ) { - // Serialize object item. - jQuery.each( obj, function(k,v){ - buildParams( prefix + "[" + k + "]", v ); - }); - - } else { - // Serialize scalar item. - add( prefix, obj ); - } - } - // If an array was passed in, assume that it is an array of form elements. if ( jQuery.isArray(a) || a.jquery ) { // Serialize the form elements @@ -642,9 +611,39 @@ jQuery.extend({ }); } else { - // If jQuery.param.traditional is set, encode the "old" way (the way - // 1.3.2 or older did it), otherwise encode params recursively. - jQuery.each( a, buildParams ); + // If jQuery.param.traditional is true, encode the "old" way (the + // way 1.3.2 or older did it), otherwise encode params recursively. + jQuery.each( a, function buildParams( prefix, obj ) { + + if ( jQuery.isArray(obj) ) { + // Serialize array item. + jQuery.each( obj, function(i,v){ + if ( traditional ) { + // 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" || jQuery.isArray(v) ? i : "" ) + "]", v ); + } + }); + + } else if ( !traditional && typeof obj === "object" ) { + // Serialize object item. + jQuery.each( obj, function(k,v){ + buildParams( prefix + "[" + k + "]", v ); + }); + + } else { + // Serialize scalar item. + add( prefix, obj ); + } + }); } // Return the resulting serialization -- 1.7.10.4