X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fajax.js;h=e0ab7f483c608c365980e7d417292bced0c9921a;hb=a56317ea3ae99cee1783e27e36f3b9b323695bf8;hp=80cabd32d65001efd52d1505abeea1603ce97c99;hpb=56a93fc2cce999ccfb0e3b80aeaa0f480ef7ae6e;p=jquery.git diff --git a/src/ajax.js b/src/ajax.js index 80cabd3..e0ab7f4 100644 --- a/src/ajax.js +++ b/src/ajax.js @@ -1,7 +1,10 @@ jQuery.fn.extend({ + // Keep a copy of the old load + _load: jQuery.fn.load, + load: function( url, params, callback ) { - if ( jQuery.isFunction( url ) ) - return this.bind("load", url); + if ( typeof url != 'string' ) + return this._load( url ); var off = url.indexOf(" "); if ( off >= 0 ) { @@ -34,6 +37,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 @@ -90,7 +94,7 @@ jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".sp }; }); -var jsc = (new Date).getTime(); +var jsc = now(); jQuery.extend({ get: function( url, data, callback, type ) { @@ -143,14 +147,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) @@ -176,8 +190,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 @@ -191,6 +205,8 @@ jQuery.extend({ // Garbage collect window[ jsonp ] = undefined; try{ delete window[ jsonp ]; } catch(e){} + if ( head ) + head.removeChild( script ); }; } @@ -198,7 +214,7 @@ jQuery.extend({ s.cache = false; if ( s.cache === false && s.type.toLowerCase() == "get" ) { - var ts = (new Date()).getTime(); + var ts = now(); // try replacing _= if it is there var ret = s.url.replace(/(\?|&)_=.*?(&|$)/, "$1_=" + ts + "$2"); // if nothing was replaced, add timestamp to the end @@ -219,10 +235,12 @@ jQuery.extend({ // If we're requesting a remote document // 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" ) { + if ( (!s.url.indexOf("http") || !s.url.indexOf("//")) && s.dataType == "script" && 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 ) { @@ -243,7 +261,7 @@ jQuery.extend({ head.appendChild(script); // We handle everything using the script element injection - return; + return undefined; } var requestDone = false; @@ -253,7 +271,7 @@ 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); // Need an extra try/catch for cross domain requests in Firefox 3 try { @@ -268,12 +286,22 @@ jQuery.extend({ // 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.beforeSend && s.beforeSend(xml, s) === false ) { + // cleanup active request counter + s.global && jQuery.active--; + // close opended socket + xml.abort(); + return false; + } + if ( s.global ) jQuery.event.trigger("ajaxSend", [xml, s]); @@ -358,9 +386,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 @@ -385,6 +410,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 ) { @@ -423,9 +451,9 @@ jQuery.extend({ }, httpData: function( r, type ) { - var ct = r.getResponseHeader("content-type"); - var xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0; - var data = xml ? r.responseXML : r.responseText; + var ct = r.getResponseHeader("content-type"), + xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0, + data = xml ? r.responseXML : r.responseText; if ( xml && data.documentElement.tagName == "parsererror" ) throw "parsererror"; @@ -464,7 +492,7 @@ jQuery.extend({ s.push( encodeURIComponent(j) + "=" + encodeURIComponent( this ) ); }); else - s.push( encodeURIComponent(j) + "=" + encodeURIComponent( a[j] ) ); + s.push( encodeURIComponent(j) + "=" + encodeURIComponent( jQuery.isFunction(a[j]) ? a[j]() : a[j] ) ); // Return the resulting serialization return s.join("&").replace(/%20/g, "+");