I'll be back!

  Focus on BPM, celebrate PegaRULES Process Commander (PRPC)
posts - 76, comments - 161, trackbacks - 0, articles - 2
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

dojo.io.bind 介绍

Posted on 2006-10-25 11:02 zolly 阅读(2008) 评论(1)  编辑  收藏
Introduction to dojo.io.bind
   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.

摘自:zkjbeyondhttp://zkj.wisekernel.net/read.php/14.htm

评论

# re: dojo.io.bind 介绍  回复  更多评论   

2013-08-12 02:16 by whut_lp
受益匪浅

只有注册用户登录后才能发表评论。


网站导航: