使用jQuery處理AJAX請(qǐng)求的基礎(chǔ)學(xué)習(xí)教程

字號(hào):


    這篇文章主要介紹了使用jQuery處理AJAX請(qǐng)求的基礎(chǔ)學(xué)習(xí)教程,除此之外還引申了鏈?zhǔn)教幚硎录卣{(diào)的寫(xiě)法,由淺入深非常值得借鑒,需要的朋友可以參考下
    $.ajax快捷方法
    $.get(url,[data],[callback],[type])
    $.post(url,[data],[callback],[type])
    兩種方法請(qǐng)求方式不同,其他方式相同.
    參數(shù):url[請(qǐng)求地址],data[請(qǐng)求的數(shù)據(jù)內(nèi)容(obj對(duì)象)],callback[回調(diào)函數(shù)(只能處理請(qǐng)求成功事件)],
    type[請(qǐng)求返回?cái)?shù)據(jù)的編碼格式(默認(rèn)ContentType指定格式)]
    $.get('/test?x=1');
    $.get('/test',{z:2});
    $.post('/test',{y:2});
    $.get('/user',function(data,callbacktype,jqXHR){
      data//返回?cái)?shù)據(jù)
      callbacktype//返回?cái)?shù)據(jù)的狀態(tài)信息(字符串)
      jqXHR//jQuery封裝的XHR對(duì)象
    });
    $(selector).load(url,[data],[callback])
    將頁(yè)面片段載入到selector的容器里面
    $("#content").load('/user');
    $.getJSON(url,[data],[callback])
    如果是JSON數(shù)據(jù)回調(diào)會(huì)成功,否則失敗
    $.getJSON('/test',{type:1},function(){
      console.log(argument)
    });
    $.getScript(url,[claaback])
    動(dòng)態(tài)加載腳本文件
    $.gerScript('/js/test.js',function(){
      alert(test(1,2));
    });
    $.ajax詳細(xì)使用方法
    $.ajax(url,[settings]);
    $.ajax({
      url:'/test',
      success:function(){
        alert('ok');
      }
    });
    處理響應(yīng)結(jié)果的回調(diào)函數(shù):
    success[成功],error[請(qǐng)求失敗],
    statusCode[指明返回的狀態(tài)碼的回調(diào)函數(shù)],
    complete[請(qǐng)求返回前的回調(diào)函數(shù)(處理返回不同狀態(tài)碼的請(qǐng)求)]
    $.ajax('/test',{
      success:function(data){
        console.log(arguments);
      },
      error:function(jqXHR,textStatus,err){
        //jqXHR:jQuery增強(qiáng)的XHR
        //textStatus:請(qǐng)求完成狀態(tài)
        //err:底層通過(guò)throw拋出的異常對(duì)象,類型與值與錯(cuò)誤類型有關(guān)
        console.log(arguments);
      },
      complete:function(jqXHR,textStatus){
        //jqXHR:jQuery增強(qiáng)的XHR
        //textStatus:請(qǐng)求完成狀態(tài)success | error
        console.log(arguments);
      },
      statusCode:function(){
        '403':function(jqXHR,textStatus,err){
          //jqXHR:jQuery增強(qiáng)的XHR
          //textStatus:請(qǐng)求完成狀態(tài)
          //err:底層通過(guò)throw拋出的異常對(duì)象,類型與值與錯(cuò)誤類型有關(guān)
          console.log(arguments);
          console.log(400);
        },
        '400':function(){
          console.log(400);
        }
      }   
    });
    請(qǐng)求的數(shù)據(jù):data,processData,contentType,traditional
    $.ajax('/test',{
      //請(qǐng)求的數(shù)據(jù)內(nèi)容
      data:{
        a:1,
        b:2
      },
      //請(qǐng)求的方式
      type:'POST',
      //是否對(duì)請(qǐng)求的數(shù)據(jù)進(jìn)行轉(zhuǎn)碼(用于傳輸數(shù)據(jù)為html節(jié)點(diǎn)內(nèi)容)
      processData:true,
      //當(dāng)前的數(shù)據(jù)是否使用傳統(tǒng)方式進(jìn)行url編碼
      traditional:true,
      //請(qǐng)求數(shù)據(jù)編碼格式
      contentType:'application/json'
    });
    響應(yīng)數(shù)據(jù):dataType,dataFilter
    $.ajax('/test',{
      success:function(data){
        console.log(typeof data)
      },
      //定義的返回?cái)?shù)據(jù)的類型
      dataType:'json | html | text | jsonp | script',
      //返回底層的原始數(shù)據(jù)進(jìn)行預(yù)處理
      dataFilter:function(data,type){
        //data:原始數(shù)據(jù)
        //type:指定的數(shù)據(jù)類型
      }  
    });
    前置處理:beforeSend
    $.ajax('/test',{
      beforeSend:function(jqXHR,settings){
        console.log(arguments);
        jqXHR.setRequestHeader('test','haha');
        jqXHR.testData = {a:1,b:2};
      },
      complete:function(jqXHR){
        console.log(jqXHR.testData)
      }
    });
    請(qǐng)求類型:GET(默認(rèn)) | POST | PUT | DELETE
    同步異步:async(默認(rèn)true)
    是否緩存:cache(默認(rèn)true)
    其他參數(shù):
    1.global[是否觸發(fā)全局事件]
    2.ifModifed[僅在服務(wù)器數(shù)據(jù)改變時(shí)候加載數(shù)據(jù)]
    3.username,password[http需要驗(yàn)證時(shí)候]
    4.timeout[設(shè)置請(qǐng)求超時(shí)時(shí)間,若請(qǐng)求超時(shí)觸發(fā)error]
    5.context[回調(diào)中this指向的對(duì)象]
    其他相關(guān)的API
    $.ajaxSetup(option)
    設(shè)置全局默認(rèn)參數(shù)
    //默認(rèn)為get請(qǐng)求
    $.ajax('/test');
    //修改全局請(qǐng)求方式為post
    $.ajaxSetup({
      type:'post',
      headers:{
        test:new Date().getTime
      },
      cache:false
    });
    //請(qǐng)求方式改變?yōu)閜ost
    $.ajax('/test');
    $.ajaxPrefilter([dataTypes],handler(option,originalOptions,jqXHR))
    請(qǐng)求發(fā)起前的預(yù)處理,提供了一種AOP(面向切面)編程模式,常見(jiàn)用途:
    1.根據(jù)option設(shè)定執(zhí)行特定處理邏輯
    2.修改option值改變請(qǐng)求默認(rèn)行為
    3.通過(guò)return修改默認(rèn)dataType
    例:通過(guò)return修改默認(rèn)dataType
    $.ajaxPrefilter('text html json',function(options,originalOptions,jqXHR){
      //options請(qǐng)求參數(shù),含默認(rèn)值
      //originalOptions請(qǐng)求時(shí)傳入的參數(shù),不含默認(rèn)值
      //jqXHR:jQuery增強(qiáng)的XHR
      console.log(arguments);
      if(options.url == '/test'){
        return 'text';
      }
    });
    $.ajax('/test',{
      type:'post',
      dataType:'text',
      //自定義屬性
      test:'haha'
    });
    例:多次請(qǐng)求僅最后一次有效,避免多次請(qǐng)求導(dǎo)致的數(shù)據(jù)混亂
    var requests = {};
    $.ajaxPrefilter(function(options,originalOptions,jqXHR){
      if(requests[options.url]){
        requests[options.url].abort();
      }
      requests[options.url] = jqXHR;
    });
    $.ajax('/test/');
    $.ajax('/test/');
    例:統(tǒng)一修改請(qǐng)求路徑
    $.ajaxPrefilter(function(options){
      if(options.url.substr(0,5) == '/usr'){
        options.url = options.url.replace('/usr/','/user/');
        options.header = {
          a:1
        }
      }
    });
    $.ajax('/usr/');
    全局事件
    jQuery-1.9以后,全局事件必須綁定在document上
    $(document).ajaxSuccess(globalEventHander);
    $(document).ajaxError(globalEventHander);
    $(document).ajaxComplete(globalEventHander);
    $(document).ajaxStart(globalEventHander);
    $(document).ajaxStop(globalEventHander);
    $(document).ajaxSend(globalEventHander);
    function globalEventHander(event){
      console.log(arguments);
      console.log(event.type);
    }
    $.ajax('/test?err=y');//請(qǐng)求成功
    $.ajax('/test?err=n');//請(qǐng)求失敗
    //請(qǐng)求順序:
    //ajaxStart >> ajaxSend >> ajaxSend >> ajaxSuccess >> ajaxComplete >> ajaxError >> ajaxComplete >> ajaxStop
    序列化
    1.param[序列化一個(gè) key/value 對(duì)象]
    2.serialize[通過(guò)序列化表單值,創(chuàng)建 URL 編碼文本字符串]
    3.serializeArray[通過(guò)序列化表單值來(lái)創(chuàng)建對(duì)象數(shù)組(名稱和值)]
    例:param()
    var params = { a:1, b:2 };
    var str = $.param(params);
    console.log(str);
    //a=1&b=2"
    例:serialize()
    <form>
      <div><input type="text" name="a" value="1"/></div>
      <div><input type="text" name="b" value="2"/></div>
      <div><input type="hidden" name="c" value="3"/></div>
    </form>
    <script type="text/javascript">
      $('form').submit(function() {
       console.log($(this).serialize());
       //a=1&b=2&c=3
       return false;
      });
    </script>
    例:serializeArray()
    <form>
      First:<input type="text" name="First" value="1" /><br />
      Last :<input type="text" name="Last" value="2" /><br />
    </form>
    <script type="text/javascript">
      $('form').click(function(){
        x=$("form").serializeArray();
        console.log(x);
        //{[name:First,value:1],[name:Last,value:2]}
      });
    </script>
    ajax鏈?zhǔn)骄幊谭椒?BR>    在開(kāi)發(fā)的過(guò)程,經(jīng)常會(huì)遇到一些耗時(shí)間的操作,比如ajax讀取服務(wù)器數(shù)據(jù)(異步操作),遍歷一個(gè)很大的數(shù)組(同步操作)。不管是異步操作,還是同步操作,總之就是不能立即得到結(jié)果,JS是單線程語(yǔ)音,不能立即得到結(jié)果,便會(huì)一直等待(阻塞)。
    一般的做法就是用回調(diào)函數(shù)(callback),即事先定義好一個(gè)函數(shù),JS引擎不等待這些耗時(shí)的操作,而是繼續(xù)執(zhí)行下面的代碼,等這些耗時(shí)操作結(jié)束后,回來(lái)執(zhí)行事先定義好的那個(gè)函數(shù)。如下面的ajax代碼:
    $.ajax({
      url: "test.html",
      success: function(){
        console.log("success");
      },
      error: function(){
        console.log("error");
      }
    });
    但這樣寫(xiě)不夠強(qiáng)大靈活,也很啰嗦。為此,jQuery1.5版本引入Deferred功能,為處理事件回調(diào)提供了更加強(qiáng)大而靈活的編程模式。
    $.ajax("test.html")
    .done(
      function(){
        console.log("success");
      }
    )
    .fail(
      function(){
        console.log("error");
      }
    );
    不就是鏈?zhǔn)秸{(diào)用嘛,有何優(yōu)點(diǎn)?
    優(yōu)點(diǎn)一:可以清晰指定多個(gè)回調(diào)函數(shù)
    function fnA(){...}
    function fnB(){...}
    $.ajax("test.html").done(fnA).done(fnB);
    試想一下,如果用以前的編程模式,只能這么寫(xiě):
    function fnA(){...}
    function fnB(){...}
    $.ajax({
      url: "test.html",
      success: function(){
        fnA();
        fnB();
      }
    });
    優(yōu)點(diǎn)二:為多個(gè)操作指定回調(diào)函數(shù)
    $.when($.ajax("test1.html"), $.ajax("test2.html"))
    .done(function(){console.log("success");})
    .fail(function(){console.log("error");});
    用傳統(tǒng)的編程模式,只能重復(fù)寫(xiě)success,error等回調(diào)了。