jQuery的$.AJAX實現

來源:互聯網
上載者:User

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;
       
    }

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.