No ticket: Small ajax/xhr size optimizations

This commit is contained in:
Richard Gibson 2013-10-28 17:41:34 -04:00
parent f9d41ac641
commit 705216dc46

View File

@ -10,7 +10,8 @@ jQuery.ajaxSettings.xhr = function() {
} catch( e ) {} } catch( e ) {}
}; };
var xhrSupported = jQuery.ajaxSettings.xhr(), var xhrId = 0,
xhrCallbacks = {},
xhrSuccessStatus = { xhrSuccessStatus = {
// file protocol always yields status code 0, assume 200 // file protocol always yields status code 0, assume 200
0: 200, 0: 200,
@ -18,8 +19,7 @@ var xhrSupported = jQuery.ajaxSettings.xhr(),
// #1450: sometimes IE returns 1223 when it should be 204 // #1450: sometimes IE returns 1223 when it should be 204
1223: 204 1223: 204
}, },
xhrId = 0, xhrSupported = jQuery.ajaxSettings.xhr();
xhrCallbacks = {};
// Support: IE9 // Support: IE9
// Open requests must be manually aborted on unload (#5280) // Open requests must be manually aborted on unload (#5280)
@ -36,23 +36,29 @@ support.ajax = xhrSupported = !!xhrSupported;
jQuery.ajaxTransport(function( options ) { jQuery.ajaxTransport(function( options ) {
var callback; var callback;
// Cross domain only allowed if supported through XMLHttpRequest // Cross domain only allowed if supported through XMLHttpRequest
if ( support.cors || xhrSupported && !options.crossDomain ) { if ( support.cors || xhrSupported && !options.crossDomain ) {
return { return {
send: function( headers, complete ) { send: function( headers, complete ) {
var i, id, var i,
xhr = options.xhr(); xhr = options.xhr(),
id = ++xhrId;
xhr.open( options.type, options.url, options.async, options.username, options.password ); xhr.open( options.type, options.url, options.async, options.username, options.password );
// Apply custom fields if provided // Apply custom fields if provided
if ( options.xhrFields ) { if ( options.xhrFields ) {
for ( i in options.xhrFields ) { for ( i in options.xhrFields ) {
xhr[ i ] = options.xhrFields[ i ]; xhr[ i ] = options.xhrFields[ i ];
} }
} }
// Override mime type if needed // Override mime type if needed
if ( options.mimeType && xhr.overrideMimeType ) { if ( options.mimeType && xhr.overrideMimeType ) {
xhr.overrideMimeType( options.mimeType ); xhr.overrideMimeType( options.mimeType );
} }
// X-Requested-With header // X-Requested-With header
// For cross-domain requests, seeing as conditions for a preflight are // For cross-domain requests, seeing as conditions for a preflight are
// akin to a jigsaw puzzle, we simply never set it to be sure. // akin to a jigsaw puzzle, we simply never set it to be sure.
@ -61,16 +67,19 @@ jQuery.ajaxTransport(function( options ) {
if ( !options.crossDomain && !headers["X-Requested-With"] ) { if ( !options.crossDomain && !headers["X-Requested-With"] ) {
headers["X-Requested-With"] = "XMLHttpRequest"; headers["X-Requested-With"] = "XMLHttpRequest";
} }
// Set headers // Set headers
for ( i in headers ) { for ( i in headers ) {
xhr.setRequestHeader( i, headers[ i ] ); xhr.setRequestHeader( i, headers[ i ] );
} }
// Callback // Callback
callback = function( type ) { callback = function( type ) {
return function() { return function() {
if ( callback ) { if ( callback ) {
delete xhrCallbacks[ id ]; delete xhrCallbacks[ id ];
callback = xhr.onload = xhr.onerror = null; callback = xhr.onload = xhr.onerror = null;
if ( type === "abort" ) { if ( type === "abort" ) {
xhr.abort(); xhr.abort();
} else if ( type === "error" ) { } else if ( type === "error" ) {
@ -95,16 +104,20 @@ jQuery.ajaxTransport(function( options ) {
} }
}; };
}; };
// Listen to events // Listen to events
xhr.onload = callback(); xhr.onload = callback();
xhr.onerror = callback("error"); xhr.onerror = callback("error");
// Create the abort callback // Create the abort callback
callback = xhrCallbacks[( id = xhrId++ )] = callback("abort"); callback = xhrCallbacks[ id ] = callback("abort");
// Do send the request // Do send the request
// This may raise an exception which is actually // This may raise an exception which is actually
// handled in jQuery.ajax (so no try/catch here) // handled in jQuery.ajax (so no try/catch here)
xhr.send( options.hasContent && options.data || null ); xhr.send( options.hasContent && options.data || null );
}, },
abort: function() { abort: function() {
if ( callback ) { if ( callback ) {
callback(); callback();