@@ -135,6 +135,22 @@ function inspectPrefiltersOrTransports( structure, options, originalOptions, jqX
135
135
return selection ;
136
136
}
137
137
138
+ // A special extend for ajax options
139
+ // that takes "flat" options (not to be deep extended)
140
+ // Fixes #9887
141
+ function ajaxExtend ( target , src ) {
142
+ var key , deep ,
143
+ flatOptions = jQuery . ajaxSettings . flatOptions || { } ;
144
+ for ( key in src ) {
145
+ if ( src [ key ] !== undefined ) {
146
+ ( flatOptions [ key ] ? target : ( deep || ( deep = { } ) ) ) [ key ] = src [ key ] ;
147
+ }
148
+ }
149
+ if ( deep ) {
150
+ jQuery . extend ( true , target , deep ) ;
151
+ }
152
+ }
153
+
138
154
jQuery . fn . extend ( {
139
155
load : function ( url , params , callback ) {
140
156
if ( typeof url !== "string" && _load ) {
@@ -278,23 +294,16 @@ jQuery.extend({
278
294
// Creates a full fledged settings object into target
279
295
// with both ajaxSettings and settings fields.
280
296
// If target is omitted, writes into ajaxSettings.
281
- ajaxSetup : function ( target , settings ) {
282
- if ( ! settings ) {
283
- // Only one parameter, we extend ajaxSettings
284
- settings = target ;
285
- target = jQuery . extend ( true , jQuery . ajaxSettings , settings ) ;
297
+ ajaxSetup : function ( target , settings ) {
298
+ if ( settings ) {
299
+ // Building a settings object
300
+ ajaxExtend ( target , jQuery . ajaxSettings ) ;
286
301
} else {
287
- // target was provided, we extend into it
288
- jQuery . extend ( true , target , jQuery . ajaxSettings , settings ) ;
289
- }
290
- // Flatten fields we don't want deep extended
291
- for ( var field in { context : 1 , url : 1 } ) {
292
- if ( field in settings ) {
293
- target [ field ] = settings [ field ] ;
294
- } else if ( field in jQuery . ajaxSettings ) {
295
- target [ field ] = jQuery . ajaxSettings [ field ] ;
296
- }
302
+ // Extending ajaxSettings
303
+ settings = target ;
304
+ target = jQuery . ajaxSettings ;
297
305
}
306
+ ajaxExtend ( target , settings ) ;
298
307
return target ;
299
308
} ,
300
309
@@ -352,6 +361,15 @@ jQuery.extend({
352
361
353
362
// Parse text as xml
354
363
"text xml" : jQuery . parseXML
364
+ } ,
365
+
366
+ // For options that shouldn't be deep extended:
367
+ // you can add your own custom options here if
368
+ // and when you create one that shouldn't be
369
+ // deep extended (see ajaxExtend)
370
+ flatOptions : {
371
+ context : true ,
372
+ url : true
355
373
}
356
374
} ,
357
375
@@ -563,7 +581,7 @@ jQuery.extend({
563
581
completeDeferred . resolveWith ( callbackContext , [ jqXHR , statusText ] ) ;
564
582
565
583
if ( fireGlobals ) {
566
- globalEventContext . trigger ( "ajaxComplete" , [ jqXHR , s ] ) ;
584
+ globalEventContext . trigger ( "ajaxComplete" , [ jqXHR , s ] ) ;
567
585
// Handle the global AJAX counter
568
586
if ( ! ( -- jQuery . active ) ) {
569
587
jQuery . event . trigger ( "ajaxStop" ) ;
0 commit comments