亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

jQuery ajax —— Baidu ajax

系統(tǒng) 3031 0

你沒有看錯(cuò)標(biāo)題,本文的確是在講Baidu ajax,不過(guò)是很久很久以前的版本了。

由于jQuery ajax模塊有800+行,而核心函數(shù)jQuery.ajax就有380+行,直接分析這段代碼很容易被代碼邏輯弄暈。

所以我們先分析一段簡(jiǎn)單的ajax代碼,來(lái)自早期的百度七巧板項(xiàng)目。

通過(guò)這個(gè)來(lái)先復(fù)習(xí)一遍ajax的知識(shí)。

?

baidu.ajax.request分離版

?

      
        /*
      
      
        *
 * 發(fā)送一個(gè)ajax請(qǐng)求
 * @author: allstar, erik, berg
 * @name ajax.request
 * @function
 * @grammar ajax.request(url[, options])
 * @param {string}     url 發(fā)送請(qǐng)求的url
 * @param {Object}     options 發(fā)送請(qǐng)求的選項(xiàng)參數(shù)
 * @config {String}     [method]             請(qǐng)求發(fā)送的類型。默認(rèn)為GET
 * @config {Boolean}  [async]             是否異步請(qǐng)求。默認(rèn)為true(異步)
 * @config {String}     [data]                 需要發(fā)送的數(shù)據(jù)。如果是GET請(qǐng)求的話,不需要這個(gè)屬性
 * @config {Object}     [headers]             要設(shè)置的http request header
 * @config {number}   [timeout]       超時(shí)時(shí)間,單位ms
 * @config {String}     [username]             用戶名
 * @config {String}     [password]             密碼
 * @config {Function} [onsuccess]         請(qǐng)求成功時(shí)觸發(fā),function(XMLHttpRequest xhr, string responseText)。
 * @config {Function} [onfailure]         請(qǐng)求失敗時(shí)觸發(fā),function(XMLHttpRequest xhr)。
 * @config {Function} [onbeforerequest]    發(fā)送請(qǐng)求之前觸發(fā),function(XMLHttpRequest xhr)。
 * 
 * @meta standard
 * @see ajax.get,ajax.post
 *             
 * @returns {XMLHttpRequest} 發(fā)送請(qǐng)求的XMLHttpRequest對(duì)象
 
      
      
        */
      
      
        var
      
       ajax =
      
         {};
