我正在尝试找到源代码中定义jQuery.ajax()的位置.但是,使用grep似乎不起作用.
它在哪里?
谢谢.
> grep jQuery.ajax src/*
src/ajax.js:// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
src/ajax.js: flatOptions = jQuery.ajaxSettings.flatOptions || {};
src/ajax.js: params = jQuery.param( params,jQuery.ajaxSettings.Traditional );
src/ajax.js: jQuery.ajax({
src/ajax.js: return jQuery.ajax({
src/ajax.js: ajaxExtend( target,jQuery.ajaxSettings );
src/ajax.js: target = jQuery.ajaxSettings;
src/ajax.js: s = jQuery.ajaxSetup( {},options ),src/ajax.js: Traditional = jQuery.ajaxSettings.Traditional;
src/ajax.js:// Want to move this to jQuery.ajax some day
src/manipulation.js: jQuery.ajax({
解决方法
你去:
http://james.padolsey.com/jquery/#v=1.6.2&fn=jQuery.ajax
该站点对于浏览jQuery源代码非常有用.
上面链接的来源死了:
function (url,options) {
// If url is an object,simulate pre-1.5 signature
if (typeof url === "object") {
options = url;
url = undefined;
}
// Force options to be an object
options = options || {};
var // Create the final options object
s = jQuery.ajaxSetup({},options),// Callbacks context
callbackContext = s.context || s,// Context for global events
// It's the callbackContext if one was provided in the options
// and if it's a DOM node or a jQuery collection
globalEventContext = callbackContext !== s && (callbackContext.nodeType || callbackContext instanceof jQuery) ? jQuery(callbackContext) : jQuery.event,// Deferreds
deferred = jQuery.Deferred(),completeDeferred = jQuery._Deferred(),// Status-dependent callbacks
statusCode = s.statusCode || {},// ifModified key
ifModifiedKey,// Headers (they are sent all at once)
requestHeaders = {},requestHeadersNames = {},// Response headers
responseHeadeRSString,responseHeaders,// transport
transport,// timeout handle
timeoutTimer,// Cross-domain detection vars
parts,// The jqXHR state
state = 0,// To kNow if global events are to be dispatched
fireGlobals,// Loop variable
i,// Fake xhr
jqXHR = {
readyState: 0,// Caches the header
setRequestHeader: function (name,value) {
if (!state) {
var lname = name.toLowerCase();
name = requestHeadersNames[lname] = requestHeadersNames[lname] || name;
requestHeaders[name] = value;
}
return this;
},// Raw string
getAllResponseHeaders: function () {
return state === 2 ? responseHeadeRSString : null;
},// Builds headers hashtable if needed
getResponseHeader: function (key) {
var match;
if (state === 2) {
if (!responseHeaders) {
responseHeaders = {};
while ((match = rheaders.exec(responseHeadeRSString))) {
responseHeaders[match[1].toLowerCase()] = match[2];
}
}
match = responseHeaders[key.toLowerCase()];
}
return match === undefined ? null : match;
},// Overrides response content-type header
overrideMimeType: function (type) {
if (!state) {
s.mimeType = type;
}
return this;
},// Cancel the request
abort: function (statusText) {
statusText = statusText || "abort";
if (transport) {
transport.abort(statusText);
}
done(0,statusText);
return this;
}
};
// Callback for when everything is done
// It is defined here because jslint complains if it is declared
// at the end of the function (which would be more logical and readable)
function done(status,statusText,responses,headers) {
// Called once
if (state === 2) {
return;
}
// State is "done" Now
state = 2;
// Clear timeout if it exists
if (timeoutTimer) {
clearTimeout(timeoutTimer);
}
// Dereference transport for early garbage collection
// (no matter how long the jqXHR object will be used)
transport = undefined;
// Cache response headers
responseHeadeRSString = headers || "";
// Set readyState
jqXHR.readyState = status ? 4 : 0;
var isSuccess,success,error,response = responses ? ajaxHandleResponses(s,jqXHR,responses) : undefined,lastModified,etag;
// If successful,handle type chaining
if (status >= 200 && status < 300 || status === 304) {
// Set the If-Modified-Since and/or if-none-match header,if in ifModified mode.
if (s.ifModified) {
if ((lastModified = jqXHR.getResponseHeader("Last-Modified"))) {
jQuery.lastModified[ifModifiedKey] = lastModified;
}
if ((etag = jqXHR.getResponseHeader("Etag"))) {
jQuery.etag[ifModifiedKey] = etag;
}
}
// If not modified
if (status === 304) {
statusText = "notmodified";
isSuccess = true;
// If we have data
} else {
try {
success = ajaxConvert(s,response);
statusText = "success";
isSuccess = true;
} catch(e) {
// We have a parsererror
statusText = "parsererror";
error = e;
}
}
} else {
// We extract error from statusText
// then normalize statusText and status for non-aborts
error = statusText;
if (!statusText || status) {
statusText = "error";
if (status < 0) {
status = 0;
}
}
}
// Set data for the fake xhr object
jqXHR.status = status;
jqXHR.statusText = statusText;
// Success/Error
if (isSuccess) {
deferred.resolveWith(callbackContext,[success,jqXHR]);
} else {
deferred.rejectWith(callbackContext,[jqXHR,error]);
}
// Status-dependent callbacks
jqXHR.statusCode(statusCode);
statusCode = undefined;
if (fireGlobals) {
globalEventContext.trigger("ajax" + (isSuccess ? "Success" : "Error"),s,isSuccess ? success : error]);
}
// Complete
completeDeferred.resolveWith(callbackContext,statusText]);
if (fireGlobals) {
globalEventContext.trigger("ajaxComplete",s]);
// Handle the global AJAX counter
if (! (--jQuery.active)) {
jQuery.event.trigger("ajaxStop");
}
}
}
// Attach deferreds
deferred.promise(jqXHR);
jqXHR.success = jqXHR.done;
jqXHR.error = jqXHR.fail;
jqXHR.complete = completeDeferred.done;
// Status-dependent callbacks
jqXHR.statusCode = function (map) {
if (map) {
var tmp;
if (state < 2) {
for (tmp in map) {
statusCode[tmp] = [statusCode[tmp],map[tmp]];
}
} else {
tmp = map[jqXHR.status];
jqXHR.then(tmp,tmp);
}
}
return this;
};
// Remove hash character (#7531: and string promotion)
// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
// We also use the url parameter if available
s.url = ((url || s.url) + "").replace(rhash,"").replace(rprotocol,ajaxLocParts[1] + "//");
// Extract dataTypes list
s.dataTypes = jQuery.trim(s.dataType || "*").toLowerCase().split(rspacesAjax);
// Determine if a cross-domain request is in order
if (s.crossDomain == null) {
parts = rurl.exec(s.url.toLowerCase());
s.crossDomain = !!(parts && (parts[1] != ajaxLocParts[1] || parts[2] != ajaxLocParts[2] || (parts[3] || (parts[1] === "http:" ? 80 : 443)) != (ajaxLocParts[3] || (ajaxLocParts[1] === "http:" ? 80 : 443))));
}
// Convert data if not already a string
if (s.data && s.processData && typeof s.data !== "string") {
s.data = jQuery.param(s.data,s.Traditional);
}
// Apply prefilters
inspectPrefiltersOrTransports(prefilters,options,jqXHR);
// If request was aborted inside a prefiler,stop there
if (state === 2) {
return false;
}
// We can fire global events as of Now if asked to
fireGlobals = s.global;
// Uppercase the type
s.type = s.type.toupperCase();
// Determine if request has content
s.hasContent = !rnoContent.test(s.type);
// Watch for a new set of requests
if (fireGlobals && jQuery.active++===0) {
jQuery.event.trigger("ajaxStart");
}
// More options handling for requests with no content
if (!s.hasContent) {
// If data is available,append data to url
if (s.data) {
s.url += (rquery.test(s.url) ? "&" : "?") + s.data;
}
// Get ifModifiedKey before adding the anti-cache parameter
ifModifiedKey = s.url;
// Add anti-cache in url if needed
if (s.cache === false) {
var ts = jQuery.Now(),// try replacing _= if it is there
ret = s.url.replace(rts,"$1_=" + ts);
// if nothing was replaced,add timestamp to the end
s.url = ret + ((ret === s.url) ? (rquery.test(s.url) ? "&" : "?") + "_=" + ts : "");
}
}
// Set the correct header,if data is being sent
if (s.data && s.hasContent && s.contentType !== false || options.contentType) {
jqXHR.setRequestHeader("Content-Type",s.contentType);
}
// Set the If-Modified-Since and/or if-none-match header,if in ifModified mode.
if (s.ifModified) {
ifModifiedKey = ifModifiedKey || s.url;
if (jQuery.lastModified[ifModifiedKey]) {
jqXHR.setRequestHeader("If-Modified-Since",jQuery.lastModified[ifModifiedKey]);
}
if (jQuery.etag[ifModifiedKey]) {
jqXHR.setRequestHeader("if-none-match",jQuery.etag[ifModifiedKey]);
}
}
// Set the Accepts header for the server,depending on the dataType
jqXHR.setRequestHeader("Accept",s.dataTypes[0] && s.accepts[s.dataTypes[0]] ? s.accepts[s.dataTypes[0]] + (s.dataTypes[0] !== "*" ? ",*/*; q=0.01" : "") : s.accepts["*"]);
// Check for headers option
for (i in s.headers) {
jqXHR.setRequestHeader(i,s.headers[i]);
}
// Allow custom headers/mimetypes and early abort
if (s.beforeSend && (s.beforeSend.call(callbackContext,s) === false || state === 2)) {
// Abort if not done already
jqXHR.abort();
return false;
}
// Install callbacks on deferreds
for (i in {
success: 1,error: 1,complete: 1
}) {
jqXHR[i](s[i]);
}
// Get transport
transport = inspectPrefiltersOrTransports(transports,jqXHR);
// If no transport,we auto-abort
if (!transport) {
done(-1,"No Transport");
} else {
jqXHR.readyState = 1;
// Send global event
if (fireGlobals) {
globalEventContext.trigger("ajaxSend",s]);
}
// Timeout
if (s.async && s.timeout > 0) {
timeoutTimer = setTimeout(function () {
jqXHR.abort("timeout");
},s.timeout);
}
try {
state = 1;
transport.send(requestHeaders,done);
} catch(e) {
// Propagate exception as error if not done
if (status < 2) {
done(-1,e);
// Simply rethrow otherwise
} else {
jQuery.error(e);
}
}
}
return jqXHR;
}