Landing fixes for tickets #2935 and #2688 (Aborting ajax doesn't stop the setInterval...
authorJohn Resig <jeresig@gmail.com>
Fri, 14 Nov 2008 04:16:00 +0000 (04:16 +0000)
committerJohn Resig <jeresig@gmail.com>
Fri, 14 Nov 2008 04:16:00 +0000 (04:16 +0000)
src/ajax.js

index 7e024a3..4135e34 100644 (file)
@@ -308,10 +308,11 @@ jQuery.extend({
                                s.accepts._default );
                } catch(e){}
 
-               // Allow custom headers/mimetypes
+               // Allow custom headers/mimetypes and early abort
                if ( s.beforeSend && s.beforeSend(xhr, s) === false ) {
-                       // cleanup active request counter
-                       s.global && jQuery.active--;
+                       // Handle the global AJAX counter
+                       if ( s.global && ! --jQuery.active )
+                               jQuery.event.trigger( "ajaxStop" );
                        // close opended socket
                        xhr.abort();
                        return false;
@@ -322,8 +323,18 @@ jQuery.extend({
 
                // Wait for a response to come back
                var onreadystatechange = function(isTimeout){
+                       // The request was aborted, clear the interval and decrement jQuery.active
+                       if (xhr.readyState == 0) {
+                               if (ival) {
+                                       // clear poll interval
+                                       clearInterval(ival);
+                                       ival = null;
+                                       // Handle the global AJAX counter
+                                       if ( s.global && ! --jQuery.active )
+                                               jQuery.event.trigger( "ajaxStop" );
+                               }
                        // The transfer is complete and the data is available, or the request timed out
-                       if ( !requestDone && xhr && (xhr.readyState == 4 || isTimeout == "timeout") ) {
+                       } else if ( !requestDone && xhr && (xhr.readyState == 4 || isTimeout == "timeout") ) {
                                requestDone = true;
 
                                // clear poll interval