diff options
-rw-r--r-- | src/ajax/xhr.js | 6 | ||||
-rw-r--r-- | test/data/ajax/onunload.html | 30 | ||||
-rw-r--r-- | test/unit/ajax.js | 5 |
3 files changed, 37 insertions, 4 deletions
diff --git a/src/ajax/xhr.js b/src/ajax/xhr.js index 8e6696b0d..5dbfc646f 100644 --- a/src/ajax/xhr.js +++ b/src/ajax/xhr.js @@ -18,18 +18,16 @@ var xhrSupported = jQuery.ajaxSettings.xhr(), // #1450: sometimes IE returns 1223 when it should be 204 1223: 204 }, - // Support: IE9 - // We need to keep track of outbound xhr and abort them manually - // because IE is not smart enough to do it all by itself xhrId = 0, xhrCallbacks = {}; +// Support: IE9 +// Open requests must be manually aborted on unload (#5280) if ( window.ActiveXObject ) { jQuery( window ).on( "unload", function() { for ( var key in xhrCallbacks ) { xhrCallbacks[ key ](); } - xhrCallbacks = undefined; }); } diff --git a/test/data/ajax/onunload.html b/test/data/ajax/onunload.html new file mode 100644 index 000000000..2c629f67d --- /dev/null +++ b/test/data/ajax/onunload.html @@ -0,0 +1,30 @@ +<!doctype html> +<html> +<head> + <meta http-equiv="Content-type" content="text/html; charset=utf-8"/> + <title>onunload ajax requests (#14379)</title> + <script src="../../jquery.js"></script> +</head> +<body> + <form id="navigate" action="about:blank"></form> + <script> + jQuery( window ).on( "unload", function() { + var ajaxStatus; + jQuery.ajax({ + url: "../name.html", + async: false, + complete: function( xhr, status ) { + ajaxStatus = status; + } + }); + parent.iframeCallback( ajaxStatus ); + }); + + jQuery(function() { + setTimeout(function() { + document.getElementById( "navigate" ).submit(); + }, 0 ); + }); + </script> +</body> +</html> diff --git a/test/unit/ajax.js b/test/unit/ajax.js index da1f2ce38..d446d64f1 100644 --- a/test/unit/ajax.js +++ b/test/unit/ajax.js @@ -1522,6 +1522,11 @@ module( "ajax", { } } ); + testIframeWithCallback( "#14379 - jQuery.ajax() on unload", "ajax/onunload.html", function( status ) { + expect( 1 ); + strictEqual( status, "success", "Request completed" ); + }); + //----------- jQuery.ajaxPrefilter() ajaxTest( "jQuery.ajaxPrefilter() - abort", 1, { |