Added a test case for "purple include", fixed a bug.
[jquery.git] / src / ajax / ajax.js
index cf08676..ccf4f14 100644 (file)
@@ -15,6 +15,7 @@ jQuery.fn.extend({
         * @param Function callback (optional) A function to be executed whenever the data is loaded (parameters: responseText, status and response itself).
         * @cat Ajax
         */
+       // DEPRECATED
        loadIfModified: function( url, params, callback ) {
                this.load( url, params, callback, 1 );
        },
@@ -47,6 +48,12 @@ jQuery.fn.extend({
                if ( jQuery.isFunction( url ) )
                        return this.bind("load", url);
 
+               var off = url.indexOf(" ");
+               if ( off >= 0 ) {
+                       var selector = url.slice(off, url.length);
+                       url = url.slice(0, off);
+               }
+
                callback = callback || function(){};
 
                // Default to a GET request
@@ -77,9 +84,24 @@ jQuery.fn.extend({
                        complete: function(res, status){
                                // If successful, inject the HTML into all the matched elements
                                if ( status == "success" || !ifModified && status == "notmodified" )
-                                       self.html(res.responseText);
-
-                               self.each( callback, [res.responseText, status, res] );
+                                       // See if a selector was specified
+                                       self.html( selector ?
+                                               // Create a dummy div to hold the results
+                                               jQuery("<div/>")
+                                                       // inject the contents of the document in, removing the scripts
+                                                       // to avoid any 'Permission Denied' errors in IE
+                                                       .append(res.responseText.replace(/<script(.|\s)*?\/script>/g, ""))
+
+                                                       // Locate the specified elements
+                                                       .find(selector) :
+
+                                               // If not, just inject the full result
+                                               res.responseText );
+
+                               // Add delay to account for Safari's delay in globalEval
+                               setTimeout(function(){
+                                       self.each( callback, [res.responseText, status, res] );
+                               }, 13);
                        }
                });
                return this;
@@ -106,7 +128,12 @@ jQuery.fn.extend({
         */
        serialize: function() {
                return jQuery.param( this );
-       }
+       },
+
+       // DEPRECATED
+       // This method no longer does anything - all script evaluation is
+       // taken care of within the HTML injection methods.
+       evalScripts: function(){}
 
 });
 
@@ -294,6 +321,7 @@ jQuery.extend({
         * @param Function callback (optional) A function to be executed whenever the data is loaded successfully.
         * @cat Ajax
         */
+       // DEPRECATED
        getIfModified: function( url, data, callback, type ) {
                return jQuery.get(url, data, callback, type, 1);
        },
@@ -406,6 +434,7 @@ jQuery.extend({
         * @param Number time How long before an AJAX request times out, in milliseconds.
         * @cat Ajax
         */
+       // DEPRECATED
        ajaxTimeout: function( timeout ) {
                jQuery.ajaxSettings.timeout = timeout;
        },
@@ -570,18 +599,21 @@ jQuery.extend({
         * @see ajaxSetup(Map)
         */
        ajax: function( s ) {
-               // TODO introduce global settings, allowing the client to modify them for all requests, not only timeout
-               s = jQuery.extend({}, jQuery.ajaxSettings, s);
+               // Extend the settings, but re-extend 's' so that it can be
+               // checked again later (in the test suite, specifically)
+               s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s));
 
                // if data available
                if ( s.data ) {
                        // convert data if not already a string
-                       if (s.processData && typeof s.data != "string")
-                       s.data = jQuery.param(s.data);
+                       if ( s.processData && typeof s.data != "string" )
+                               s.data = jQuery.param(s.data);
+
                        // append data to url for get requests
-                       if( s.type.toLowerCase() == "get" ) {
+                       if ( s.type.toLowerCase() == "get" ) {
                                // "?" + data or "&" + data (in case there are already params)
-                               s.url += ((s.url.indexOf("?") > -1) ? "&" : "?") + s.data;
+                               s.url += (s.url.indexOf("?") > -1 ? "&" : "?") + s.data;
+
                                // IE likes to send both get and post data, prevent this
                                s.data = null;
                        }
@@ -662,7 +694,7 @@ jQuery.extend({
                                                s.success( data, status );
        
                                        // Fire the global callback
-                                       if( s.global )
+                                       if ( s.global )
                                                jQuery.event.trigger( "ajaxSuccess", [xml, s] );
                                } else
                                        jQuery.handleError(s, xml, status);
@@ -685,21 +717,23 @@ jQuery.extend({
                        }
                };
                
-               // don't attach the handler to the request, just poll it instead
-               var ival = setInterval(onreadystatechange, 13); 
-
-               // Timeout checker
-               if ( s.timeout > 0 )
-                       setTimeout(function(){
-                               // Check to see if the request is still happening
-                               if ( xml ) {
-                                       // Cancel the request
-                                       xml.abort();
-
-                                       if( !requestDone )
-                                               onreadystatechange( "timeout" );
-                               }
-                       }, s.timeout);
+               if ( s.async ) {
+                       // don't attach the handler to the request, just poll it instead
+                       var ival = setInterval(onreadystatechange, 13); 
+
+                       // Timeout checker
+                       if ( s.timeout > 0 )
+                               setTimeout(function(){
+                                       // Check to see if the request is still happening
+                                       if ( xml ) {
+                                               // Cancel the request
+                                               xml.abort();
+       
+                                               if( !requestDone )
+                                                       onreadystatechange( "timeout" );
+                                       }
+                               }, s.timeout);
+               }
                        
                // Send the data
                try {