X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fajax.js;h=6a757eb116febd4ffdde5bd2ae94247c8dd9c893;hb=09022e0b09db71259751e7146bb64727615028af;hp=31efc566f0a9f236df071333f9842484972baa0a;hpb=e63fa8beb8e285fe19fc0a1557045b80e3c63c66;p=jquery.git diff --git a/src/ajax.js b/src/ajax.js index 31efc56..6a757eb 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 = /\?/, @@ -180,19 +180,10 @@ jQuery.extend({ password: null, traditional: false, */ - // Create the request object; Microsoft failed to properly - // implement the XMLHttpRequest in IE7 (can't request local files), - // so we use the ActiveXObject when it is available // This function can be overriden by calling jQuery.ajaxSetup - xhr: window.XMLHttpRequest && (window.location.protocol !== "file:" || !window.ActiveXObject) ? - function() { - return new window.XMLHttpRequest(); - } : - function() { - try { - return new window.ActiveXObject("Microsoft.XMLHTTP"); - } catch(e) {} - }, + xhr: function() { + return new window.XMLHttpRequest(); + }, accepts: { xml: "application/xml, text/xml", html: "text/html", @@ -217,6 +208,12 @@ jQuery.extend({ s.data = jQuery.param( s.data, s.traditional ); } + // If the jsonpCallback has been set, we can assume that dataType is jsonp + // Ticket #5803 + if ( s.jsonpCallback ) { + s.dataType = "jsonp"; + } + // Handle JSONP Parameter Callbacks if ( s.dataType === "jsonp" ) { if ( type === "GET" ) { @@ -248,10 +245,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 ); @@ -263,6 +256,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 ); @@ -274,7 +271,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 @@ -284,13 +281,13 @@ 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" ); } @@ -317,8 +314,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; @@ -367,8 +364,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]); } } @@ -387,7 +384,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" ); } @@ -397,7 +394,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 @@ -407,7 +404,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; @@ -422,9 +419,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"; @@ -434,7 +431,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; @@ -445,15 +442,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" ) { @@ -467,12 +464,14 @@ 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 ) { + // xhr.abort in IE7 is not a native JS function + // and does not have a call property + if ( xhr && oldAbort.call ) { oldAbort.call( xhr ); } @@ -495,10 +494,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 @@ -581,7 +580,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, @@ -598,7 +599,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] ); } }, @@ -610,7 +611,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] ); } }, @@ -622,11 +623,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" ); } }, @@ -653,11 +654,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; @@ -695,10 +696,28 @@ jQuery.extend( jQuery.ajax, { }); +/* + * Create the request object; Microsoft failed to properly + * implement the XMLHttpRequest in IE7 (can't request local files), + * so we use the ActiveXObject when it is available + * Additionally XMLHttpRequest can be disabled in IE7/IE8 so + * we need a fallback. + */ +if ( window.ActiveXObject ) { + jQuery.ajaxSettings.xhr = function() { + if ( window.location.protocol !== "file:" ) { + try { + return new window.XMLHttpRequest(); + } catch(xhrError) {} + } + + try { + return new window.ActiveXObject("Microsoft.XMLHTTP"); + } catch(activeError) {} + }; +} + // Does this browser support XHR requests? jQuery.support.ajax = !!jQuery.ajaxSettings.xhr(); -// For backwards compatibility -jQuery.extend( jQuery.ajax ); - })( jQuery );