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文件,可能代码如下:

dojo.io.bind({
   url: "http://foo.bar.com/sampleD...,
   load: function(type, data, evt){ /*do something w/ the data */ },
   mimetype: "text/plain"
});

和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代码,

dojo.io.bind({
   url: "http://foo.bar.com/sampleD...,
   load: function(type, evaldObj){ /* do something */ },
   mimetype: "text/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.

XMLHttp

xmlhttp在大部分情况下工作的很好,但它不能上传文件,不能跨域工作,也不能在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.