模塊:dojo.io.IO
dojo.io.bind
處理請(qǐng)求取回需要的數(shù)據(jù)并處理
這個(gè)函數(shù)是AJAX中最為重要和有用的函數(shù),dojo.io.bind這個(gè)類是用來處理客戶端與服務(wù)器間通訊的,需要通訊的參數(shù)由對(duì)象dojo.io.Request所定義,具體通訊的方法則由另外一個(gè)對(duì)象Transport所提供。
因此,我們?nèi)绻枰c服務(wù)器通訊,則應(yīng)該定義一個(gè)Request對(duì)象,其中包括服務(wù)器地址及回調(diào)函數(shù),例子中Requset都是以匿名對(duì)象方式定義的
雖然我們可以定義一個(gè)自己的Transport,但是顯然不如直接利用現(xiàn)成的Transport方便。
Dojo里提供了一個(gè)同時(shí)兼容IE和Firefox的dojo.io.XMLHTTPTransport,但是這個(gè)對(duì)象位于 dojo.io.BrowserIO,因此,一般require dojo.io.IO時(shí),還應(yīng)該require dojo.io.BrowserIO
Usage Example:
dojo.io.bind({
url: "http://localhost/test.html", //要請(qǐng)求的頁面地址
mimetype: "text/html", //請(qǐng)求的頁面的類型,應(yīng)該設(shè)置為與你請(qǐng)求頁面類型對(duì)應(yīng)的mimetype,默認(rèn)為 "text/plain"
method:"GET", //默認(rèn)為"GET"
sync: false, //默認(rèn)為異步執(zhí)行
useCache: false, //默認(rèn)為不使用頁面緩存,注意這里的緩存并不是瀏覽器的緩存,而是Dojo自身所維護(hù)的頁面緩存
preventCache: false, //默認(rèn)為啟用瀏覽器緩存,否則將通過自動(dòng)增加不同的參數(shù)來確保瀏覽器緩存失效
timeoutSeconds: 3000, //3秒后超時(shí),如果為0則永不超時(shí)
load: function(type, data, evt) { alert(data); }, //type should be "load", data is that we wanted
error: function(type, error) { alert(error.message); }, //error is dojo.io.Error
timeout: function(type) { alert("請(qǐng)求超時(shí)!"); }
});
你也可以用一個(gè)handle來處理所有的事件
dojo.io.bind({
url: "http://localhost/test.html", //要請(qǐng)求的頁面地址
mimetype: "text/html", //請(qǐng)求的頁面的類型,應(yīng)該設(shè)置為與你請(qǐng)求頁面類型對(duì)應(yīng)的mimetype
timeoutSeconds: 3000, //3秒后超時(shí),如果為0則永不超時(shí)
handle: function(type, data, evt){
if(type == "load") { alert(data); } //data is that we wanted
else if (type == "error") { alert(data.message); } //data is the error object
else { ; } //other events maybe need handled
}
});
如果沒有在Request中指定所用的transport,則Dojo會(huì)自動(dòng)的在已注冊(cè)的transports中尋找能夠處理這個(gè)Request的transport,如果不能找到,則返回指定的Request。下面是一個(gè)指定了transport的例子:
dojo.io.bind({
url: "http://localhost/test.html", //要請(qǐng)求的頁面地址
mimetype: "text/html", //請(qǐng)求的頁面的類型,應(yīng)該設(shè)置為與你請(qǐng)求頁面類型對(duì)應(yīng)的mimetype
timeoutSeconds: 3000, //3秒后超時(shí),如果為0則永不超時(shí)
transport: "XMLHTTPTransport",
load: function(type, data, evt) { alert(data); }, //type should be "load", data is that we wanted
error: function(type, error) { alert(error.message); }, //error is dojo.io.Error
timeout: function(type) { alert("請(qǐng)求超時(shí)!"); }
});
你還可以利用bind來得到一個(gè)JavaScript所定義的對(duì)象(注意mimetype必須要定義為"text/javascript")
testObj = dojo.io.bind({
url: "http://localhost/test.js", //test.js里定義了一個(gè)對(duì)象
mimetype: "text/javascript", //請(qǐng)求的頁面的類型,應(yīng)該設(shè)置為與你請(qǐng)求頁面類型對(duì)應(yīng)的mimetype
timeoutSeconds: 3000, //3秒后超時(shí),如果為0則永不超時(shí)
handle: function(type, data, evt){
if(type == "load") { alert(data); } //data is a object or value
else if (type == "error") { alert(data.message); } //data is the error object
else { ; } //other events maybe need handled
}
});
下面是一個(gè)Post的例子:
dojo.io.bind({
url: "http://localhost/test.aspx", //要提交的頁面地址
mimetype: "text/html", //請(qǐng)求的頁面的類型,應(yīng)該設(shè)置為與你請(qǐng)求頁面類型對(duì)應(yīng)的mimetype
timeoutSeconds: 3000, //3秒后超時(shí),如果為0則永不超時(shí)
method: "POST",
formNode: dojo.byId("myForm"), //指定提交的Form名稱
load: function(type, data, evt) { alert(data); }, //type should be "load", data is that we wanted
error: function(type, error) { alert(error.message); }, //error is dojo.io.Error
timeout: function(type) { alert("請(qǐng)求超時(shí)!"); }
});
另一個(gè)Post的例子(without Form to post):
dojo.io.bind({
url: "http://localhost/test.aspx", //要提交的頁面地址
mimetype: "text/html", //請(qǐng)求的頁面的類型,應(yīng)該設(shè)置為與你請(qǐng)求頁面類型對(duì)應(yīng)的mimetype
timeoutSeconds: 3000, //3秒后超時(shí),如果為0則永不超時(shí)
method: "POST",
content: {a: 1, b: 2}, //要提交的數(shù)據(jù)
load: function(type, data, evt) { alert(data); }, //type should be "load", data is that we wanted
error: function(type, error) { alert(error.message); }, //error is dojo.io.Error
timeout: function(type) { alert("請(qǐng)求超時(shí)!"); }
});
dojo.io.queueBind
有時(shí),我們需要一次發(fā)出多個(gè)網(wǎng)頁請(qǐng)求,則應(yīng)該使用dojo.io.queueBind,因?yàn)闉g覽器可能只允許同時(shí)發(fā)出有限個(gè)數(shù)的請(qǐng)求,如果是使用dojo.io.bind的話,則有可能會(huì)申請(qǐng)不到新的XMLHttp對(duì)象而導(dǎo)致出錯(cuò)。
用法與dojo.io.bind是一樣的。
dojo.io.argsFromMap
用來把對(duì)象轉(zhuǎn)換為URL的參數(shù)形式
Usage Example:
dojo.io.argsFromMap({a:1,b:2,c:3}); //will return "c=3&b=2&a=1"
dojo.io.argsFromMap({name:"名稱",value:"值"},"utf"); //will return "value=%E5%80%BC&name=%E5%90%8D%E7%A7%B0", 有中文的話應(yīng)該指定utf格式,否則dojo.string.encodeAscii返回的編碼是很怪異的
dojo.io.argsFromMap({a:1,b:2,c:3}, "utf", "c"); //will return "b=2&a=1&c=3",最后一個(gè)參數(shù)可以控制指定名稱的值出現(xiàn)在最后
dojo.io.setIFrameSrc
設(shè)置IFrame的Src
Usage Example:
dojo.io.setIFrameSrc(dojo.byId("myFrame"), "http://localhost/test.htm"); //myFrame打開指定的網(wǎng)頁
dojo.io.setIFrameSrc(dojo.byId("myFrame"), "http://localhost/test.htm", true); //myFrame打開指定的網(wǎng)頁,并覆蓋瀏覽器的歷史記錄
TODO: 補(bǔ)充一個(gè)kwArgs的例子,我之前在網(wǎng)上看見過,可是現(xiàn)在無論如何也找不到相關(guān)的頁面了,只好以后在舉例了
模塊:dojo.io.BrowserIO
基本上就提供了dojo.io.XMLHTTPTransport這個(gè)對(duì)象
XMLHTTPTransport一般能夠滿足我們的需求,但是其有幾個(gè)限制:它不能傳輸文件,不能夠成功執(zhí)行跨域名的遠(yuǎn)程請(qǐng)求,并且不支持 file:// 這樣的協(xié)議
因此,根據(jù)應(yīng)用要求,我們可能會(huì)需要選用其它的transport: dojo.io.IframeTransport, dojo.io.repubsubTranport, dojo.io.ScriptSrcTransport, ShortBusTransport
dojo.io.IframeTransport,用法與xmlhttp是一樣的,其優(yōu)點(diǎn)就是可以跨域,不存在任何的安全問題
如果 Request指定的mimetype是text或javascript,返回的內(nèi)容應(yīng)該是放在第一個(gè)textarea里的內(nèi)容,如果指定的 mimetype是html,則IFrame里的html則是需要的內(nèi)容。因?yàn)闉g覽器兼容的原因,IframeTransport不能正確處理返回類型為 XML的請(qǐng)求。
關(guān)于Rpc,這個(gè)類似于Remoting的東西,也將在以后對(duì)其進(jìn)行介紹。