Fixed an issue with getJSON (type was not correctly passed on when data was ommited...
[jquery.git] / src / ajax / ajax.js
index 2ed5396..198685c 100644 (file)
@@ -51,6 +51,8 @@ jQuery.fn.extend({
         * window.foo = undefined;
         * var verifyEvaluation = function() {
         *   ok( foobar == "bar", 'Check if script src was evaluated after load' );
+        *   ok( $('#foo').html() == 'foo', 'Check if script evaluation has modified DOM');
+        *   ok( $('#ap').html() == 'bar', 'Check if script evaluation has modified DOM');
         *   start();
         * };
         * $('#first').load('data/test.html', function() {
@@ -62,8 +64,8 @@ jQuery.fn.extend({
         * @name load
         * @type jQuery
         * @param String url The URL of the HTML file to load.
-        * @param Hash params A set of key/value pairs that will be sent to the server.
-        * @param Function callback A function to be executed whenever the data is loaded.
+        * @param Object params A set of key/value pairs that will be sent as data to the server.
+        * @param Function callback A function to be executed whenever the data is loaded (parameters: responseText, status and reponse itself).
         * @cat AJAX
         */
        load: function( url, params, callback, ifModified ) {
@@ -105,9 +107,9 @@ jQuery.fn.extend({
                                          // Execute all the scripts inside of the newly-injected HTML
                                          .evalScripts()
                                          // Execute callback
-                                         .each( callback, [res.responseText, status] );
+                                         .each( callback, [res.responseText, status, res] );
                                } else
-                                       callback.apply( self, [res.responseText, status] );
+                                       callback.apply( self, [res.responseText, status, res] );
                        }
                });
                return this;
@@ -139,6 +141,15 @@ jQuery.fn.extend({
                return jQuery.param( this );
        },
 
+       /**
+        * Evaluate all script tags inside this jQuery. If they have a src attribute,
+        * the script is loaded, otherwise it's content is evaluated.
+        *
+        * @name evalScripts
+        * @type jQuery
+        * @private
+        * @cat AJAX
+        */
        evalScripts: function() {
                return this.find('script').each(function(){
                        if ( this.src )
@@ -329,22 +340,19 @@ jQuery.extend({
         * @cat AJAX
         */
        get: function( url, data, callback, type, ifModified ) {
+               // shift arguments if data argument was ommited
                if ( data && data.constructor == Function ) {
-                       type = callback;
                        callback = data;
                        data = null;
                }
 
-               // append ? + data or & + data, in case there are already params
-               if ( data ) url += ((url.indexOf("?") > -1) ? "&" : "?") + jQuery.param(data);
-
-               // Build and start the HTTP Request
+               // Delegate
                jQuery.ajax({
                        url: url,
-                       ifModified: ifModified,
-                       complete: function(r, status) {
-                               if ( callback ) callback( jQuery.httpData(r,type), status );
-                       }
+                       data: data,
+                       success: callback,
+                       dataType: type,
+                       ifModified: ifModified
                });
        },
 
@@ -457,11 +465,7 @@ jQuery.extend({
         * @cat AJAX
         */
        getJSON: function( url, data, callback ) {
-               if(callback)
-                       jQuery.get(url, data, callback, "json");
-               else {
-                       jQuery.get(url, data, "json");
-               }
+               jQuery.get(url, data, callback, "json");
        },
 
        /**
@@ -500,14 +504,13 @@ jQuery.extend({
         * @cat AJAX
         */
        post: function( url, data, callback, type ) {
-               // Build and start the HTTP Request
+               // Delegate
                jQuery.ajax({
                        type: "POST",
                        url: url,
-                       data: jQuery.param(data),
-                       complete: function(r, status) {
-                               if ( callback ) callback( jQuery.httpData(r,type), status );
-                       }
+                       data: data,
+                       success: callback,
+                       dataType: type
                });
        },
 
@@ -589,7 +592,6 @@ jQuery.extend({
         *
         * (String) url - The URL of the page to request.
         *
-        * (String) data - A string of data to be sent to the server (POST only).
         *
         * (String) dataType - The type of data that you're expecting back from
         * the server (e.g. "xml", "html", "script", or "json").
@@ -618,6 +620,18 @@ jQuery.extend({
         * function gets passed two arguments: The XMLHttpRequest object and a
         * string describing the type the success of the request.
         *
+        * (String) data - Data to be sent to the server. Converted to a query
+        * string, if not already a string. Is appended to the url for GET-requests.
+        * Override processData option to prevent processing.
+        *
+        * (String) contentType - When sending data to the server, use this content-type,
+        * default is "application/x-www-form-urlencoded", which is fine for most cases.
+        *
+        * (Boolean) processData - By default, data passed in as an object other as string
+        * will be processed and transformed into a query string, fitting to the default
+        * content-type "application/x-www-form-urlencoded". If you want to send DOMDocuments,
+        * set this option to false.
+        *
         * @example $.ajax({
         *   type: "GET",
         *   url: "test.js",
@@ -688,39 +702,33 @@ jQuery.extend({
         * @param Hash prop A set of properties to initialize the request with.
         * @cat AJAX
         */
-       //ajax: function( type, url, data, ret, ifModified ) {
        ajax: function( s ) {
-
-               var fvoid = function() {};
+               // TODO introduce global settings, allowing the client to modify them for all requests, not only timeout
                s = jQuery.extend({
                        global: true,
                        ifModified: false,
                        type: "GET",
                        timeout: jQuery.timeout,
-                       complete: fvoid,
-                       success: fvoid,
-                       error: fvoid,
+                       complete: null,
+                       success: null,
+                       error: null,
                        dataType: null,
+                       url: null,
                        data: null,
-                       url: null
+                       contentType: "application/x-www-form-urlencoded",
+                       processData: true
                }, s);
 
-               /*
-               // If only a single argument was passed in,
-               // assume that it is a object of key/value pairs
-               if ( !url ) {
-                       ret = type.complete;
-                       var success = type.success;
-                       var error = type.error;
-                       var dataType = type.dataType;
-                       var global = typeof type.global == "boolean" ? type.global : true;
-                       var timeout = typeof type.timeout == "number" ? type.timeout : jQuery.timeout;
-                       ifModified = type.ifModified || false;
-                       data = type.data;
-                       url = type.url;
-                       type = type.type;
+               // 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);
+                       // append data to url for get requests
+                       if( s.type.toLowerCase() == "get" )
+                               // "?" + data or "&" + data (in case there are already params)
+                               s.url += ((s.url.indexOf("?") > -1) ? "&" : "?") + s.data;
                }
-               */
 
                // Watch for a new set of requests
                if ( s.global && ! jQuery.active++ )
@@ -736,7 +744,7 @@ jQuery.extend({
 
                // Set the correct header, if data is being sent
                if ( s.data )
-                       xml.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
+                       xml.setRequestHeader("Content-Type", s.contentType);
 
                // Set the If-Modified-Since header, if ifModified mode.
                if ( s.ifModified )
@@ -891,8 +899,16 @@ jQuery.extend({
                // Otherwise, assume that it's an object of key/value pairs
                } else {
                        // Serialize the key/values
-                       for ( var j in a )
-                               s.push( j + "=" + encodeURIComponent( a[j] ) );
+                       for ( var j in a ) {
+                               //if one value is array then treat each array value in part
+                               if (typeof a[j] == 'object') {
+                                       for (var k = 0; k < a[j].length; k++) {
+                                               s.push( j + "[]=" + encodeURIComponent( a[j][k] ) );
+                                       }
+                               } else {
+                                       s.push( j + "=" + encodeURIComponent( a[j] ) );
+                               }
+                       }
                }
 
                // Return the resulting serialization