閑著看看jquery.ajax源碼

來源:互聯網
上載者:User

架構的作用就是簡化我們做的事情,卻又不失靈活性。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");
 
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.