X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fajax.js;h=743857c1a07f6d9bcd313a77ca201b9c3ed6be9b;hb=047debc750bd7ca15229297c1f3ab98527fe5be6;hp=225165a31de2f605856798f8596bbbbe628a0fda;hpb=6853370fbb631a1d40d63c295626b7af6b0c7755;p=jquery.git diff --git a/src/ajax.js b/src/ajax.js index 225165a..743857c 100644 --- a/src/ajax.js +++ b/src/ajax.js @@ -34,6 +34,7 @@ jQuery.fn.extend({ jQuery.ajax({ url: url, type: type, + dataType: "html", data: params, complete: function(res, status){ // If successful, inject the HTML into all the matched elements @@ -52,10 +53,7 @@ jQuery.fn.extend({ // If not, just inject the full result res.responseText ); - // Add delay to account for Safari's delay in globalEval - setTimeout(function(){ - self.each( callback, [res.responseText, status, res] ); - }, 13); + self.each( callback, [res.responseText, status, res] ); } }); return this; @@ -146,14 +144,24 @@ jQuery.extend({ contentType: "application/x-www-form-urlencoded", processData: true, async: true, - data: null + data: null, + username: null, + password: null, + accepts: { + xml: "application/xml, text/xml", + html: "text/html", + script: "text/javascript, application/javascript", + json: "application/json, text/javascript", + text: "text/plain", + "default": "*/*" + } }, // Last-Modified header cache for next request lastModified: {}, ajax: function( s ) { - var jsonp, jsre = /=(\?|%3F)/g, status, data; + var jsonp, jsre = /=\?(&|$)/g, status, data; // Extend the settings, but re-extend 's' so that it can be // checked again later (in the test suite, specifically) @@ -179,8 +187,8 @@ jQuery.extend({ // Replace the =? sequence both in the query string and the data if ( s.data ) - s.data = (s.data + "").replace(jsre, "=" + jsonp); - s.url = s.url.replace(jsre, "=" + jsonp); + s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1"); + s.url = s.url.replace(jsre, "=" + jsonp + "$1"); // We need to make sure // that a JSONP style response is executed properly @@ -194,14 +202,21 @@ jQuery.extend({ // Garbage collect window[ jsonp ] = undefined; try{ delete window[ jsonp ]; } catch(e){} + if ( head ) + head.removeChild( script ); }; } if ( s.dataType == "script" && s.cache == null ) s.cache = false; - if ( s.cache === false && s.type.toLowerCase() == "get" ) - s.url += (s.url.match(/\?/) ? "&" : "?") + "_=" + (new Date()).getTime(); + if ( s.cache === false && s.type.toLowerCase() == "get" ) { + var ts = (new Date()).getTime(); + // try replacing _= if it is there + var ret = s.url.replace(/(\?|&)_=.*?(&|$)/, "$1_=" + ts + "$2"); + // if nothing was replaced, add timestamp to the end + s.url = ret + ((ret == s.url) ? (s.url.match(/\?/) ? "&" : "?") + "_=" + ts : ""); + } // If data is available, append data to url for get requests if ( s.data && s.type.toLowerCase() == "get" ) { @@ -216,11 +231,13 @@ jQuery.extend({ jQuery.event.trigger( "ajaxStart" ); // If we're requesting a remote document - // and trying to load JSON or Script - if ( !s.url.indexOf("http") && s.dataType == "script" ) { + // and trying to load JSON or Script with a GET + if ( (!s.url.indexOf("http") || !s.url.indexOf("//")) && ( s.dataType == "script" || s.dataType =="json" ) && s.type.toLowerCase() == "get" ) { var head = document.getElementsByTagName("head")[0]; var script = document.createElement("script"); script.src = s.url; + if (s.scriptCharset) + script.charset = s.scriptCharset; // Handle Script loading if ( !jsonp ) { @@ -241,7 +258,7 @@ jQuery.extend({ head.appendChild(script); // We handle everything using the script element injection - return; + return undefined; } var requestDone = false; @@ -251,26 +268,34 @@ jQuery.extend({ var xml = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest(); // Open the socket - xml.open(s.type, s.url, s.async); + xml.open(s.type, s.url, s.async, s.username, s.password); - // Set the correct header, if data is being sent - if ( s.data ) - xml.setRequestHeader("Content-Type", s.contentType); + // Need an extra try/catch for cross domain requests in Firefox 3 + try { + // Set the correct header, if data is being sent + if ( s.data ) + xml.setRequestHeader("Content-Type", s.contentType); + + // Set the If-Modified-Since header, if ifModified mode. + if ( s.ifModified ) + xml.setRequestHeader("If-Modified-Since", + jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" ); - // Set the If-Modified-Since header, if ifModified mode. - if ( s.ifModified ) - xml.setRequestHeader("If-Modified-Since", - jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" ); + // Set header so the called script knows that it's an XMLHttpRequest + xml.setRequestHeader("X-Requested-With", "XMLHttpRequest"); - // Set header so the called script knows that it's an XMLHttpRequest - xml.setRequestHeader("X-Requested-With", "XMLHttpRequest"); + // Set the Accepts header for the server, depending on the dataType + xml.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ? + s.accepts[ s.dataType ] + ", */*" : + s.accepts.default ); + } catch(e){} // Allow custom headers/mimetypes if ( s.beforeSend ) s.beforeSend(xml); if ( s.global ) - jQuery.event.trigger("ajaxSend", [xml, s]); + jQuery.event.trigger("ajaxSend", [xml, s]); // Wait for a response to come back var onreadystatechange = function(isTimeout){ @@ -353,9 +378,6 @@ jQuery.extend({ // firefox 1.5 doesn't fire statechange for sync requests if ( !s.async ) onreadystatechange(); - - // return XMLHttpRequest to allow aborting the request etc. - return xml; function success(){ // If a local callback was specified, fire it and pass it the data @@ -380,6 +402,9 @@ jQuery.extend({ if ( s.global && ! --jQuery.active ) jQuery.event.trigger( "ajaxStop" ); } + + // return XMLHttpRequest to allow aborting the request etc. + return xml; }, handleError: function( s, xml, status, e ) { @@ -397,8 +422,9 @@ jQuery.extend({ // Determines if an XMLHttpRequest was successful or not httpSuccess: function( r ) { try { + // IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450 return !r.status && location.protocol == "file:" || - ( r.status >= 200 && r.status < 300 ) || r.status == 304 || + ( r.status >= 200 && r.status < 300 ) || r.status == 304 || r.status == 1223 || jQuery.browser.safari && r.status == undefined; } catch(e){} return false;