<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      jQuery Ajax 操作函數(shù)及deferred對象

        

      jQuery Ajax 操作函數(shù)

      jQuery 庫擁有完整的 Ajax 兼容套件。其中的函數(shù)和方法允許我們在不刷新瀏覽器的情況下從服務(wù)器加載數(shù)據(jù)。

      函數(shù)描述
      jQuery.ajax() 執(zhí)行異步 HTTP (Ajax) 請求。
      .ajaxComplete() 當(dāng) Ajax 請求完成時注冊要調(diào)用的處理程序。這是一個 Ajax 事件。
      .ajaxError() 當(dāng) Ajax 請求完成且出現(xiàn)錯誤時注冊要調(diào)用的處理程序。這是一個 Ajax 事件。
      .ajaxSend() 在 Ajax 請求發(fā)送之前顯示一條消息。
      jQuery.ajaxSetup() 設(shè)置將來的 Ajax 請求的默認(rèn)值。
      .ajaxStart() 當(dāng)首個 Ajax 請求完成開始時注冊要調(diào)用的處理程序。這是一個 Ajax 事件。
      .ajaxStop() 當(dāng)所有 Ajax 請求完成時注冊要調(diào)用的處理程序。這是一個 Ajax 事件。
      .ajaxSuccess() 當(dāng) Ajax 請求成功完成時顯示一條消息。
      jQuery.get() 使用 HTTP GET 請求從服務(wù)器加載數(shù)據(jù)。
      jQuery.getJSON() 使用 HTTP GET 請求從服務(wù)器加載 JSON 編碼數(shù)據(jù)。
      jQuery.getScript() 使用 HTTP GET 請求從服務(wù)器加載 JavaScript 文件,然后執(zhí)行該文件。
      .load() 從服務(wù)器加載數(shù)據(jù),然后把返回到 HTML 放入匹配元素。
      jQuery.param() 創(chuàng)建數(shù)組或?qū)ο蟮男蛄谢硎荆m合在 URL 查詢字符串或 Ajax 請求中使用。
      jQuery.post() 使用 HTTP POST 請求從服務(wù)器加載數(shù)據(jù)。
      .serialize() 將表單內(nèi)容序列化為字符串。
      .serializeArray() 序列化表單元素,返回 JSON 數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)。

       

      jQuery的開發(fā)速度很快,幾乎每半年一個大版本,每兩個月一個小版本。每個版本都會引入一些新功能。今天我想介紹的,就是從jQuery 1.5.0版本開始引入的一個新功能----deferred對象。

       

      1、什么是deferred對象?

          開發(fā)網(wǎng)站的過程中,我們經(jīng)常遇到某些耗時很長的javascript操作。其中,既有異步的操作(比如ajax讀取服務(wù)器數(shù)據(jù)),也有同步的操作(比如遍歷一個大型數(shù)組),它們都不是立即能得到結(jié)果的。

          通常的解決方法是,為它們指定回調(diào)函數(shù)(callback)。即事先規(guī)定,一旦它們運(yùn)行結(jié)束,應(yīng)該調(diào)用哪些函數(shù)。

          但是,在回調(diào)函數(shù)方面,jQuery的功能非常弱。為了改變這一點(diǎn),jQuery開發(fā)團(tuán)隊(duì)就設(shè)計(jì)了deferred對象

          簡單說,deferred對象就是jQuery的回調(diào)函數(shù)解決方案。 在英語中,defer的意思是"延遲",所以deferred對象的含義就是"延遲"到未來某個點(diǎn)再執(zhí)行。

          它解決了如何處理耗時操作的問題,對那些操作提供了更好的控制,以及統(tǒng)一的編程接口。它的主要功能,可以歸結(jié)為四點(diǎn)。下面我們通過示例代碼,一步步來學(xué)習(xí)。

      2、ajax操作的鏈?zhǔn)綄懛?/strong>

          jQuery的ajax操作,傳統(tǒng)寫法是這樣的:

        $.ajax({

          url: "test.html",

          success: function(){ 
            alert("哈哈,成功了!"); 
          },

          error:function(){ 
            alert("出錯啦!"); 
          }

        });

       

          在上面的代碼中,$.ajax()接受一個對象參數(shù),這個對象包含兩個方法:success方法指定操作成功后的回調(diào)函數(shù),error方法指定操作失敗后的回調(diào)函數(shù)。

      $.ajax()操作完成后,如果使用的是低于1.5.0版本的jQuery,返回的是XHR對象,你沒法進(jìn)行鏈?zhǔn)讲僮鳎蝗绻哂?.5.0版本,返回的是deferred對象,可以進(jìn)行鏈?zhǔn)讲僮鳌?/p>

          現(xiàn)在,新的寫法是這樣的:

        $.ajax("test.html")

        .done(function(){ alert("哈哈,成功了!"); })

        .fail(function(){ alert("出錯啦!"); });

       

          可以看到,done()相當(dāng)于success方法,fail()相當(dāng)于error方法。采用鏈?zhǔn)綄懛ㄒ院螅a的可讀性大大提高。

      3、指定同一操作的多個回調(diào)函數(shù)

          deferred對象的一大好處,就是它允許你自由添加多個回調(diào)函數(shù)。

      還是以上面的代碼為例,如果ajax操作成功后,除了原來的回調(diào)函數(shù),我還想再運(yùn)行一個回調(diào)函數(shù),怎么辦?

      很簡單,直接把它加在后面就行了。

        $.ajax("test.html")

        .done(function(){ alert("哈哈,成功了!");} )

        .fail(function(){ alert("出錯啦!"); } )

        .done(function(){ alert("第二個回調(diào)函數(shù)!");} );

       

      回調(diào)函數(shù)可以添加任意多個,它們按照添加順序執(zhí)行。

      4、為多個操作指定回調(diào)函數(shù)

          deferred對象的另一大好處,就是它允許你為多個事件指定一個回調(diào)函數(shù),這是傳統(tǒng)寫法做不到的。

          請看下面的代碼,它用到了一個新的方法$.when()

        $.when($.ajax("test1.html"), $.ajax("test2.html"))

        .done(function(){ alert("哈哈,成功了!"); })

        .fail(function(){ alert("出錯啦!"); });

       

          這段代碼的意思是,先執(zhí)行兩個操作$.ajax("test1.html")和$.ajax("test2.html"),如果成功了,就運(yùn)行done()指定的回調(diào)函數(shù);如果有一個失敗或都失敗了,就執(zhí)行fail()指定的回調(diào)函數(shù)。

      5、普通操作的回調(diào)函數(shù)接口(上)

          deferred對象的最大優(yōu)點(diǎn),就是它把這一套回調(diào)函數(shù)接口,從ajax操作擴(kuò)展到了所有操作。也就是說,任何一個操作----不管是ajax操作還是本地操作,也不管是異步操作還是同步操作----都可以使用deferred對象的各種方法,指定回調(diào)函數(shù)。

          我們來看一個具體的例子。假定有一個很耗時的操作wait:

        var wait = function(){

          var tasks = function(){

            alert("執(zhí)行完畢!");

          };

          setTimeout(tasks,5000);

        };

          我們?yōu)樗付ɑ卣{(diào)函數(shù),應(yīng)該怎么做呢?

          很自然的,你會想到,可以使用$.when():

        $.when(wait())

        .done(function(){ alert("哈哈,成功了!"); })

        .fail(function(){ alert("出錯啦!"); });

          但是,有一個問題。$.when()的參數(shù)只能是deferred對象,所以必須對wait進(jìn)行改寫:

        var dtd = $.Deferred(); // 新建一個deferred對象

        var wait = function(dtd){

          var tasks = function(){

            alert("執(zhí)行完畢!");

            dtd.resolve(); // 改變deferred對象的執(zhí)行狀態(tài)

          };

          setTimeout(tasks,5000);

          return dtd.promise();

        };

      這里有兩個地方需要注意。

          首先,最后一行不能直接返回dtd,必須返回dtd.promise()。原因是jQuery規(guī)定,任意一個deferred對象有三種執(zhí)行狀態(tài)----未完成,已完成和已失敗。如果直接返回dtd,$.when()的默認(rèn)執(zhí)行狀態(tài)為"已完成",立即觸發(fā)后面的done()方法,這就失去回調(diào)函數(shù)的作用了。dtd.promise()的目的,就是保證目前的執(zhí)行狀態(tài)----也就是"未完成"----不變,從而確保只有操作完成后,才會觸發(fā)回調(diào)函數(shù)。

          其次,當(dāng)操作完成后,必須手動改變Deferred對象的執(zhí)行狀態(tài),否則回調(diào)函數(shù)無法觸發(fā)。dtd.resolve()的作用,就是將dtd的執(zhí)行狀態(tài)從"未完成"變成"已完成",從而觸發(fā)done()方法。

          最后別忘了,修改完wait之后,調(diào)用的時候就必須直接傳入dtd參數(shù)。

        $.when(wait(dtd))

        .done(function(){ alert("哈哈,成功了!"); })

        .fail(function(){ alert("出錯啦!"); });

      6、普通操作的回調(diào)函數(shù)接口(中)

          除了使用$.when()為普通操作添加回調(diào)函數(shù),還可以使用deferred對象的建構(gòu)函數(shù)$.Deferred()。

      這時,wait函數(shù)還是保持不變,我們直接把它傳入$.Deferred():

        $.Deferred(wait)

        .done(function(){ alert("哈哈,成功了!"); })

        .fail(function(){ alert("出錯啦!"); });

       

      jQuery規(guī)定,$.Deferred()可以接受一個函數(shù)作為參數(shù),該函數(shù)將在$.Deferred()返回結(jié)果之前執(zhí)行。并且,$.Deferred()所生成的Deferred對象將作為這個函數(shù)的默認(rèn)參數(shù)。

      七、普通操作的回調(diào)函數(shù)接口(下)

          除了上面兩種方法以外,我們還可以直接在wait對象上部署deferred接口。

        var dtd = $.Deferred(); // 生成Deferred對象

        var wait = function(dtd){

          var tasks = function(){

            alert("執(zhí)行完畢!");

            dtd.resolve(); // 改變Deferred對象的執(zhí)行狀態(tài)

          };

          setTimeout(tasks,5000);

        };

        dtd.promise(wait);

        wait.done(function(){ alert("哈哈,成功了!"); })

        .fail(function(){ alert("出錯啦!"); });

        wait(dtd);

       

      這里的關(guān)鍵是dtd.promise(wait)這一行,它的作用就是在wait對象上部署Deferred接口。正是因?yàn)橛辛诉@一行,后面才能直接在wait上面調(diào)用done()和fail()。

      八、小結(jié):deferred對象的方法

          前面已經(jīng)講到了deferred對象的多種方法,下面做一個總結(jié):

        (1)$.Deferred()生成一個deferred對象。

        (2)deferred.done()指定操作成功時的回調(diào)函數(shù)

        (3)deferred.fail()指定操作失敗時的回調(diào)函數(shù)

        (4)deferred.promise()沒有參數(shù)時,作用為保持deferred對象的運(yùn)行狀態(tài)不變;接受參數(shù)時,作用為在參數(shù)對象上部署deferred接口。

        (5)deferred.resolve()手動改變deferred對象的運(yùn)行狀態(tài)為"已完成",從而立即觸發(fā)done()方法。

        (6)$.when()為多個操作指定回調(diào)函數(shù)。

      除了這些方法以外,deferred對象還有三個重要方法,上面的教程中沒有涉及到。

        (7)deferred.then()

      有時為了省事,可以把done()和fail()合在一起寫,這就是then()方法。

        $.when($.ajax( "/main.php" ))

        .then(successFunc, failureFunc );

      如果then()有兩個參數(shù),那么第一個參數(shù)是done()方法的回調(diào)函數(shù),第二個參數(shù)是fail()方法的回調(diào)方法。如果then()只有一個參數(shù),那么等同于done()。

        (8)deferred.reject()

      這個方法與deferred.resolve()正好相反,調(diào)用后將deferred對象的運(yùn)行狀態(tài)變?yōu)?已失敗",從而立即觸發(fā)fail()方法。

        (9)deferred.always()

      這個方法也是用來指定回調(diào)函數(shù)的,它的作用是,不管調(diào)用的是deferred.resolve()還是deferred.reject(),最后總是執(zhí)行。

        $.ajax( "test.html" )

        .always( function() { alert("已執(zhí)行!");} );

      posted @ 2015-06-20 11:18  nd  閱讀(1795)  評論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 国产精品一久久香蕉产线看| 大荔县| 18禁无遮挡啪啪无码网站| 亚洲a成人片在线观看| 亚洲国产精品综合久久20| 无码精品人妻一区二区三区湄公河| 丰满的少妇一区二区三区 | 亚洲一本大道在线| 色综合中文字幕色综合激情| 国产精品亚洲av三区色| 精品人妻码一区二区三区| 国产亚洲精品成人aa片新蒲金 | 亚洲一本二区偷拍精品| 亚洲一区二区三区蜜桃臀| 精品国产成人A区在线观看| 国产精品伦人视频免费看| 国产精品高清视亚洲精品| 蜜臀午夜一区二区在线播放| 欧美日韩一线| 久久久国产乱子伦精品作者| 国产精品午夜福利片国产| 国产性色的免费视频网站| 国产人成视频在线观看| 美日韩不卡一区二区三区| 文成县| 亚洲成人资源在线观看| 免费无码又黄又爽又刺激| 一本色道婷婷久久欧美| 亚洲ⅴa曰本va欧美va视频| 四虎永久精品免费视频| 中文字幕一区二区人妻| 国产在线国偷精品免费看| 日本一区二区三本视频在线观看| 人妻出轨av中文字幕| 久久精品国产亚洲av天海翼| 最近日本免费观看高清视频| 精品国产成人午夜福利| 国产精品福利自产拍久久 | √天堂中文在线最新版| 午夜免费无码福利视频麻豆| 午夜精品久久久久久久爽|