X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=ajax%2Fajax.js;h=1960150e34ac6065e7d956777611f6d7dca815d7;hb=e8627fe1555602dc4713c4e848a41642b2654512;hp=ef7240f416b88d3cf967cabaa4601e4c677cfd2b;hpb=3386923dccbb9f0e7a9518109d54bcbd0f8f863d;p=jquery.git diff --git a/ajax/ajax.js b/ajax/ajax.js index ef7240f..1960150 100644 --- a/ajax/ajax.js +++ b/ajax/ajax.js @@ -2,189 +2,223 @@ // Docs Here: // http://jquery.com/docs/ajax/ -if ( typeof XMLHttpRequest == 'undefined' && typeof window.ActiveXObject == 'function') { - XMLHttpRequest = function() { - return new ActiveXObject((navigator.userAgent.toLowerCase().indexOf('msie 5') >= 0) ? - "Microsoft.XMLHTTP" : "Msxml2.XMLHTTP"); - }; -} - -// -// Counter for holding the active query's -$.xmlActive=0; - -$.xml = function( type, url, data, ret ) { - var xml = new XMLHttpRequest(); - - if ( xml ) { - // - // Increase the query counter - $.xmlActive++; - - // - // Show loader if needed - if ($.xmlCreate) { - $.xmlCreate(); - } - - // - // Open the socket - xml.open(type || "GET", url, true); - - 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'); - - /* Force "Connection: close" for Mozilla browsers to work around - * a bug where XMLHttpReqeuest sends an incorrect Content-length - * header. See Mozilla Bugzilla #246651. - */ - if ( xml.overrideMimeType ) { - xml.setRequestHeader('Connection', 'close'); - } - - xml.onreadystatechange = function() { - if ( xml.readyState == 4 ) { - if ( ret ) { ret(xml); } - - // - // Decrease counter - $.xmlActive--; - - // - // Hide loader if needed - if ($.xmlActive <= 0) { - if ($.xmlDestroy) { - $.xmlDestroy(); - } - } - } - }; - - xml.send(data); - } -}; - -$.httpData = function(r,type) { - return r.getResponseHeader("content-type").indexOf("xml") > 0 || type == "xml" ? - r.responseXML : r.responseText; -}; - -$.get = function( url, ret, type ) { - $.xml( "GET", url, null, function(r) { - if ( ret ) { ret( $.httpData(r,type) ); } - }); -}; - -$.getXML = function( url, ret ) { - $.get( url, ret, "xml" ); -}; - -$.post = function( url, data, ret, type ) { - $.xml( "POST", url, $.param(data), function(r) { - if ( ret ) { ret( $.httpData(r,type) ); } - }); -}; - -$.postXML = function( url, data, ret ) { - $.post( url, data, ret, "xml" ); -}; - -$.param = function(a) { - var s = []; - if (a && typeof a == 'object' && a.constructor == Array) { - for ( var i=0; i < a.length; i++ ) { - s[s.length] = a[i].name + "=" + encodeURIComponent( a[i].value ); - } - } else { - for ( var j in a ) { - s[s.length] = j + "=" + encodeURIComponent( a[j] ); - } - } - return s.join("&"); -}; - -$.fn.load = function(a,o,f) { - // Arrrrghhhhhhhh!! +/** + * Load HTML from a remote file and inject it into the DOM + */ +jQuery.fn.load = function( url, params, callback ) { // 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"; + if ( url && url.constructor == Function ) + return this.bind("load", url); + + // Default to a GET request + var type = "GET"; + + // 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 = jQuery.param( params ); + type = "POST"; + } } + var self = this; - $.xml(t,a,o,function(h){ - h = h.responseText; - self.html(h).find("script").each(function(){ - try { - $.eval( this.text || this.textContent || this.innerHTML ); - } catch(e){} + + // Request the remote document + jQuery.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(f){f(h);} + }); + return this; }; -/** - * function: $.fn.formValues - * usage: $('#frmLogin').formValues() - * docs: Gets form values and creates a key=>value array of the found values (for ENABLED elements!) - */ -$.fn.formValues = function() { - var a = []; - $("input,textarea,option",this).filter(":enabled").each(function(){ - // Skip selects with options which are not selected - if ((this.parentNode.type == 'select-one' || this.parentNode.type == 'select-multiple') && !this.selected) { - return null; - } - - // Skip radio and checkbox elements which are not checked - if ((this.type == 'radio' || this.type == 'checkbox') && !this.checked) { - return null; - } +// If IE is used, create a wrapper for the XMLHttpRequest object +if ( jQuery.browser.msie ) + XMLHttpRequest = function(){ + return new ActiveXObject( + navigator.userAgent.indexOf("MSIE 5") >= 0 ? + "Microsoft.XMLHTTP" : "Msxml2.XMLHTTP" + ); + }; - // All other elements are valid - a.push({ - name: this.name || this.id || this.parentNode.name || this.parentNode.id, - value: this.value - }); - }); - return a; +// Attach a bunch of functions for handling common AJAX events +new function(){ + var e = "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess".split(','); + + for ( var i = 0; i < e.length; i++ ) new function(){ + var o = e[i]; + jQuery.fn[o] = function(f){ + return this.bind(o, f); + }; + } }; -/** - * function: $.update - * usage: $.update('someJQueryObject', 'someurl', 'array'); - * docs: Mimics the ajaxUpdater from prototype. Posts the key=>value array to the url and - * puts the results from that call in the jQuery object specified. - * --> If you set the blnNoEval to true, the script tags are NOT evaluated. - */ -$.update = function(objElement, strURL, arrValues, fncCallback) { - $.post(strURL, arrValues, function(strHTML) { - // Update the element with the new HTML - objElement.html(strHTML); +jQuery.extend({ - // Evaluate the scripts - objElement.html(strHTML).find("script").each(function(){ - try { - $.eval( this.text || this.textContent || this.innerHTML ); - } catch(e) { } + /** + * 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) ); + }); + }, + + /** + * 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; + } + + // 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 ) ) { + + // 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" ); + + // Handle the global AJAX counter + if ( ! --jQuery.active ) + jQuery.event.trigger( "ajaxStop" ); + + // Process result + if ( ret ) ret(xml); + } + } + + // 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 = []; + + // 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("&"); + } - // Callback handler - if (fncCallback) { fncCallback(); } - }); -}; +});