<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    贏在執(zhí)行

    這個世界上只有兩樣東西愈分享愈多,那就是智慧與愛。

    BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
      17 Posts :: 11 Stories :: 13 Comments :: 0 Trackbacks
    DOJO試用手記3--異步通信
    來源:原創(chuàng) 作者:zxub 發(fā)布時間:2006-04-04 15:14:00  

      既然dojo是ajax的一個框架,那異步通信是必不可少的,否則叫什么ajax。dojo中,這一部分是在dojo.io包中的。
      先看看這一段:

     1 // an asynchronous request to foo.php that returns a JavaScript literal
     2 // which is eval()'d
     3 var bindArgs = {
     4     url:        "foo.php",
     5     mimetype:   "text/javascript",
     6     error:      function(type, errObj){
     7         // handle error here
     8     },
     9     load:      function(type, data, evt){
    10         // handle successful response here
    11     }
    12 };
    13 
    14 // dispatch the request
    15 var requestObj = dojo.io.bind(bindArgs);
    16 
    17 
    18 //當然,可以寫成
    19 //dojo.io.bind({
    20 //    url:        "t4.htm",
    21 //    mimetype:   "text/javascript",
    22 //    error:      function(type, errObj){
    23 //        // handle error here
    24 //    },
    25 //    load:      function(type, data, evt){
    26 //        // handle successful response here
    27 //    }});
    28 

      dojo.io.bind(requestObject)方法中,只有一個參數(shù),就是請求對象,請求對象可以是dojo.io.Request,也可以是指明了dojo.io.Request基本屬性的一個匿名對象。在上面的代碼中,我們沒有new一個dojo.io.Request對象,所以使用的是匿名對象,在應用中,常用的是匿名對象。
      由上面的匿名對象的代碼,可以看到dojo.io.Request對象有2個屬性和2個方法:
      1."url",表示被請求的資源地址。
      2."mimetype",回應內容類型,默認是"text/plain",注意與http傳輸時的mimetype區(qū)別,當mimetype為"text/javascript"時,表示請求javascript腳本并執(zhí)行。
      3."error"方法,表示請求失敗時的處理。
      4."load"方法,請求成功后的操作。
      dojo.io.Request對象sync屬性默認為false,也就是說不同步(就是異步了),發(fā)出請求后,可繼續(xù)后續(xù)操作,就是所謂的異步操作了。一旦該項取值為true,發(fā)出請求,則必須等待請求處理完畢,才能繼續(xù)后續(xù)操作,否則將一直阻塞操作。
      上面的代碼沒有指定sync屬性,就是說其為默認值false,所以是異步執(zhí)行的。

      dojo.io.Request對象還有幾個屬性,介紹如下:
      method:相信form用多的人都不會陌生,對了,就是和它一個意思,取值為"POST"或"GET",默認取值為"GET"。
      formNode:一個DOM節(jié)點,指定一個form將被此次請求提交,其將繼承上面的url和method屬性,若前面沒給method屬性賦值,則取該form的method屬性。該屬性取值如document.getElementById("form1")。
      content:鍵/值對,將被加在參數(shù)里被傳輸,相當于http傳輸方式中get和post的數(shù)據(jù)。
      transport:指明此次傳輸所用的傳輸對象,一旦指定的傳輸對象不可用,則此次請求將失敗,同時觸發(fā)error事件。若不指定,bind()方法將試圖從已經(jīng)注冊的傳輸對象列表中查找最合適的可用的傳輸對象來執(zhí)行請求。如要確認用XMLHttp來執(zhí)行請求,則需指定:transport: "XMLHTTPTransport"。下面是bind()試圖查找最合適的傳輸對象的代碼部分:
    1 for(var x=0; x<dojo.io.transports.length; x++)
    2 {
    3     var tmp = dojo.io.transports[x];
    4     if((this[tmp])&&(this[tmp].canHandlerequest)))
    5     {
    6         tsName = tmp;
    7     }
    8 }

      changeUrl: 請求完成后,發(fā)出請求的頁面是否將跳轉到某錨點。雖然官方文檔解釋的時候說是boolean類型,默認為false,但是該項也可以是自定義的字符串,就是要跳轉到的錨點名稱。當該項為true時,錨點名稱將根據(jù)當前時間生成,具體有什么用處我也不清楚。但是我們可以通過指定錨點名稱,來跳轉到我們希望的錨點。要注意的是,不管請求處理成功與否,都會發(fā)生跳轉。官網(wǎng)文檔中,說在Mozilla/Firefox中,URL改變將失敗,也就有了這句"This may be removed in the future as it pertains exclusively to in-browser HTTP transports.",將來將被去掉,因為與傳輸對象的結合太專有。例子如下:若該項為true,則跳轉地址可能將變?yōu)?a aa",則地址將為http://192.168.0.168/t3.htm#aa
      useCache:布爾類型,默認為false,表示是否將此次請求的結果緩存,以后直接從緩存中獲取此次請求的結果。一旦該項為true后,則發(fā)出的請求若為以前發(fā)過的,直接從緩存中讀取結果。我們可以在bind()執(zhí)行后,在立刻alert一個東西,當然,要異步執(zhí)行的。在發(fā)出新請求的時候,后面的alert是先執(zhí)行的,然后執(zhí)行請求結果。再發(fā)出一樣的請求后,由于結果在緩存中,所以直接取請求結果,從而我們會看到alert是在執(zhí)行完結果后,再執(zhí)行的。
      bindSuccess:布爾類型,默認為false,指明請求是否可以被其它傳輸對象接受并執(zhí)行請求。具體用法我也不清楚,以后清楚的時候再補完這里。
      下面說說dojo.io.Request對象的幾個方法。
      上面已經(jīng)講了error()和load()方法,這里要注意這2個方法的參數(shù)。error(type, errorObject)方法有2個參數(shù),第一個參數(shù)表示處理結果,在error()中,永遠是"error",第二個參數(shù)表示的是傳輸細節(jié)。load(type, data, event)有3個參數(shù),第一位也是處理結果,load()中永遠取值為"load",表示處理成功,第二位表示處理成功后返回的信息,第三位表示可以處理傳輸細節(jié)的底層傳輸對象,官網(wǎng)的一個例子是:當利用dojo.io.XMLHTTPTransport進行傳輸?shù)臅r候,第三個參數(shù)表示的是對執(zhí)行請求的XMLHTTP對象的一個引用。
      dojo.io.Request對象中,還有2個方法。首先是handle(type, data, event),可以用來處理所有的情況,如load()、error()和其它一些情況。當type=="load"的時候,三個參數(shù)和load()是一樣的,當type=="error"的時候,data就表示error()中的errorObject,而event就無效了。看下面一個用handle()的例子(摘自官網(wǎng)):
     1 dojo.io.bind({
     2     url: "http://foo.bar.com/sampleData.txt",
     3     handle: function(type, data, evt){
     4         if(type == "load"){
     5             // do something with the data object
     6         }else if(type == "error"){
     7             // here, "data" is our error object
     8             // respond to the error here
     9         }else{
    10             // other types of events might get passed, handle them here
    11         }
    12     },
    13     mimetype: "text/plain"
    14 });


      由上面,可以很容易明白handle()的用法。
      dojo.io.Request對象中最后一個方法是abort(),字面意思理解是中止請求,是用來中斷執(zhí)行待處理的請求的。這個行為是用來執(zhí)行請求的傳輸對象所擁有的。
      在io.js中,可以找到這么一行
    dojo.io.transports = [];

      由上面bind()查找最合適的可用傳輸對象的過程,我們知道,這是用來存放已注冊的傳輸對象的。這是一個數(shù)組,里面的傳輸對象將被每一個bind請求所參考,并且第一個傳輸對象接受一個特殊請求并處理它(這句由于沒找個合適的例子,理解還不夠透徹,以后補過)。
      dojo.io.transports有個addTransport(name)方法,是注冊一個可用來處理請求的傳輸對象,要注意的是name是要在dojo.io命名空間中的,如我們常用的dojo.io.XMLHTTPTransport,注冊時用dojo.io.transports.addTrasnport("XMLHTTPTransport"),在上面講dojo.io.Request對象是也說過,要確認用XMLHttp來執(zhí)行請求,需指定:transport: "XMLHTTPTransport",正好吻合。
      根據(jù)上面的資料,transport是可以自己寫的,然后定義自己需要的一些東西,具體要怎么寫我現(xiàn)在也不清楚,不過個人感覺正如java中的繼承那樣,能出現(xiàn)相當誘人的結果。

    posted on 2007-10-18 00:30 飛雪(leo) 閱讀(396) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導航:
     
    主站蜘蛛池模板: 97se亚洲国产综合自在线| 久久亚洲春色中文字幕久久久| 久久www免费人成精品香蕉 | 亚洲午夜免费视频| 亚洲中文字幕在线观看| h在线看免费视频网站男男| 免费人成视频在线观看视频| 免费一级全黄少妇性色生活片 | 综合自拍亚洲综合图不卡区| 麻豆精品成人免费国产片| 成人免费大片免费观看网站| 免费不卡中文字幕在线| 曰批免费视频播放在线看片二| 全黄性性激高免费视频| v片免费在线观看| 国产亚洲精品xxx| 91免费国产精品| 在线日韩日本国产亚洲| 丝袜捆绑调教视频免费区| 成人爽A毛片免费看| 亚洲AV无码专区亚洲AV桃| 亚洲成A人片在线观看中文| 中文字幕免费在线看| 91大神亚洲影视在线| 24小时日本在线www免费的| 老司机福利在线免费观看| 国产精品亚洲mnbav网站 | 亚洲网站在线免费观看| 中文字幕在线免费观看视频| 亚洲AV中文无码乱人伦下载| 猫咪免费观看人成网站在线| 中文字幕日韩亚洲| 黄色片网站在线免费观看| 中文字幕在线亚洲精品| www.免费在线观看| 国产精品亚洲专区无码唯爱网| 91精品国产免费久久久久久青草 | 成人男女网18免费视频| 亚洲韩国在线一卡二卡| 国产精品久久久久久久久久免费| 污视频网站免费观看|