ajaxSetup: function( settings ) {
jQuery.extend( true, jQuery.ajaxSettings, settings );
- return this;
+ if ( settings.context ) {
+ jQuery.ajaxSettings.context = settings.context;
+ }
},
ajaxSettings: {
// Utility function that handles dataType when response is received
// (for those transports that can give text or xml responses)
- determineDataType: function( ct , text , xml ) {
+ determineResponse: function( responses , ct ) {
var s = this,
contents = s.contents,
response;
// Auto (xml, json, script or text determined given headers)
- if ( transportDataType === "*" ) {
+ if ( ct && transportDataType === "*" ) {
for ( type in contents ) {
if ( ( regexp = contents[ type ] ) && regexp.test( ct ) ) {
}
}
- // xml and parsed as such
- if ( transportDataType === "xml" &&
- xml &&
- xml.documentElement /* #4958 */ ) {
-
- response = xml;
-
- // Text response was provided
- } else {
+ // Get response
+ for( type in responses ) {
+ if ( type === transportDataType ) {
+ break;
+ }
+ }
- response = text;
+ // Get final response
+ response = responses[ type ];
- // If it's not really text, defer to converters
- if ( transportDataType !== "text" ) {
- dataTypes.unshift( "text" );
+ // If it's not the right dataType, handle the dataTypeList
+ if ( transportDataType !== type ) {
+ if ( transportDataType === "*" ) {
+ dataTypes.shift();
}
-
+ dataTypes.unshift( type );
}
return response;
},
+ ajaxPrefilter: function( a , b ) {
+ ajaxPrefilterOrTransport( "prefilters" , a , b );
+ },
+
+ ajaxTransport: function( a , b ) {
+ return ajaxPrefilterOrTransport( "transports" , a , b );
+ },
+
// Main method
ajax: function( url , options ) {
- // Handle varargs
- if ( arguments.length === 1 ) {
+ // If options is not an object,
+ // we simulate pre-1.5 signature
+ if ( typeof( options ) !== "object" ) {
options = url;
- url = options ? options.url : undefined;
+ url = undefined;
}
// Force options to be an object
options = options || {};
- // Get the url if provided separately
- options.url = url || options.url;
-
var // Create the final options object
s = jQuery.extend( true , {} , jQuery.ajaxSettings , options ),
// jQuery lists
jQuery_lastModified = jQuery.lastModified,
jQuery_etag = jQuery.etag,
// Callbacks contexts
- callbackContext = options.context || s.context || s,
+ // We force the original context if it exists
+ // or take it from jQuery.ajaxSettings otherwise
+ // (plain objects used as context get extended)
+ callbackContext =
+ ( s.context = ( "context" in options ? options : jQuery.ajaxSettings ).context ) || s,
globalEventContext = callbackContext === s ? jQuery.event : jQuery( callbackContext ),
// Deferreds
deferred = jQuery.Deferred(),
}
};
- // We force the original context
- // (plain objects used as context get extended)
- s.context = options.context;
-
// Callback for when everything is done
// It is defined here because jslint complains if it is declared
// at the end of the function (which would be more logical and readable)
// Stored error
error,
- // Keep track of statusCode callbacks
- oldStatusCode = statusCode;
-
- statusCode = undefined;
+ // To keep track of statusCode based callbacks
+ oldStatusCode;
// If successful, handle type chaining
if ( status >= 200 && status < 300 || status === 304 ) {
// Success/Error
if ( isSuccess ) {
- deferred.fire( callbackContext , [ success , statusText , jXHR ] );
+ deferred.resolveWith( callbackContext , [ success , statusText , jXHR ] );
} else {
- deferred.fireReject( callbackContext , [ jXHR , statusText , error ] );
+ deferred.rejectWith( callbackContext , [ jXHR , statusText , error ] );
}
// Status-dependent callbacks
+ oldStatusCode = statusCode;
+ statusCode = undefined;
jXHR.statusCode( oldStatusCode );
if ( s.global ) {
}
// Complete
- completeDeferred.fire( callbackContext, [ jXHR , statusText ] );
+ completeDeferred.resolveWith( callbackContext, [ jXHR , statusText ] );
if ( s.global ) {
globalEventContext.trigger( "ajaxComplete" , [ jXHR , s] );
};
// Remove hash character (#7531: and string promotion)
- s.url = ( "" + s.url ).replace( rhash , "" );
+ // We also use the url parameter if available
+ s.url = ( "" + ( url || s.url ) ).replace( rhash , "" );
// Extract dataTypes list
s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( /\s+/ );
parts &&
( parts[ 1 ] && parts[ 1 ] != protocol ||
parts[ 2 ] != loc.hostname ||
- ( parts[ 3 ] || ( ( parts[ 1 ] || protocol ) === "http:" ? 80 : 443 ) )
- != ( loc.port || ( protocol === "http:" ? 80 : 443 ) ) )
+ ( parts[ 3 ] || ( ( parts[ 1 ] || protocol ) === "http:" ? 80 : 443 ) ) !=
+ ( loc.port || ( protocol === "http:" ? 80 : 443 ) ) )
);
}
});
-//Execute or select from functions in a given structure of options
-function ajax_selectOrExecute( structure , s , options ) {
+// Base function for both ajaxPrefilter and ajaxTransport
+function ajaxPrefilterOrTransport( arg0 , arg1 , arg2 ) {
- var dataTypes = s.dataTypes,
- transportDataType,
- list,
- selected,
+ var type = jQuery.type( arg1 ),
+ structure = jQuery.ajaxSettings[ arg0 ],
i,
- length,
- checked = {},
- flag,
- noSelect = structure !== "transports";
-
- function initSearch( dataType ) {
-
- flag = transportDataType !== dataType && ! checked[ dataType ];
-
- if ( flag ) {
-
- checked[ dataType ] = 1;
- transportDataType = dataType;
- list = s[ structure ][ dataType ];
- i = -1;
- length = list ? list.length : 0 ;
- }
-
- return flag;
- }
-
- initSearch( dataTypes[ 0 ] );
-
- for ( i = 0 ; ( noSelect || ! selected ) && i <= length ; i++ ) {
-
- if ( i === length ) {
-
- initSearch( "*" );
-
- } else {
-
- selected = list[ i ]( s , options );
-
- // If we got redirected to another dataType
- // Search there (if not in progress or already tried)
- if ( typeof( selected ) === "string" &&
- initSearch( selected ) ) {
-
- dataTypes.unshift( selected );
- selected = 0;
- }
- }
- }
-
- return noSelect ? jQuery : selected;
-}
-
-// Add an element to one of the structures in ajaxSettings
-function ajax_addElement( structure , args ) {
-
- var i,
- start = 0,
- length = args.length,
- dataTypes = [ "*" ],
- dLength = 1,
- dataType,
- functors = [],
- first,
- append,
- list;
-
- if ( length ) {
-
- first = jQuery.type( args[ 0 ] );
+ length;
+
+ // We have an options map so we have to inspect the structure
+ if ( type === "object" ) {
+
+ var options = arg1,
+ originalOptions = arg2,
+ // When dealing with prefilters, we execute only
+ // (no selection so we never stop when a function
+ // returns a non-falsy, non-string value)
+ executeOnly = ( arg0 === "prefilters" ),
+ inspect = function( dataType, tested ) {
+
+ if ( ! tested[ dataType ] ) {
+
+ tested[ dataType ] = true;
+
+ var list = structure[ dataType ],
+ selected;
+
+ for( i = 0, length = list ? list.length : 0 ; ( executeOnly || ! selected ) && i < length ; i++ ) {
+ selected = list[ i ]( options , originalOptions );
+ // If we got redirected to a different dataType,
+ // we add it and switch to the corresponding list
+ if ( typeof( selected ) === "string" && selected !== dataType ) {
+ options.dataTypes.unshift( selected );
+ selected = inspect( selected , tested );
+ // We always break in order not to continue
+ // to iterate in previous list
+ break;
+ }
+ }
+ // If we're only executing or nothing was selected
+ // we try the catchall dataType
+ if ( executeOnly || ! selected ) {
+ selected = inspect( "*" , tested );
+ }
+ // This will be ignored by ajaxPrefilter
+ // so it's safe to return no matter what
+ return selected;
+ }
- if ( first === "object" ) {
- return ajax_selectOrExecute( structure , args[ 0 ] , args[ 1 ] );
- }
+ };
- structure = jQuery.ajaxSettings[ structure ];
+ // Start inspection with current transport dataType
+ return inspect( options.dataTypes[ 0 ] , {} );
- if ( first !== "function" ) {
+ } else {
- dataTypes = args[ 0 ].toLowerCase().split(/\s+/);
- dLength = dataTypes.length;
- start = 1;
+ // We're requested to add to the structure
+ // Signature is ( dataTypeExpression , function )
+ // with dataTypeExpression being optional and
+ // defaulting to catchAll (*)
+ type = type === "function";
+ if ( type ) {
+ arg2 = arg1;
+ arg1 = undefined;
}
+ arg1 = arg1 || "*";
- if ( dLength && start < length ) {
-
- functors = sliceFunc.call( args , start );
+ // We control that the second argument is really a function
+ if ( type || jQuery.isFunction( arg2 ) ) {
- for( i = 0 ; i < dLength ; i++ ) {
+ var dataTypes = arg1.split( /\s+/ ),
+ functor = arg2,
+ dataType,
+ list,
+ placeBefore;
+ // For each dataType in the dataTypeExpression
+ for( i = 0 , length = dataTypes.length ; i < length ; i++ ) {
dataType = dataTypes[ i ];
-
- first = /^\+/.test( dataType );
-
- if (first) {
- dataType = dataType.substr(1);
- }
-
- if ( dataType !== "" ) {
-
- append = Array.prototype[ first ? "unshift" : "push" ];
- list = structure[ dataType ] = structure[ dataType ] || [];
- append.apply( list , functors );
+ // We control if we're asked to add before
+ // any existing element
+ placeBefore = /^\+/.test( dataType );
+ if ( placeBefore ) {
+ dataType = dataType.substr( 1 );
}
+ list = structure[ dataType ] = structure[ dataType ] || [];
+ // then we add to the structure accordingly
+ list[ placeBefore ? "unshift" : "push" ]( functor );
}
}
}
-
- return jQuery;
}
-// Install prefilter & transport methods
-jQuery.each( [ "Prefilter" , "Transport" ] , function( _ , name ) {
- _ = name.toLowerCase() + "s";
- jQuery[ "ajax" + name ] = function() {
- return ajax_addElement( _ , arguments );
- };
-} );
-
})( jQuery );