架構的作用就是簡化我們做的事情,卻又不失靈活性。jquery是js架構中的中流砥柱,靈活並且強大。
jquery中對ajax的封裝很完美,且不說底層的ajax函數的強大,但是其上層的get ,post ,getscript ,getJson 基本對各種應用遊刃有餘。為什麼要看源碼,一是閑著蛋疼,二是為了在出問題時,能找出問題所在。三是……。
jquery中有一個對象ajaxSeetings ,ajax請求最基本的配置就在這裡,結構如下
ajaxSettings: {
url: location.href,
global: true,
type: "GET",
contentType: "application/x-www-form-urlencoded",
processData: true,
async: true,
/*
timeout: 0,
data: null,
username: null,
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) {}
},
accepts: {
xml: "application/xml, text/xml",
html: "text/html",
script: "text/javascript, application/javascript",
json: "application/json, text/javascript",
text: "text/plain",
_default: "*/*"
}
}
基本上名字就能代表它的設定項目,processData可能比較陌生。我們在使用get以及其他上層函數請求資源時,傳遞一個key/value的對象。例如$.get(“xxxx”,{name:’pr’,password:’pr’} , ……); 如果process設定為true,{name:’pr’,password:’pr’}就會轉換為name=pr&password=pr;這樣在後面如果ajax方式為get則會將裝換的字串附加到url後面,如果設定為false則不進行此轉換,預設是true,也最好不要改。值得一看內容當然是屬性xhr,這個屬性是個函數,當然函數最後都會返回瀏覽器安全色的XmlHttpRequest對象。整個ajax的核心操作對象就是它,這就免去了我們自己構造XmlHttpRequest對象時考慮相容問題的糾結。
ajax: function( origSettings ),ajax接受一個設定物件,就跟上面的ajaxSettings那樣的結構,
var s = jQuery.extend(true, {}, jQuery.ajaxSettings, origSettings);
var jsonp, status, data,
callbackContext = origSettings && origSettings.context || s,
type = s.type.toUpperCase();
// convert data if not already a string
if ( s.data && s.processData && typeof s.data !== "string" ) {
s.data = jQuery.param( s.data, s.traditional );
}
首先函數將預設配置和傳進來的配置進行合并,在函數中注意有個{},這樣合并就不會影響ajaxSettings 和originSettings的本來的值。CallbackContext是執行ajax回呼函數是函數的上下文。其他不多說。然後根據data,ProcessData 和data是否是string來決定是不是要將data對象轉換為參數形式字串。jquery.param是個工具函數,traditional用來決定是不是要進行深層次遍曆以產生參數字串。具體案例見jquery文檔。
// Handle JSONP Parameter Callbacks
if ( s.dataType === "jsonp" ) {
if ( type === "GET" ) {
if ( !jsre.test( s.url ) ) {
s.url += (rquery.test( s.url ) ? "&" : "?") + (s.jsonp || "callback") + "=?";
}
} else if ( !s.data || !jsre.test(s.data) ) {
s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
}
s.dataType = "json";
}
// Build temporary JSONP function
if ( s.dataType === "json" && (s.data && jsre.test(s.data) || jsre.test(s.url)) ) {
jsonp = s.jsonpCallback || ("jsonp" + jsc++);
// Replace the =? sequence both in the query string and the data
if ( s.data ) {
s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
}
s.url = s.url.replace(jsre, "=" + jsonp + "$1");