dojo.io包很好的封装了XMLHTTP和其它比较复杂的传输机制(iframe等)。另外"transports"传输器以插件形式(实现的统一的接口)出现,另外dojo对于XMLHTTP的支持解决了back button的问题。我们先抛开细节,看看dojo提供给我们的public API.
dojo.io的许多不可思议的功能都由bind()方法来实现。(可能脚本语言或不定参数的语言都喜欢这样,说实话,我不喜欢)。dojo.io.bind()是一个普通的匿名请求API,它的底层可以是不同的传输机制(queues of iframes, XMLHTTP, mod_pubsub, LivePage, 等)。dojo会尝试选择最好的传输机制,如果你的环境支持多种传输机制,XMLHTTP会是dojo的首选。bind()方法的参数是一个简单的匿名对象,当然这个对象的属性是异常灵活的。
如果你要得到一个text文件,可能代码如下:
和prototype.js/YUI等差不多,简单的代码可以得到数据。可能你也想到,如果出现错误怎么 办,简单注册一个错误处理函数就好了:
dojo.io.bind({
url: "
http://foo.bar.com/sampleD...,
load: function(type, data, evt){ /*do something w/ the data */ },
error: function(type, error){ /*do something w/ the error*/ },
mimetype: "text/plain"
});
dojo也可以把所有的处理放到一个函数里,如下:
dojo.io.bind({
url: "
http://foo.bar.com/sampleD...,
handle: function(type, data, evt){
if(type == "load"){
// do something with the data object
}else if(type == "error"){
// here, "data" is our error object
// respond to the error here
}else{
// other types of events might get passed, handle them here
}
},
mimetype: "text/plain"
});
考虑性能原因,Ajax经常重服务器返回一段可执行的javascript代码段,在浏览器中eval(它)。你只要指定mimetype: "text/javascript" 就
可以了,dojo会自动为你 eval这些javascript代码,
你也可以指定你使用哪种传输器 如 XMLHTTPTransport:
dojo.io.bind({
url: "
http://foo.bar.com/sampleD...,
load: function(type, evaldObj){ /* do something */ },
mimetype: "text/plain", // get plain text, don't eval()
transport: "XMLHTTPTransport"
});
Being a jack-of-all-trades, bind() also supports the submission of forms via a request (with the single caveat that it won't do file upload over XMLHTTP):
????得看看代码?是否url会覆盖action.dojo.io.bind({
url: "
http://foo.bar.com/process...,
load: function(type, evaldObj){ /* do something */ },
formNode: document.getElementById("formToSubmit")
});
呵呵,不错吧。下面看看几个传输器。
Transports:dojo.io.bind和其它相关函数与服务器通信有几种方法,叫Transport,每种Transports可能都有缺陷,因此在特定场合你必须选择合适的transport。
默认的transport是大家熟悉的 XMLHttp.
XMLHttpxmlhttp在大部分情况下工作的很好,但它不能上传文件,不能跨域工作,也不能在file://协议下工作。(dojo也代替的方案)
例子代码:
<script type="text/javascript"> dojo.require("dojo.io.*");
function mySubmit({
dojo.io.bind ({
url: 'server.cfm',
handler: callBack,
formNode: dojo.byId('myForm')
});
}
function callBack(type, data, evt) {
dojo.byId('result').innerHTML = data;
}
</script>
IFrame I/O:IFrame I/O transport是有用的,它可以上传文件. 例子代码:
<script type="text/javascript"> dojo.require("dojo.io.*");
dojo.require("dojo.io.IframeIO");
function mySubmit() {
dojo.io.bind ({ url: 'server.cfm',
handler: callBack,
formNode: dojo.byId('myForm') });
}
function callBack(type, data, evt) {
dojo.byId('result').innerHTML = data;
}
</script>
The response type from the above URL can be text, html, or JS/JSON.
这种响应类型的url可以是text,html或者js/json.