X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=ajax%2Fajax.js;h=1960150e34ac6065e7d956777611f6d7dca815d7;hb=e8627fe1555602dc4713c4e848a41642b2654512;hp=72aa82fbafcb98b248a9f07ccce7e4ef54c0dd18;hpb=c3c706d3f24dbad0fdeb80fe9caf158bd9d6de66;p=jquery.git diff --git a/ajax/ajax.js b/ajax/ajax.js index 72aa82f..1960150 100644 --- a/ajax/ajax.js +++ b/ajax/ajax.js @@ -5,7 +5,7 @@ /** * Load HTML from a remote file and inject it into the DOM */ -$.fn.load = function( url, params, callback ) { +jQuery.fn.load = function( url, params, callback ) { // I overwrote the event plugin's .load // this won't happen again, I hope -John if ( url && url.constructor == Function ) @@ -24,7 +24,7 @@ $.fn.load = function( url, params, callback ) { // Otherwise, build a param string } else { - params = $.param( params ); + params = jQuery.param( params ); type = "POST"; } } @@ -32,7 +32,7 @@ $.fn.load = function( url, params, callback ) { var self = this; // Request the remote document - $.ajax( type, url, params,function(res){ + jQuery.ajax( type, url, params,function(res){ // Inject the HTML into all the matched elements self.html(res.responseText).each(function(){ @@ -52,157 +52,173 @@ $.fn.load = function( url, params, callback ) { return this; }; -/** - * Load a remote page using a GET request - */ -$.get = function( url, callback, type ) { - // Build and start the HTTP Request - $.ajax( "GET", url, null, function(r) { - if ( callback ) callback( $.httpData(r,type) ); - }); -}; - -/** - * Load a remote page using a POST request. - */ -$.post = function( url, data, callback, type ) { - // Build and start the HTTP Request - $.ajax( "POST", url, $.param(data), function(r) { - if ( callback ) callback( $.httpData(r,type) ); - }); -}; - // If IE is used, create a wrapper for the XMLHttpRequest object -if ( $.browser == "msie" ) +if ( jQuery.browser.msie ) XMLHttpRequest = function(){ return new ActiveXObject( - (navigator.userAgent.toLowerCase().indexOf("msie 5") >= 0) ? + navigator.userAgent.indexOf("MSIE 5") >= 0 ? "Microsoft.XMLHTTP" : "Msxml2.XMLHTTP" ); }; // Attach a bunch of functions for handling common AJAX events -(function(){ - var e = "ajaxStart.ajaxComplete.ajaxError.ajaxSuccess".split(','); +new function(){ + var e = "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess".split(','); - for ( var i = 0; i < e.length; i++ ){ (function(){ + for ( var i = 0; i < e.length; i++ ) new function(){ var o = e[i]; - $.fn[o] = function(f){return this.bind(o, f);}; - })();} -})(); - -/** - * A common wrapper for making XMLHttpRequests - */ -$.ajax = function( type, url, data, ret ) { - // 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; - data = type.data; - url = type.url; - type = type.type; + jQuery.fn[o] = function(f){ + return this.bind(o, f); + }; } +}; - // Create the request object - var xml = new XMLHttpRequest(); +jQuery.extend({ - // Open the socket - xml.open(type || "GET", url, true); + /** + * Load a remote page using a GET request + */ + get: function( url, data, callback, type ) { + if ( data.constructor == Function ) { + callback = data; + data = null; + } + + if ( data ) + url += "?" + jQuery.param(data); + + // Build and start the HTTP Request + jQuery.ajax( "GET", url, null, function(r) { + if ( callback ) callback( jQuery.httpData(r,type) ); + }); + }, - // Set the correct header, if data is being sent - if ( data ) - xml.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); - - // Set header so calling script knows that it's an XMLHttpRequest - xml.setRequestHeader("X-Requested-With", "XMLHttpRequest"); - - // Make sure the browser sends the right content length - if ( xml.overrideMimeType ) - xml.setRequestHeader("Connection", "close"); - - // Wait for a response to come back - xml.onreadystatechange = function(){ - // Socket is openend - if ( xml.readyState == 1 ) { - // Increase counter - $.ajax.active++; - - // Show 'loader' - $.event.trigger( "ajaxStart" ); + /** + * Load a remote page using a POST request. + */ + post: function( url, data, callback, type ) { + // Build and start the HTTP Request + jQuery.ajax( "POST", url, jQuery.param(data), function(r) { + if ( callback ) callback( jQuery.httpData(r,type) ); + }); + }, + + /** + * A common wrapper for making XMLHttpRequests + */ + ajax: function( type, url, data, ret ) { + // 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; + data = type.data; + url = type.url; + type = type.type; } - - // Socket is closed and data is available - if ( xml.readyState == 4 ) { - // Hide loader if needed - if ( ! --$.ajax.active ) { - $.event.trigger( "ajaxComplete" ); - $.ajax.active = 0 - } - - // Make sure that the request was successful - if ( $.httpSuccess( xml ) ) { - - // If a local callback was specified, fire it - if ( success ) success( xml ); + + // Watch for a new set of requests + if ( ! jQuery.active++ ) + jQuery.event.trigger( "ajaxStart" ); + + // Create the request object + var xml = new XMLHttpRequest(); + + // Open the socket + xml.open(type || "GET", url, true); + + // Set the correct header, if data is being sent + if ( data ) + xml.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); + + // Set header so calling script knows that it's an XMLHttpRequest + xml.setRequestHeader("X-Requested-With", "XMLHttpRequest"); + + // Make sure the browser sends the right content length + if ( xml.overrideMimeType ) + xml.setRequestHeader("Connection", "close"); + + // Wait for a response to come back + xml.onreadystatechange = function(){ + // The transfer is complete and the data is available + if ( xml.readyState == 4 ) { + // Make sure that the request was successful + if ( jQuery.httpSuccess( xml ) ) { - // Fire the global callback - $.event.trigger( "ajaxSuccess" ); - - // Otherwise, the request was not successful - } else { - // If a local callback was specified, fire it - if ( error ) error( xml ); + // If a local callback was specified, fire it + if ( success ) success( xml ); + + // Fire the global callback + jQuery.event.trigger( "ajaxSuccess" ); + + // Otherwise, the request was not successful + } else { + // If a local callback was specified, fire it + if ( error ) error( xml ); + + // Fire the global callback + jQuery.event.trigger( "ajaxError" ); + } + + // The request was completed + jQuery.event.trigger( "ajaxComplete" ); - // Fire the global callback - $.event.trigger( "ajaxError" ); + // Handle the global AJAX counter + if ( ! --jQuery.active ) + jQuery.event.trigger( "ajaxStop" ); + + // Process result + if ( ret ) ret(xml); } - - // Process result - if ( ret ) ret(xml); } - }; - - // Send the data - xml.send(data); -}; - -// Counter for holding the number of active queries -$.ajax.active = 0; - -// Determines if an XMLHttpRequest was successful or not -$.httpSuccess = function(r) { - return ( r.status && ( r.status >= 200 && r.status < 300 ) || - r.status == 304 ) || !r.status && location.protocol == "file:"; -}; - -// Get the data out of an XMLHttpRequest -$.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; -}; - -// Serialize an array of form elements or a set of -// key/values into a query string -$.param = function(a) { - var s = []; - - // If an array was passed in, assume that it is an array - // of form elements - if ( a.constructor == Array ) - // Serialize the form elements - for ( var i = 0; i < a.length; i++ ) - s.push( a[i].name + "=" + encodeURIComponent( a[i].value ) ); + + // Send the data + xml.send(data); + }, + + // Counter for holding the number of active queries + active: 0, + + // Determines if an XMLHttpRequest was successful or not + httpSuccess: function(r) { + 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. + // Return parsed XML if content-type header is "xml" and type is "xml" or omitted, + // otherwise return plain text. + httpData: function(r,type) { + 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 + // key/values into a query string + param: function(a) { + var s = []; - // 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] ) ); - - // Return the resulting serialization - return s.join("&"); -}; + // If an array was passed in, assume that it is an array + // of form elements + if ( a.constructor == Array ) + // Serialize the form elements + for ( var i = 0; i < a.length; i++ ) + s.push( a[i].name + "=" + encodeURIComponent( a[i].value ) ); + + // 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] ) ); + + // Return the resulting serialization + return s.join("&"); + } + +});