aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/ajax/xhr.js6
-rw-r--r--test/data/ajax/onunload.html30
-rw-r--r--test/unit/ajax.js5
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, {