X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=ajax%2Fajax.js;h=72aa82fbafcb98b248a9f07ccce7e4ef54c0dd18;hb=c3c706d3f24dbad0fdeb80fe9caf158bd9d6de66;hp=87eadbf675339abf52e0eb8ab72260766c4b694a;hpb=8a4a1edf047f2c272f663866eb7b5fcd644d65b3;p=jquery.git diff --git a/ajax/ajax.js b/ajax/ajax.js index 87eadbf..72aa82f 100644 --- a/ajax/ajax.js +++ b/ajax/ajax.js @@ -2,87 +2,207 @@ // Docs Here: // http://jquery.com/docs/ajax/ -if ( typeof XMLHttpRequest == 'undefined' && typeof window.ActiveXObject == 'function') { - var XMLHttpRequest = function() { - return new ActiveXObject((navigator.userAgent.toLowerCase().indexOf('msie 5') >= 0) ? - "Microsoft.XMLHTTP" : "Msxml2.XMLHTTP"); - }; -} +/** + * Load HTML from a remote file and inject it into the DOM + */ +$.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 ) + return this.bind("load", url); -$.xml = function( type, url, data, ret ) { - var xml = new XMLHttpRequest(); + // Default to a GET request + var type = "GET"; - if ( xml ) { - xml.open(type || "GET", url, true); + // If the second parameter was provided + if ( params ) { + // If it's a function + if ( params.constructor == Function ) { + // We assume that it's the callback + callback = params; + params = null; + + // Otherwise, build a param string + } else { + params = $.param( params ); + type = "POST"; + } + } + + var self = this; + + // Request the remote document + $.ajax( type, url, params,function(res){ + + // Inject the HTML into all the matched elements + self.html(res.responseText).each(function(){ + // If a callback function was provided + if ( callback && callback.constructor == Function ) + // Execute it within the context of the element + callback.apply( self, [res.responseText] ); + }); + + // Execute all the scripts inside of the newly-injected HTML + $("script", self).each(function(){ + eval( this.text || this.textContent || this.innerHTML || ""); + }); - if ( data ) - xml.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); - - if ( ret ) - xml.onreadystatechange = function() { - if ( xml.readyState == 4 ) ret(xml); - }; - - xml.send(data) - } + }); + + return this; }; -$.httpData = function(r,type) { - return r.getResponseHeader("content-type").indexOf("xml") > 0 || type == "xml" ? - r.responseXML : r.responseText; +/** + * 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) ); + }); }; -$.get = function( url, ret, type ) { - $.xml( "GET", url, null, function(r) { - if ( ret ) ret( $.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) ); + }); }; -$.getXML = function( url, ret ) { - $.get( url, ret, "xml" ); -}; +// If IE is used, create a wrapper for the XMLHttpRequest object +if ( $.browser == "msie" ) + XMLHttpRequest = function(){ + return new ActiveXObject( + (navigator.userAgent.toLowerCase().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(','); + + for ( var i = 0; i < e.length; i++ ){ (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; + } + + // 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"); -$.post = function( url, data, ret, type ) { - $.xml( "POST", url, $.param(data), function(r) { - if ( ret ) ret( $.httpData(r,type) ); - }); + // 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" ); + } + + // 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 ); + + // 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 ); + + // Fire the global callback + $.event.trigger( "ajaxError" ); + } + + // Process result + if ( ret ) ret(xml); + } + }; + + // Send the data + xml.send(data); }; -$.postXML = function( url, data, ret ) { - $.post( url, data, ret, "xml" ); +// 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:"; }; -$.param = function(a) { - var s = []; - for ( var i in a ) - s[s.length] = i + "=" + encodeURIComponent( a[i] ); - return s.join("&"); +// 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; }; -$.fn.load = function(a,o,f) { - // Arrrrghhhhhhhh!! - // I overwrote the event plugin's .load - // this won't happen again, I hope -John - if ( a && a.constructor == Function ) - return this.bind("load", a); - - var t = "GET"; - if ( o && o.constructor == Function ) { - f = o; o = null; - } - if (o != null) { - o = $.param(o); - t = "POST"; - } - var self = this; - $.xml(t,a,o,function(h){ - var h = h.responseText; - self.html(h).find("script").each(function(){ - try { - eval( this.text || this.textContent || this.innerHTML ); - } catch(e){} - }); - if(f)f(h); - }); - return this; +// 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 ) ); + + // 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("&"); };