ajax.request 
      
      = 
      
        function
      
      
        (url,options,type){
        
      
      
        //
      
      
         是否需要異步
      
      
        var
      
       async = options.async||
      
        true
      
      
        ,
        
      
      
        //
      
      
         用戶名、密碼
      
      
        username = options.username||""
      
        ,
        password 
      
      = options.password||""
      
        ,
        
      
      
        //
      
      
         需要傳輸?shù)臄?shù)據(jù)
      
      
        data = options.data||""
      
        ,
        
      
      
        //
      
      
         GET還是POST
      
      
        method = (options.method||"GET"
      
        ).toUpperCase(),
        
      
      
        //
      
      
         請(qǐng)求頭
      
      
        headers = options.headers||
      
        {},
        
      
      
        //
      
      
         事件處理函數(shù)表
      
      
        eventHandler =
      
         {},
        
      
      
        //
      
      
         請(qǐng)求數(shù)據(jù)類型
      
      
        dataType = type||"string";
      
        //
      
      
        xml||string
      
      
        function
      
      
         stateChangeHandler(){
        
      
      
        //
      
      
         看看是否已經(jīng)準(zhǔn)備好了
      
      
        if
      
      (xhr.readyState == 4
      
        ){
            
      
      
        //
      
      
         得到xhr當(dāng)前狀態(tài)
      
      
        var
      
       sta =
      
         xhr.status;
            
      
      
        //
      
      
         判斷是否成功
      
      
        if
      
      (sta == 200||sta == 304
      
        ){
                
      
      
        //
      
      
         成功則觸發(fā)成功
      
      
                fire("success"
      
        );
            }
      
      
        else
      
      
        {
                
      
      
        //
      
      
         失敗則觸發(fā)失敗
      
      
                fire("failure"
      
        );
            }
        
            
      
      
        //
      
      
         清除綁定
      
      
            window.setTimeout(
      
        function
      
      
        (){
                xhr.onreadystatechange
      
      = 
      
        new
      
      
         Function();
                
      
      
        if
      
      
         (async){
                    xhr 
      
      = 
      
        null
      
      
        ;
                }
            },
      
      0
      
        );
        }
    }
    
    
    
      
      
        function
      
      
         fire(type){
        
      
      
        //
      
      
         把type變成ontype
      
      
        type = "on"+
      
        type;
        
      
      
        //
      
      
         在事件處理器表中找到對(duì)應(yīng)事件的處理函數(shù)
      
      
        var
      
       handler =
      
         eventHandler[type];
        
      
      
        //
      
      
         如果函數(shù)存在,則
      
      
        if
      
      
        (handler){
            
      
      
        //
      
      
         不成功的話
      
      
        if
      
      (type != "onsuccess"
      
        ){
                handler(xhr);
            
      
      
        //
      
      
         成功了
      
      
            }
      
        else
      
      
        {
                
      
      
        //
      
      
         則根據(jù)dataType返回不同的數(shù)據(jù)
      
      
                handler(xhr,dataType!="xml"?
      
        xhr.responseText:xhr.responseXML);
            }
        }
    }
    
    
      
      
        //
      
      
         組裝eventHandler
      
      
        for
      
      (
      
        var
      
       key 
      
        in
      
      
         options){
        eventHandler[key] 
      
      =
      
         options[key];
    }
    
    
      
      
        //
      
      
         新建一個(gè)XMLHttpRequest對(duì)象
      
      
        var
      
       xhr = 
      
        new
      
      
         XMLHttpRequest();
    
      
      
        //
      
      
         如果方法是GET,則把數(shù)據(jù)組裝到url中
      
      
        if
      
      (method == "GET"
      
        ){
        url 
      
      += (url.indexOf("?")>=0)?"&":"?"
      
        ;
        url 
      
      +=
      
         data;
        
      
      
        //
      
      
         清空data
      
      
        data = 
      
        null
      
      
        ;
    }
    
      
      
        //
      
      
         如果是異步
      
      
        if
      
      
         (async){
        
      
      
        //
      
      
         綁定readystatechange的處理器
      
      
        xhr.onreadystatechange =
      
         stateChangeHandler;
    }
    
      
      
        //
      
      
         看看是否需要輸入密碼
      
      
        if
      
      
        (username){
        xhr.open(method,url,async,username,passowrd);
    }
      
      
        else
      
      
        {
        xhr.open(method,url,async);
    }
    
      
      
        //
      
      
         如果是POST
      
      
        if
      
      (method == "POST"
      
        ){
        
      
      
        //
      
      
         設(shè)置一下請(qǐng)求頭
      
      
        xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"
      
        );
    }
    
      
      
        //
      
      
         把options中的請(qǐng)求頭信息全部設(shè)置進(jìn)去
      
      
        for
      
      (
      
        var
      
       key 
      
        in
      
      
         headers){
        xhr.setRequestHeader(name,headers[key])
    }
    
      
      
        //
      
      
         觸發(fā)事件beforerequest
      
      
    fire("beforerequest"
      
        );
    
      
      
        //
      
      
         發(fā)送數(shù)據(jù)
      
      
            xhr.send(data);
    
    
      
      
        //
      
      
         如果不是異步
      
      
        if
      
       (!
      
        async){
        
      
      
        //
      
      
         則直接運(yùn)行stateChangeHandler來(lái)處理數(shù)據(jù)
      
      
                stateChangeHandler();
    }

    
      
      
        return
      
      
         xhr;
}
      
    

?

