jquery是個很偉大的js庫,我們在用的同時應該也好好學習下他的效果是如何做出來的,比起看很多所謂的js書好多了。以下是一個偉大的函數的$.AJAX實現代碼:
Code:
// 執行AJAX請求的通用函數
//帶一個參數,是包含一系列選項的對象
function ajax(options){
//如果使用者沒有提供某個選項則用預設值代替
options = {
//HTTP請求的類型
type: options.type || "POST",
//請求的URL
url: options.url || "",
//請求逾時時間
timeout: options.timeout || 5000,
//請求失敗,成功或完成(無論成功或者失敗都會執行)時執行的函數
onComplete: options.onComplete ||
function(){},
onError: options.onError ||
function(){},
onSuccess: options.onSuccess ||
function(){},
//伺服器返回的資料類型,這一預設值用於判斷伺服器返回的資料並做相應動作
data: options.data || ""
};
//建立請求對象
var xml = new XMLHttpRequest();
//初始化非同步請求
xml.open(options.type, options.url, true);
//我們在請求後等待5秒,逾時則放棄
var timeoutLenght = options.timeout;
//記錄請求是否成功完成
var requestDone = false;
// 初始化一個5秒後執行的回呼函數,用於取消請求 (如果尚未完成的)
setTimeout(function(){
var requestDone = true;
}, timeoutLenght);
// 監聽文檔狀態的更新
xml.onreadystatechange = function(){
//保持等待,直到資料完全載入,並保證請求未逾時
if (xml.readyState == 4 && !requestDone) {
//檢查是否請求成功
if (httpSuccess(xml)) {
//以伺服器返回的資料作為參數調用成功回呼函數
options.onSuccess(httpData(xml, options.type));
}
else {
options.onError();
}
//調用完成回呼函數
options.onComplete();
//為避免記憶體流失,清理文檔
xml = null;
}
};
//建立與伺服器串連
xml.send();
//判斷HTTP響應是否成功
function httpSuccess(r){
try {
//如果得不到伺服器狀態,且我們正在請求本地檔案,認為成功
return !r.status && location.protocol == "file:" ||
//所有200到300間的狀態表示為成功
(r.status >= 200 && r.status < 300) ||
//文檔未修改也算成功
r.status == 304 ||
//Safari 在文檔未修改時返回空狀態
navigator.userAgent.indexOf("Safari") >= 0 && typeof r.status == "undefined";
}
catch (e) {
}
//若檢查狀態失敗,就假定請求是失敗的
return false;
}
//從HTTP響應中解析正確的資料
function httpData(r, type){
//擷取 content-type 的首部
var ct = r.getResponseHeader("content-type");
//若是沒有提供預設的類型,判斷伺服器返回的是否是xml形式
var data = !type && ct && ct.indexOf("xml") >= 0;
//若是,獲得xml文檔對象,否則返迴文本內容
data = type == "xml" || data ? r.responseXML : r.responseText;
//若指定類型是“script”,則以Javascript形式執行返迴文本
if (type == "script")
eval.call(window, data);
//返迴響應資料(或為XML文檔,或為文本字串)
return data;
}
}