diff --git a/src/ajax.js b/src/ajax.js index 400108e1c..dad2f8282 100644 --- a/src/ajax.js +++ b/src/ajax.js @@ -627,6 +627,12 @@ jQuery.extend({ if ( fireGlobals ) { globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); } + + // If request was aborted inside ajaxSend, stop there + if ( state === 2 ) { + return jqXHR; + } + // Timeout if ( s.async && s.timeout > 0 ) { timeoutTimer = setTimeout(function() { diff --git a/test/unit/ajax.js b/test/unit/ajax.js index 528d3a496..d61d6b40d 100644 --- a/test/unit/ajax.js +++ b/test/unit/ajax.js @@ -440,6 +440,23 @@ module( "ajax", { }; }); + ajaxTest( "#15160 - jQuery.ajax() - request manually aborted in ajaxSend", 3, { + setup: function() { + jQuery( document ).on( "ajaxSend", function( e, jqXHR ) { + jqXHR.abort(); + }); + + jQuery( document ).on( "ajaxError ajaxComplete", function( e, jqXHR ) { + equal( jqXHR.statusText, "abort", "jqXHR.statusText equals abort on global ajaxComplete and ajaxError events" ); + }); + }, + url: url("data/name.html"), + error: true, + complete: function() { + ok( true, "complete" ); + } + }); + ajaxTest( "jQuery.ajax() - context modification", 1, { url: url("data/name.html"), context: {},