這段代碼還是比較容易理解的:

  • 通過(guò)XMLHttpRequest()新建一個(gè)XMLHttpRequest對(duì)象。
  • 看看是GET,還是POST方式,如果是GET則組裝url,如果是POST,設(shè)置一下請(qǐng)求頭。
  • 看看是不是異步,如果是則注冊(cè)監(jiān)聽函數(shù)stateChangeHandler。
  • 看看需不需要用戶名和密碼,執(zhí)行open。
  • 發(fā)送請(qǐng)求。
  • 等待監(jiān)聽函數(shù)處理事件。

?

baidu.ajax.get & baidu.ajax.post

      
        /*
      
      
        *
 * 發(fā)送一個(gè)post請(qǐng)求
 * @name ajax.post
 * @function
 * @grammar ajax.post(url, data[, onsuccess])
 * @param {string}     url         發(fā)送請(qǐng)求的url地址
 * @param {string}     data         發(fā)送的數(shù)據(jù)
 * @param {Function} [onsuccess] 請(qǐng)求成功之后的回調(diào)函數(shù),function(XMLHttpRequest xhr, string responseText)
 * @meta standard
 * @see ajax.get,ajax.request
 *             
 * @returns {XMLHttpRequest}     發(fā)送請(qǐng)求的XMLHttpRequest對(duì)象
 
      
      
        */
      
      
        
ajax.post 
      
      = 
      
        function
      
      
        (url,data,onsuccess){
    
      
      
        return
      
       ajax.request(url,{"data":data,"onsuccess":onsuccess,method:"POST"
      
        });
}
      
    
      
        /*
      
      
        *
 * 發(fā)送一個(gè)get請(qǐng)求
 * @name ajax.get
 * @function
 * @grammar ajax.get(url[, onsuccess])
 * @param {string}     url         發(fā)送請(qǐng)求的url地址
 * @param {Function} [onsuccess] 請(qǐng)求成功之后的回調(diào)函數(shù),function(XMLHttpRequest xhr, string responseText)
 * @meta standard
 * @see ajax.post,ajax.request
 *             
 * @returns {XMLHttpRequest}     發(fā)送請(qǐng)求的XMLHttpRequest對(duì)象
 
      
      
        */
      
      
        
ajax.get 
      
      = 
      
        function
      
      
        (url,data,onsuccess){
    
      
      
        return
      
       ajax.request(url,{"data":data,"onsuccess"
      
        :onsuccess});
}
      
    

baidu.ajax.get和baidu.ajax.post都是通過(guò)baidu.ajax.request擴(kuò)展的。

?

jQuery ajax —— Baidu ajax


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 亚洲国产精品久久 | 精品日韩在线视频一区二区三区 | 婷婷精品视频 | 欧美另类videos粗暴黑人 | 国产aav| 日本高清一级做a爱过程免费视频 | 亚洲精品成人在线 | 欧美成人毛片一级在线 | 亚洲va精品中文字幕动漫 | 久久久久久夜精品精品免费 | 99久久精品免费 | 国产网红在线观看 | 国产亚洲精品自在线观看 | 亚洲合集综合久久性色 | 免费一级a毛片在线播出 | 老司机午夜精品视频在线观看免费 | 青青青国产精品一区二区 | 日本精品视频一视频高清 | 国产精品欧美亚洲韩国日本 | 日本美女一区 | 欧美成一级 | 欧美aaaaaaaa | 色综合久久九月婷婷色综合 | 亚洲精品国产第一区二区多人 | 色九九 | 免费一级毛片在线观看 | 国产成人教育视频在线观看 | 美女久草| 伊人久久大香线蕉综合bd高清 | 四虎国产精品永久地址49 | 日韩二区三区 | 久久国产这里只精品免费 | 日韩精品国产自在久久现线拍 | 天天操夜夜操夜夜操 | 噜噜色噜噜色 | 国产在线精品一区二区三区不卡 | 精品国产影院 | 日本αv | 高清中文字幕视频在线播 | 久久机热这里只有精品无需 | 久久99热久久精品动漫 |