Added a fix for IE for binding events onto IFrame content.
[jquery.git] / ajax / ajax.js
index 2586f3f..f6a1d9e 100644 (file)
@@ -83,7 +83,7 @@ if ( jQuery.browser == "msie" )
 
 // Attach a bunch of functions for handling common AJAX events
 (function(){
-       var e = "ajaxStart.ajaxComplete.ajaxError.ajaxSuccess".split(',');
+       var e = "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess".split(',');
        
        for ( var i = 0; i < e.length; i++ ){ (function(){
                var o = e[i];
@@ -105,6 +105,10 @@ jQuery.ajax = function( type, url, data, ret ) {
                url = type.url;
                type = type.type;
        }
+       
+       // Watch for a new set of requests
+       if ( ! jQuery.ajax.active++ )
+               jQuery.event.trigger( "ajaxStart" );
 
        // Create the request object
        var xml = new XMLHttpRequest();
@@ -125,23 +129,8 @@ jQuery.ajax = function( type, url, data, ret ) {
 
        // Wait for a response to come back
        xml.onreadystatechange = function(){
-               // Socket is openend
-               if ( xml.readyState == 1 ) {
-                       // Increase counter
-                       jQuery.ajax.active++;
-
-                       // Show 'loader'
-                       jQuery.event.trigger( "ajaxStart" );
-               }
-
-               // Socket is closed and data is available
+               // The transfer is complete and the data is available
                if ( xml.readyState == 4 ) {
-                       // Hide loader if needed
-                       if ( ! --jQuery.ajax.active ) {
-                               jQuery.event.trigger( "ajaxComplete" );
-                               jQuery.ajax.active = 0
-                       }
-
                        // Make sure that the request was successful
                        if ( jQuery.httpSuccess( xml ) ) {
                        
@@ -159,6 +148,13 @@ jQuery.ajax = function( type, url, data, ret ) {
                                // Fire the global callback
                                jQuery.event.trigger( "ajaxError" );
                        }
+                       
+                       // The request was completed
+                       jQuery.event.trigger( "ajaxComplete" );
+                       
+                       // Handle the global AJAX counter
+                       if ( ! --jQuery.ajax.active )
+                               jQuery.event.trigger( "ajaxStop" );
 
                        // Process result
                        if ( ret ) ret(xml);
@@ -174,15 +170,21 @@ jQuery.ajax.active = 0;
 
 // Determines if an XMLHttpRequest was successful or not
 jQuery.httpSuccess = function(r) {
-       return ( r.status && ( r.status >= 200 && r.status < 300 ) || 
-               r.status == 304 ) || !r.status && location.protocol == "file:";
+  try {
+    return r.status ?
+      ( r.status >= 200 && r.status < 300 ) || r.status == 304 :
+      location.protocol == "file:";
+  } catch(e){}
+  return false;
 };
 
-// Get the data out of an XMLHttpRequest
+// Get the data out of an XMLHttpRequest.
+// Return parsed XML if content-type header is "xml" and type is "xml" or omitted,
+// otherwise return plain text.
 jQuery.httpData = function(r,type) {
-       // Check the headers, or watch for a force override
-       return r.getResponseHeader("content-type").indexOf("xml") > 0 || 
-               type == "xml" ? r.responseXML : r.responseText;
+  var ct = r.getResponseHeader("content-type");
+       var xml = ( !type || type == "xml" ) && ct && ct.indexOf("xml") >= 0;
+       return xml ? r.responseXML : r.responseText;
 };
 
 // Serialize an array of form elements or a set of