mirror of
https://github.com/jquery/jquery.git
synced 2024-11-23 02:54:22 +00:00
Adds the abort on unload trick back in since IE9 still exhibits the bug
This commit is contained in:
parent
f6df0301c8
commit
62acda819f
@ -11,7 +11,21 @@ var xhrSupported = jQuery.ajaxSettings.xhr(),
|
|||||||
// Support: IE9
|
// Support: IE9
|
||||||
// #1450: sometimes IE returns 1223 when it should be 204
|
// #1450: sometimes IE returns 1223 when it should be 204
|
||||||
1223: 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 = {};
|
||||||
|
|
||||||
|
if ( window.ActiveXObject ) {
|
||||||
|
jQuery( window ).on( "unload", function() {
|
||||||
|
for( var key in xhrCallbacks ) {
|
||||||
|
xhrCallbacks[ key ]();
|
||||||
|
}
|
||||||
|
xhrCallbacks = undefined;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
jQuery.support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
|
jQuery.support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
|
||||||
jQuery.support.ajax = xhrSupported = !!xhrSupported;
|
jQuery.support.ajax = xhrSupported = !!xhrSupported;
|
||||||
@ -22,7 +36,7 @@ jQuery.ajaxTransport(function( options ) {
|
|||||||
if ( jQuery.support.cors || xhrSupported && !options.crossDomain ) {
|
if ( jQuery.support.cors || xhrSupported && !options.crossDomain ) {
|
||||||
return {
|
return {
|
||||||
send: function( headers, complete ) {
|
send: function( headers, complete ) {
|
||||||
var i,
|
var i, id,
|
||||||
xhr = options.xhr();
|
xhr = options.xhr();
|
||||||
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
|
||||||
@ -51,6 +65,7 @@ jQuery.ajaxTransport(function( options ) {
|
|||||||
callback = function( type ) {
|
callback = function( type ) {
|
||||||
return function() {
|
return function() {
|
||||||
if ( callback ) {
|
if ( callback ) {
|
||||||
|
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();
|
||||||
@ -80,7 +95,7 @@ jQuery.ajaxTransport(function( options ) {
|
|||||||
xhr.onload = callback();
|
xhr.onload = callback();
|
||||||
xhr.onerror = callback("error");
|
xhr.onerror = callback("error");
|
||||||
// Create the abort callback
|
// Create the abort callback
|
||||||
callback = callback("abort");
|
callback = xhrCallbacks[( id = xhrId++ )] = 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)
|
||||||
|
25
test/data/ajax/unreleasedXHR.html
Normal file
25
test/data/ajax/unreleasedXHR.html
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
||||||
|
<title>Attempt to block tests because of dangling XHR requests (IE)</title>
|
||||||
|
<script type="text/javascript" src="../../../dist/jquery.js"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
window.onunload = function() {};
|
||||||
|
jQuery(function() {
|
||||||
|
setTimeout(function() {
|
||||||
|
var parent = window.parent;
|
||||||
|
document.write("");
|
||||||
|
parent.iframeCallback();
|
||||||
|
}, 200 );
|
||||||
|
var number = 50;
|
||||||
|
while( number-- ) {
|
||||||
|
jQuery.ajax("../name.php?wait=600");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<!-- empty body -->
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -30,6 +30,11 @@ module( "ajax", {
|
|||||||
|
|
||||||
//----------- jQuery.ajax()
|
//----------- jQuery.ajax()
|
||||||
|
|
||||||
|
testIframeWithCallback( "XMLHttpRequest - Attempt to block tests because of dangling XHR requests (IE)", "ajax/unreleasedXHR.html", function() {
|
||||||
|
expect( 1 );
|
||||||
|
ok( true, "done" );
|
||||||
|
});
|
||||||
|
|
||||||
ajaxTest( "jQuery.ajax() - success callbacks", 8, {
|
ajaxTest( "jQuery.ajax() - success callbacks", 8, {
|
||||||
setup: addGlobalEvents("ajaxStart ajaxStop ajaxSend ajaxComplete ajaxSuccess"),
|
setup: addGlobalEvents("ajaxStart ajaxStop ajaxSend ajaxComplete ajaxSuccess"),
|
||||||
url: url("data/name.html"),
|
url: url("data/name.html"),
|
||||||
|
Loading…
Reference in New Issue
Block a user