X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fajax.js;h=6ea61eb21da55d0324065cbbda375c6823ea1b78;hb=238ac5a0aa25e7fb4fead7a56b92951817446127;hp=9195bcc89eb48d44cd0e34edfeccdfdb524d8618;hpb=fb48ae8e6cca25fd29ef2b1eb23e9efa7b0eef7c;p=jquery.git diff --git a/src/ajax.js b/src/ajax.js index 9195bcc..6ea61eb 100644 --- a/src/ajax.js +++ b/src/ajax.js @@ -195,6 +195,17 @@ jQuery.extend({ }, ajax: function( origSettings ) { + // IE8 leaks a lot when we've set abort, and IE6-8 a little + // when we have set onreadystatechange. Bug #6242 + // XXX IE7 still leaks when abort is called, no matter what + // we do + function cleanup() { + // IE6 will throw an error setting xhr.abort + try { + xhr.abort = xhr.onreadystatechange = jQuery.noop; + } catch(e) {} + } + var s = jQuery.extend(true, {}, jQuery.ajaxSettings, origSettings), jsonp, status, data, type = s.type.toUpperCase(), noContent = rnoContent.test(type); @@ -403,13 +414,12 @@ jQuery.extend({ requestDone = true; if ( xhr ) { - xhr.onreadystatechange = jQuery.noop; + cleanup(); } // The transfer is complete and the data is available, or the request timed out } else if ( !requestDone && xhr && (xhr.readyState === 4 || isTimeout === "timeout") ) { requestDone = true; - xhr.onreadystatechange = jQuery.noop; status = isTimeout === "timeout" ? "timeout" : @@ -451,10 +461,7 @@ jQuery.extend({ xhr.abort(); } - // Stop memory leaks - if ( s.async ) { - xhr = null; - } + cleanup(); } }; @@ -463,10 +470,11 @@ jQuery.extend({ try { var oldAbort = xhr.abort; xhr.abort = function() { - // xhr.abort in IE7 is not a native JS function - // and does not have a call property - if ( xhr && oldAbort.call ) { - oldAbort.call( xhr ); + if ( xhr ) { + // oldAbort has no call property in IE7 so + // just do it this way, which works in all + // browsers + Function.prototype.call.call( oldAbort, xhr ); } onreadystatechange( "abort" );