|
既然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)方法中,只有一個參數,就是請求對象,請求對象可以是dojo.io.Request,也可以是指明了dojo.io.Request基本屬性的一個匿名對象。在上面的代碼中,我們沒有new一個dojo.io.Request對象,所以使用的是匿名對象,在應用中,常用的是匿名對象。
由上面的匿名對象的代碼,可以看到dojo.io.Request對象有2個屬性和2個方法:
1."url",表示被請求的資源地址。
2."mimetype",回應內容類型,默認是"text/plain",注意與http傳輸時的mimetype區別,當mimetype為"text/javascript"時,表示請求javascript腳本并執行。
3."error"方法,表示請求失敗時的處理。
4."load"方法,請求成功后的操作。
dojo.io.Request對象的sync屬性默認為false,也就是說不同步(就是異步了),發出請求后,可繼續后續操作,就是所謂的異步操作了。一旦該項取值為true,發出請求,則必須等待請求處理完畢,才能繼續后續操作,否則將一直阻塞操作。
上面的代碼沒有指定sync屬性,就是說其為默認值false,所以是異步執行的。
dojo.io.Request對象還有幾個屬性,介紹如下:
method:相信form用多的人都不會陌生,對了,就是和它一個意思,取值為"POST"或"GET",默認取值為"GET"。
formNode:一個DOM節點,指定一個form將被此次請求提交,其將繼承上面的url和method屬性,若前面沒給method屬性賦值,則取該form的method屬性。該屬性取值如document.getElementById("form1")。
content:鍵/值對,將被加在參數里被傳輸,相當于http傳輸方式中get和post的數據。
transport:指明此次傳輸所用的傳輸對象,一旦指定的傳輸對象不可用,則此次請求將失敗,同時觸發error事件。若不指定,bind()方法將試圖從已經注冊的傳輸對象列表中查找最合適的可用的傳輸對象來執行請求。如要確認用XMLHttp來執行請求,則需指定: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: 請求完成后,發出請求的頁面是否將跳轉到某錨點。雖然官方文檔解釋的時候說是boolean類型,默認為false,但是該項也可以是自定義的字符串,就是要跳轉到的錨點名稱。當該項為true時,錨點名稱將根據當前時間生成,具體有什么用處我也不清楚。但是我們可以通過指定錨點名稱,來跳轉到我們希望的錨點。要注意的是,不管請求處理成功與否,都會發生跳轉。官網文檔中,說在Mozilla/Firefox中,URL改變將失敗,也就有了這句"This may be removed in the future as it pertains exclusively to in-browser HTTP transports.",將來將被去掉,因為與傳輸對象的結合太專有。例子如下:若該項為true,則跳轉地址可能將變為http://192.168.0.168/t3.htm#aa。
useCache:布爾類型,默認為false,表示是否將此次請求的結果緩存,以后直接從緩存中獲取此次請求的結果。一旦該項為true后,則發出的請求若為以前發過的,直接從緩存中讀取結果。我們可以在bind()執行后,在立刻alert一個東西,當然,要異步執行的。在發出新請求的時候,后面的alert是先執行的,然后執行請求結果。再發出一樣的請求后,由于結果在緩存中,所以直接取請求結果,從而我們會看到alert是在執行完結果后,再執行的。
bindSuccess:布爾類型,默認為false,指明請求是否可以被其它傳輸對象接受并執行請求。具體用法我也不清楚,以后清楚的時候再補完這里。
下面說說dojo.io.Request對象的幾個方法。
上面已經講了error()和load()方法,這里要注意這2個方法的參數。error(type, errorObject)方法有2個參數,第一個參數表示處理結果,在error()中,永遠是"error",第二個參數表示的是傳輸細節。load(type, data, event)有3個參數,第一位也是處理結果,load()中永遠取值為"load",表示處理成功,第二位表示處理成功后返回的信息,第三位表示可以處理傳輸細節的底層傳輸對象,官網的一個例子是:當利用dojo.io.XMLHTTPTransport進行傳輸的時候,第三個參數表示的是對執行請求的XMLHTTP對象的一個引用。
dojo.io.Request對象中,還有2個方法。首先是handle(type, data, event),可以用來處理所有的情況,如load()、error()和其它一些情況。當type=="load"的時候,三個參數和load()是一樣的,當type=="error"的時候,data就表示error()中的errorObject,而event就無效了。看下面一個用handle()的例子(摘自官網):
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(),字面意思理解是中止請求,是用來中斷執行待處理的請求的。這個行為是用來執行請求的傳輸對象所擁有的。
在io.js中,可以找到這么一行
dojo.io.transports = [];
由上面bind()查找最合適的可用傳輸對象的過程,我們知道,這是用來存放已注冊的傳輸對象的。這是一個數組,里面的傳輸對象將被每一個bind請求所參考,并且第一個傳輸對象接受一個特殊請求并處理它(這句由于沒找個合適的例子,理解還不夠透徹,以后補過)。
dojo.io.transports有個addTransport(name)方法,是注冊一個可用來處理請求的傳輸對象,要注意的是name是要在dojo.io命名空間中的,如我們常用的dojo.io.XMLHTTPTransport,注冊時用dojo.io.transports.addTrasnport("XMLHTTPTransport"),在上面講dojo.io.Request對象是也說過,要確認用XMLHttp來執行請求,需指定:transport: "XMLHTTPTransport",正好吻合。
根據上面的資料,transport是可以自己寫的,然后定義自己需要的一些東西,具體要怎么寫我現在也不清楚,不過個人感覺正如java中的繼承那樣,能出現相當誘人的結果。
|