X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fajax%2Fajax.js;h=fa48afab57b1134ad1719ab9312f889f3b11e604;hb=df61a63fca0bc7d1d3e3a0e7ec1e06ce2bd8fb53;hp=efd7ae2caed2e7462fb4c824db12df2405001fb5;hpb=15a30ba90cb4ff46ea17e775dd20f38f3c07e112;p=jquery.git diff --git a/src/ajax/ajax.js b/src/ajax/ajax.js index efd7ae2..fa48afa 100644 --- a/src/ajax/ajax.js +++ b/src/ajax/ajax.js @@ -124,12 +124,7 @@ jQuery.fn.extend({ // for some weird reason, it doesn't work if the callback is ommited jQuery.getScript( this.src ); else { - // TODO extract into $.eval - var data = this.text || this.textContent || this.innerHTML || ""; - if (window.execScript) - window.execScript( data ); - else - window.setTimeout( data, 0 ); + jQuery.globalEval( this.text || this.textContent || this.innerHTML || "" ); } }).end(); } @@ -139,10 +134,7 @@ jQuery.fn.extend({ // If IE is used, create a wrapper for the XMLHttpRequest object if ( jQuery.browser.msie && typeof XMLHttpRequest == "undefined" ) XMLHttpRequest = function(){ - return new ActiveXObject( - navigator.userAgent.indexOf("MSIE 5") >= 0 ? - "Microsoft.XMLHTTP" : "Msxml2.XMLHTTP" - ); + return new ActiveXObject("Microsoft.XMLHTTP"); }; // Attach a bunch of functions for handling common AJAX events @@ -178,7 +170,10 @@ if ( jQuery.browser.msie && typeof XMLHttpRequest == "undefined" ) /** * Attach a function to be executed whenever an AJAX request completes. * - * @example $("#msg").ajaxComplete(function(){ + * The XMLHttpRequest and settings used for that request are passed + * as arguments to the callback. + * + * @example $("#msg").ajaxComplete(function(request, settings){ * $(this).append("
  • Request Complete.
  • "); * }); * @desc Show a message when an AJAX request completes. @@ -193,7 +188,10 @@ if ( jQuery.browser.msie && typeof XMLHttpRequest == "undefined" ) * Attach a function to be executed whenever an AJAX request completes * successfully. * - * @example $("#msg").ajaxSuccess(function(){ + * The XMLHttpRequest and settings used for that request are passed + * as arguments to the callback. + * + * @example $("#msg").ajaxSuccess(function(request, settings){ * $(this).append("
  • Successful Request!
  • "); * }); * @desc Show a message when an AJAX request completes successfully. @@ -207,8 +205,11 @@ if ( jQuery.browser.msie && typeof XMLHttpRequest == "undefined" ) /** * Attach a function to be executed whenever an AJAX request fails. * - * @example $("#msg").ajaxError(function(){ - * $(this).append("
  • Error requesting page.
  • "); + * The XMLHttpRequest and settings used for that request are passed + * as arguments to the callback. + * + * @example $("#msg").ajaxError(function(request, settings){ + * $(this).append("
  • Error requesting page " + settings.url + "
  • "); * }); * @desc Show a message when an AJAX request fails. * @@ -217,9 +218,26 @@ if ( jQuery.browser.msie && typeof XMLHttpRequest == "undefined" ) * @param Function callback The function to execute. * @cat AJAX */ + +/** + * Attach a function to be executed before an AJAX request is send. + * + * The XMLHttpRequest and settings used for that request are passed + * as arguments to the callback. + * + * @example $("#msg").ajaxSend(function(request, settings){ + * $(this).append("
  • Starting request at " + settings.url + "
  • "); + * }); + * @desc Show a message before an AJAX request is send. + * + * @name ajaxSend + * @type jQuery + * @param Function callback The function to execute. + * @cat AJAX + */ new function(){ - var e = "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess".split(","); + var e = "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","); for ( var i = 0; i < e.length; i++ ) new function(){ var o = e[i]; @@ -309,6 +327,10 @@ jQuery.extend({ * Loads, and executes, a remote JavaScript file using an HTTP GET request. * All of the arguments to the method (except URL) are optional. * + * Warning: Safari <= 2.0.x is unable to evalulate scripts in a global + * context sychronously. If you load functions via getScript, make sure + * to call them after a delay. + * * @example $.getScript("test.js") * * @example $.getScript("test.js", function(){ @@ -473,7 +495,7 @@ 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 + * (Object|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. * @@ -488,6 +510,9 @@ jQuery.extend({ * (Boolean) async - By default, all requests are send asynchronous (set to true). * If you need synchronous requests, set this option to false. * + * (Function) beforeSend - A pre-callback to set custom headers etc., the + * XMLHttpRequest is passed as the only argument. + * * @example $.ajax({ * type: "GET", * url: "test.js", @@ -525,7 +550,8 @@ jQuery.extend({ data: null, contentType: "application/x-www-form-urlencoded", processData: true, - async: true + async: true, + beforeSend: null }, s); // if data available @@ -566,6 +592,12 @@ jQuery.extend({ // Make sure the browser sends the right content length if ( xml.overrideMimeType ) xml.setRequestHeader("Connection", "close"); + + // Allow custom headers/mimetypes + if( s.beforeSend ) + s.beforeSend(xml); + if (s.global) + jQuery.event.trigger("ajaxSend", [xml, s]); // Wait for a response to come back var onreadystatechange = function(isTimeout){ @@ -596,7 +628,7 @@ jQuery.extend({ // Fire the global callback if( s.global ) - jQuery.event.trigger( "ajaxSuccess" ); + jQuery.event.trigger( "ajaxSuccess", [xml, s] ); // Otherwise, the request was not successful } else { @@ -605,12 +637,12 @@ jQuery.extend({ // Fire the global callback if( s.global ) - jQuery.event.trigger( "ajaxError" ); + jQuery.event.trigger( "ajaxError", [xml, s] ); } // The request was completed if( s.global ) - jQuery.event.trigger( "ajaxComplete" ); + jQuery.event.trigger( "ajaxComplete", [xml, s] ); // Handle the global AJAX counter if ( s.global && ! --jQuery.active ) @@ -687,13 +719,9 @@ jQuery.extend({ var data = !type && ct && ct.indexOf("xml") >= 0; data = type == "xml" || data ? r.responseXML : r.responseText; - // If the type is "script", eval it´in global context - // TODO extract as $.eval + // If the type is "script", eval it in global context if ( type == "script" ) { - if (window.execScript) - window.execScript( data ); - else - window.setTimeout( data, 0 ); + jQuery.globalEval( data ); } // Get the JavaScript object, if JSON is used. @@ -721,10 +749,10 @@ jQuery.extend({ } else { // Serialize the key/values for ( var j in a ) { - //if one value is array then treat each array value in part - if (typeof a[j] == 'object') { + // If the value is an array then the key names need to be repeated + if( a[j].constructor == Array ) { for (var k = 0; k < a[j].length; k++) { - s.push( j + "[]=" + encodeURIComponent( a[j][k] ) ); + s.push( j + "=" + encodeURIComponent( a[j][k] ) ); } } else { s.push( j + "=" + encodeURIComponent( a[j] ) ); @@ -734,6 +762,18 @@ jQuery.extend({ // Return the resulting serialization return s.join("&"); + }, + + // evalulates a script in global context + // not reliable for safari + globalEval: function(data) { + if (window.execScript) + window.execScript( data ); + else if(jQuery.browser.safari) + // safari doesn't provide a synchronous global eval + window.setTimeout( data, 0 ); + else + eval.call( window, data ); } });