},
// Main method
- // (s is used internally)
- ajax: function( url , options , s ) {
+ ajax: function( url , options ) {
// Handle varargs
if ( arguments.length === 1 ) {
// Get the url if provided separately
options.url = url || options.url;
- // Create the final options object
- s = jQuery.extend( true , {} , jQuery.ajaxSettings , options );
-
- // We force the original context
- // (plain objects used as context get extended)
- s.context = options.context;
-
- var // jQuery lists
+ 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 = s.context || s,
- globalEventContext = s.context ? jQuery( s.context ) : jQuery.event,
+ callbackContext = options.context || s.context || s,
+ globalEventContext = callbackContext === s ? jQuery.event : jQuery( callbackContext ),
// Deferreds
deferred = jQuery.Deferred(),
completeDeferred = jQuery._Deferred(),
},
// Builds headers hashtable if needed
- // (match is used internally)
- getResponseHeader: function( key , match ) {
+ getResponseHeader: function( key ) {
+
+ var match;
if ( state === 2 ) {
- if ( responseHeaders === undefined ) {
+ if ( !responseHeaders ) {
responseHeaders = {};
- if ( typeof responseHeadersString === "string" ) {
-
- while( ( match = rheaders.exec( responseHeadersString ) ) ) {
- responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
- }
+ while( ( match = rheaders.exec( responseHeadersString ) ) ) {
+ responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
}
}
match = responseHeaders[ key.toLowerCase() ];
- } else {
-
- match = null;
}
- return match;
+ return match || null;
},
// Cancel the request
}
};
+ // 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)
// Dereference transport for early garbage collection
// (no matter how long the jXHR transport will be used
- transport = 0;
+ transport = undefined;
// Set readyState
jXHR.readyState = status ? 4 : 0;
// Stored success
success,
// Stored error
- error;
+ error,
+
+ // Keep track of statusCode callbacks
+ oldStatusCode = statusCode;
+
+ statusCode = undefined;
// If successful, handle type chaining
if ( status >= 200 && status < 300 || status === 304 ) {
current,
// Previous dataType
prev,
+ // Conversion expression
+ conversion,
// Conversion function
conv,
// Conversion functions (when text is used in-between)
if ( prev !== "*" && current !== "*" && prev !== current ) {
// Get the converter
- conv = converters[ prev + " " + current ] ||
- converters[ "* " + current ];
+ conversion = prev + " " + current;
+ conv = converters[ conversion ] || converters[ "* " + current ];
conv1 = conv2 = 0;
}
// Status-dependent callbacks
- jXHR.statusCode( statusCode );
+ jXHR.statusCode( oldStatusCode );
if ( s.global ) {
globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ) ,
// Status-dependent callbacks
jXHR.statusCode = function( map ) {
if ( map ) {
- var resolved = jXHR.isResolved(),
- tmp;
- if ( resolved || jXHR.isRejected() ) {
- tmp = map[ jXHR.status ];
- if ( tmp ) {
- if ( map === statusCode ) {
- delete statusCode[ jXHR.status ];
- }
- jXHR[ resolved ? "done" : "fail" ]( tmp );
- }
- } else {
+ var tmp;
+ if ( statusCode ) {
for( tmp in map ) {
statusCode[ tmp ] = [ statusCode[ tmp ] , map[ tmp ] ];
}
+ } else {
+ tmp = map[ jXHR.status ];
+ jXHR.done( tmp ).fail( tmp );
}
}
return this;