Disable the X-Requested-With header to avoid preflighting remote POST requests. Fixes...
[jquery.git] / src / ajax.js
index a9f47dd..1e0729f 100644 (file)
@@ -15,6 +15,10 @@ jQuery.fn.extend({
        load: function( url, params, callback ) {
                if ( typeof url !== "string" ) {
                        return this._load( url );
+
+               // Don't do a request if no elements are being requested
+               } else if ( !this.length ) {
+                       return this;
                }
 
                var off = url.indexOf(" ");
@@ -271,13 +275,12 @@ jQuery.extend({
                }
 
                // Matches an absolute URL, and saves the domain
-               var parts = rurl.exec( s.url );
+               var parts = rurl.exec( s.url ),
+                       remote = parts && (parts[1] && parts[1] !== location.protocol || parts[2] !== location.host);
 
                // If we're requesting a remote document
                // and trying to load JSON or Script with a GET
-               if ( s.dataType === "script" && type === "GET" && parts
-                       && ( parts[1] && parts[1] !== location.protocol || parts[2] !== location.host )) {
-
+               if ( s.dataType === "script" && type === "GET" && remote ) {
                        var head = document.getElementsByTagName("head")[0] || document.documentElement;
                        var script = document.createElement("script");
                        script.src = s.url;
@@ -334,19 +337,22 @@ jQuery.extend({
                                xhr.setRequestHeader("Content-Type", s.contentType);
                        }
 
-                               // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
-                               if ( s.ifModified ) {
-                                       if ( jQuery.lastModified[s.url] ) {
-                                               xhr.setRequestHeader("If-Modified-Since", jQuery.lastModified[s.url]);
-                                       }
+                       // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+                       if ( s.ifModified ) {
+                               if ( jQuery.lastModified[s.url] ) {
+                                       xhr.setRequestHeader("If-Modified-Since", jQuery.lastModified[s.url]);
+                               }
 
-                                       if ( jQuery.etag[s.url] ) {
-                                               xhr.setRequestHeader("If-None-Match", jQuery.etag[s.url]);
-                                       }
+                               if ( jQuery.etag[s.url] ) {
+                                       xhr.setRequestHeader("If-None-Match", jQuery.etag[s.url]);
                                }
+                       }
 
                        // Set header so the called script knows that it's an XMLHttpRequest
-                       xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
+                       // Only send the header if it's not a remote XHR
+                       if ( !remote ) {
+                               xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
+                       }
 
                        // Set the Accepts header for the server, depending on the dataType
                        xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?
@@ -469,7 +475,7 @@ jQuery.extend({
                function success(){
                        // If a local callback was specified, fire it and pass it the data
                        if ( s.success ) {
-                               s.success.call( callbackContext, data, status );
+                               s.success.call( callbackContext, data, status, xhr );
                        }
 
                        // Fire the global callback