rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/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 = /\?/,
},
ajax: function( origSettings ) {
+ // IE8 leaks a lot when we've set abort, and IE6-8 a little
+ // when we have set onreadystatechange. Bug #6242
+ // XXX IE7 still leaks when abort is called, no matter what
+ // we do
+ function cleanup() {
+ // IE6 will throw an error setting xhr.abort
+ try {
+ xhr.abort = xhr.onreadystatechange = jQuery.noop;
+ } catch(e) {}
+ }
+
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).replace( rhash, "" );
// Use original (not extended) context object if it was provided
s.context = origSettings && origSettings.context != null ? origSettings.context : s;
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 );
delete window[ jsonp ];
} catch( jsonpError ) {}
}
+
+ data = tmp;
+ jQuery.handleSuccess( s, xhr, status, data );
+ jQuery.handleComplete( s, xhr, status, data );
if ( head ) {
head.removeChild( script );
};
}
- if ( s.dataType === "script" && s.cache === null ) {
+ if ( s.dataType === "script" && s.cache === undefined ) {
s.cache = false;
}
- if ( s.cache === false && type === "GET" ) {
+ if ( s.cache === false && noContent ) {
var ts = jQuery.now();
// try replacing _= if it is there
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
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;
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]);
}
}
// 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" );
}
}
if ( s.global ) {
- jQuery.ajax.triggerGlobal( s, "ajaxSend", [xhr, s] );
+ jQuery.triggerGlobal( s, "ajaxSend", [xhr, s] );
}
// Wait for a response to come back
// 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;
if ( xhr ) {
- xhr.onreadystatechange = jQuery.noop;
+ cleanup();
}
// The transfer is complete and the data is available, or the request timed out
} else if ( !requestDone && xhr && (xhr.readyState === 4 || isTimeout === "timeout") ) {
requestDone = true;
- xhr.onreadystatechange = jQuery.noop;
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";
// 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;
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" ) {
xhr.abort();
}
- // Stop memory leaks
- if ( s.async ) {
- xhr = null;
- }
+ cleanup();
}
};
try {
var oldAbort = xhr.abort;
xhr.abort = function() {
- // xhr.abort in IE7 is not a native JS function
- // and does not have a call property
- if ( xhr && oldAbort.call ) {
- oldAbort.call( xhr );
+ if ( 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" );
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
// 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 ) {
}
}
-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,
// Fire the global callback
if ( s.global ) {
- jQuery.ajax.triggerGlobal( s, "ajaxError", [xhr, s, e] );
+ jQuery.triggerGlobal( s, "ajaxError", [xhr, s, e] );
}
},
// Fire the global callback
if ( s.global ) {
- jQuery.ajax.triggerGlobal( s, "ajaxSuccess", [xhr, s] );
+ jQuery.triggerGlobal( s, "ajaxSuccess", [xhr, s] );
}
},
// 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" );
}
},
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;
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 );