X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fajax.js;h=61b9c438efa1185dfb8f22efd79379afe7aa1efd;hb=2a0c7d702b83a6b2e40eb79a5d6ea94d74f3090d;hp=e6154806808093afcd5e84df95a2ecde89b3ae23;hpb=873c28425fb64fdb48cfa09d17041bded39b301f;p=jquery.git diff --git a/src/ajax.js b/src/ajax.js index e615480..61b9c43 100644 --- a/src/ajax.js +++ b/src/ajax.js @@ -4,7 +4,7 @@ var jsc = jQuery.now(), rscript = /)<[^<]*)*<\/script>/gi, rselectTextarea = /^(?:select|textarea)/i, rinput = /^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i, - rnoContent = /^(?:GET|HEAD|DELETE)$/, + rnoContent = /^(?:GET|HEAD)$/, rbracket = /\[\]$/, jsre = /\=\?(&|$)/, rquery = /\?/, @@ -198,7 +198,10 @@ jQuery.extend({ var s = jQuery.extend(true, {}, jQuery.ajaxSettings, origSettings), jsonp, status, data, type = s.type.toUpperCase(), noContent = rnoContent.test(type); - s.url = s.url.replace( rhash, "" ); + // toString fixes people passing a window.location or + // document.location to $.ajax, which worked in 1.4.2 and + // earlier (bug #7531). It should be removed in 1.5. + s.url = s.url.toString().replace( rhash, "" ); // Use original (not extended) context object if it was provided s.context = origSettings && origSettings.context != null ? origSettings.context : s; @@ -239,10 +242,6 @@ jQuery.extend({ var customJsonp = window[ jsonp ]; window[ jsonp ] = function( tmp ) { - data = tmp; - jQuery.ajax.handleSuccess( s, xhr, status, data ); - jQuery.ajax.handleComplete( s, xhr, status, data ); - if ( jQuery.isFunction( customJsonp ) ) { customJsonp( tmp ); @@ -254,6 +253,10 @@ jQuery.extend({ delete window[ jsonp ]; } catch( jsonpError ) {} } + + data = tmp; + jQuery.handleSuccess( s, xhr, status, data ); + jQuery.handleComplete( s, xhr, status, data ); if ( head ) { head.removeChild( script ); @@ -265,7 +268,7 @@ jQuery.extend({ s.cache = false; } - if ( s.cache === false && type === "GET" ) { + if ( s.cache === false && noContent ) { var ts = jQuery.now(); // try replacing _= if it is there @@ -275,19 +278,19 @@ jQuery.extend({ s.url = ret + ((ret === s.url) ? (rquery.test(s.url) ? "&" : "?") + "_=" + ts : ""); } - // If data is available, append data to url for get requests - if ( s.data && type === "GET" ) { + // If data is available, append data to url for GET/HEAD requests + if ( s.data && noContent ) { s.url += (rquery.test(s.url) ? "&" : "?") + s.data; } // Watch for a new set of requests - if ( s.global && jQuery.ajax.active++ === 0 ) { + if ( s.global && jQuery.active++ === 0 ) { jQuery.event.trigger( "ajaxStart" ); } // Matches an absolute URL, and saves the domain var parts = rurl.exec( s.url ), - remote = parts && (parts[1] && parts[1] !== location.protocol || parts[2] !== location.host); + remote = parts && (parts[1] && parts[1].toLowerCase() !== location.protocol || parts[2].toLowerCase() !== location.host); // If we're requesting a remote document // and trying to load JSON or Script with a GET @@ -308,8 +311,8 @@ jQuery.extend({ if ( !done && (!this.readyState || this.readyState === "loaded" || this.readyState === "complete") ) { done = true; - jQuery.ajax.handleSuccess( s, xhr, status, data ); - jQuery.ajax.handleComplete( s, xhr, status, data ); + jQuery.handleSuccess( s, xhr, status, data ); + jQuery.handleComplete( s, xhr, status, data ); // Handle memory leak in IE script.onload = script.onreadystatechange = null; @@ -358,8 +361,8 @@ jQuery.extend({ xhr.setRequestHeader("If-Modified-Since", jQuery.lastModified[s.url]); } - if ( jQuery.ajax.etag[s.url] ) { - xhr.setRequestHeader("If-None-Match", jQuery.ajax.etag[s.url]); + if ( jQuery.etag[s.url] ) { + xhr.setRequestHeader("If-None-Match", jQuery.etag[s.url]); } } @@ -378,7 +381,7 @@ jQuery.extend({ // Allow custom headers/mimetypes and early abort if ( s.beforeSend && s.beforeSend.call(s.context, xhr, s) === false ) { // Handle the global AJAX counter - if ( s.global && jQuery.ajax.active-- === 1 ) { + if ( s.global && jQuery.active-- === 1 ) { jQuery.event.trigger( "ajaxStop" ); } @@ -388,7 +391,7 @@ jQuery.extend({ } if ( s.global ) { - jQuery.ajax.triggerGlobal( s, "ajaxSend", [xhr, s] ); + jQuery.triggerGlobal( s, "ajaxSend", [xhr, s] ); } // Wait for a response to come back @@ -398,7 +401,7 @@ jQuery.extend({ // Opera doesn't call onreadystatechange before this point // so we simulate the call if ( !requestDone ) { - jQuery.ajax.handleComplete( s, xhr, status, data ); + jQuery.handleComplete( s, xhr, status, data ); } requestDone = true; @@ -413,9 +416,9 @@ jQuery.extend({ status = isTimeout === "timeout" ? "timeout" : - !jQuery.ajax.httpSuccess( xhr ) ? + !jQuery.httpSuccess( xhr ) ? "error" : - s.ifModified && jQuery.ajax.httpNotModified( xhr, s.url ) ? + s.ifModified && jQuery.httpNotModified( xhr, s.url ) ? "notmodified" : "success"; @@ -425,7 +428,7 @@ jQuery.extend({ // Watch for, and catch, XML document parse errors try { // process the data (runs the xml through httpData regardless of callback) - data = jQuery.ajax.httpData( xhr, s.dataType, s ); + data = jQuery.httpData( xhr, s.dataType, s ); } catch( parserError ) { status = "parsererror"; errMsg = parserError; @@ -436,15 +439,15 @@ jQuery.extend({ if ( status === "success" || status === "notmodified" ) { // JSONP handles its own success callback if ( !jsonp ) { - jQuery.ajax.handleSuccess( s, xhr, status, data ); + jQuery.handleSuccess( s, xhr, status, data ); } } else { - jQuery.ajax.handleError( s, xhr, status, errMsg ); + jQuery.handleError( s, xhr, status, errMsg ); } // Fire the complete handlers if ( !jsonp ) { - jQuery.ajax.handleComplete( s, xhr, status, data ); + jQuery.handleComplete( s, xhr, status, data ); } if ( isTimeout === "timeout" ) { @@ -458,13 +461,16 @@ jQuery.extend({ } }; - // Override the abort handler, if we can (IE doesn't allow it, but that's OK) + // Override the abort handler, if we can (IE 6 doesn't allow it, but that's OK) // Opera doesn't fire onreadystatechange at all on abort try { var oldAbort = xhr.abort; xhr.abort = function() { if ( xhr ) { - oldAbort.call( xhr ); + // oldAbort has no call property in IE7 so + // just do it this way, which works in all + // browsers + Function.prototype.call.call( oldAbort, xhr ); } onreadystatechange( "abort" ); @@ -486,10 +492,10 @@ jQuery.extend({ xhr.send( noContent || s.data == null ? null : s.data ); } catch( sendError ) { - jQuery.ajax.handleError( s, xhr, null, sendError ); + jQuery.handleError( s, xhr, null, sendError ); // Fire the complete handlers - jQuery.ajax.handleComplete( s, xhr, status, data ); + jQuery.handleComplete( s, xhr, status, data ); } // firefox 1.5 doesn't fire statechange for sync requests @@ -504,11 +510,12 @@ jQuery.extend({ // Serialize an array of form elements or a set of // key/values into a query string param: function( a, traditional ) { - var s = [], add = function( key, value ) { - // If value is a function, invoke it and return its value - value = jQuery.isFunction(value) ? value() : value; - s[ s.length ] = encodeURIComponent(key) + "=" + encodeURIComponent(value); - }; + var s = [], + add = function( key, value ) { + // If value is a function, invoke it and return its value + value = jQuery.isFunction(value) ? value() : value; + s[ s.length ] = encodeURIComponent(key) + "=" + encodeURIComponent(value); + }; // Set traditional to true for jQuery <= 1.3.2 behavior. if ( traditional === undefined ) { @@ -572,7 +579,9 @@ function buildParams( prefix, obj, traditional, add ) { } } -jQuery.extend( jQuery.ajax, { +// This is still on the jQuery object... for now +// Want to move this to jQuery.ajax some day +jQuery.extend({ // Counter for holding the number of active queries active: 0, @@ -589,7 +598,7 @@ jQuery.extend( jQuery.ajax, { // Fire the global callback if ( s.global ) { - jQuery.ajax.triggerGlobal( s, "ajaxError", [xhr, s, e] ); + jQuery.triggerGlobal( s, "ajaxError", [xhr, s, e] ); } }, @@ -601,7 +610,7 @@ jQuery.extend( jQuery.ajax, { // Fire the global callback if ( s.global ) { - jQuery.ajax.triggerGlobal( s, "ajaxSuccess", [xhr, s] ); + jQuery.triggerGlobal( s, "ajaxSuccess", [xhr, s] ); } }, @@ -613,11 +622,11 @@ jQuery.extend( jQuery.ajax, { // The request was completed if ( s.global ) { - jQuery.ajax.triggerGlobal( s, "ajaxComplete", [xhr, s] ); + jQuery.triggerGlobal( s, "ajaxComplete", [xhr, s] ); } // Handle the global AJAX counter - if ( s.global && jQuery.ajax.active-- === 1 ) { + if ( s.global && jQuery.active-- === 1 ) { jQuery.event.trigger( "ajaxStop" ); } }, @@ -644,11 +653,11 @@ jQuery.extend( jQuery.ajax, { etag = xhr.getResponseHeader("Etag"); if ( lastModified ) { - jQuery.ajax.lastModified[url] = lastModified; + jQuery.lastModified[url] = lastModified; } if ( etag ) { - jQuery.ajax.etag[url] = etag; + jQuery.etag[url] = etag; } return xhr.status === 304; @@ -698,19 +707,16 @@ if ( window.ActiveXObject ) { if ( window.location.protocol !== "file:" ) { try { return new window.XMLHttpRequest(); - } catch(e) {} + } catch(xhrError) {} } try { return new window.ActiveXObject("Microsoft.XMLHTTP"); - } catch(e) {} + } catch(activeError) {} }; } // Does this browser support XHR requests? jQuery.support.ajax = !!jQuery.ajaxSettings.xhr(); -// For backwards compatibility -jQuery.extend( jQuery.ajax ); - })( jQuery );