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,8 +11,22 @@ var xhrSupported = jQuery.ajaxSettings.xhr(),
|
||||
// Support: IE9
|
||||
// #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 = {};
|
||||
|
||||
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.ajax = xhrSupported = !!xhrSupported;
|
||||
|
||||
@ -22,7 +36,7 @@ jQuery.ajaxTransport(function( options ) {
|
||||
if ( jQuery.support.cors || xhrSupported && !options.crossDomain ) {
|
||||
return {
|
||||
send: function( headers, complete ) {
|
||||
var i,
|
||||
var i, id,
|
||||
xhr = options.xhr();
|
||||
xhr.open( options.type, options.url, options.async, options.username, options.password );
|
||||
// Apply custom fields if provided
|
||||
@ -51,6 +65,7 @@ jQuery.ajaxTransport(function( options ) {
|
||||
callback = function( type ) {
|
||||
return function() {
|
||||
if ( callback ) {
|
||||
delete xhrCallbacks[ id ];
|
||||
callback = xhr.onload = xhr.onerror = null;
|
||||
if ( type === "abort" ) {
|
||||
xhr.abort();
|
||||
@ -80,7 +95,7 @@ jQuery.ajaxTransport(function( options ) {
|
||||
xhr.onload = callback();
|
||||
xhr.onerror = callback("error");
|
||||
// Create the abort callback
|
||||
callback = callback("abort");
|
||||
callback = xhrCallbacks[( id = xhrId++ )] = callback("abort");
|
||||
// Do send the request
|
||||
// This may raise an exception which is actually
|
||||
// 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()
|
||||
|
||||
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, {
|
||||
setup: addGlobalEvents("ajaxStart ajaxStop ajaxSend ajaxComplete ajaxSuccess"),
|
||||
url: url("data/name.html"),
|
||||
|
Loading…
Reference in New Issue
Block a user