dojo快速入门


第一步,引入dojo.js
dojo的发行包里有4个子目录,要引入的文件是名叫"dojo"的子目录里的dojo.js。
假设你是这样的目录结构:
引用

project
|
+--dojo-lib
| |
| +--dijit
| +--dojo
| +--dojox
| +--util
|
+--dojo_hello_world.html

Java代码
1. <script type="text/javascript" src="./dojo-lib/dojo/dojo.js"></script>  
Java代码
1. <script type="text/javascript" src="./dojo-lib/dojo/dojo.js"></script>  
Java代码
1. <script type="text/javascript" src="./dojo-lib/dojo/dojo.js"></script>

 


开始使用dojo
现在开始使用dojo的第一个函数:dojo.byId
dojo.byId就等同于常用的document.getElement
<input type="text" name="username" id="username" value="Mark" />
<script type="text/javascript">
var username = dojo.byId('username').value
alert(username);
</script>
OK,是不是和普通的js库一样,没有任何玄机?

 

dojo.addOnLoad
现在我们想在window.onload里面处理一点东西,就像Ext.onReady,这个东西在
dojo里叫做dojo.addOnLoad
Java代码
1. dojo.addOnLoad(function(){  
2.     var username = dojo.byId('username').value  
3.     alert(username);  
4. });  
Java代码
1. dojo.addOnLoad(function(){  
2.     var username = dojo.byId('username').value  
3.     alert(username);  
4. });  
Java代码
1. dojo.addOnLoad(function(){  
2.     var username = dojo.byId('username').value  
3.     alert(username);  
4. });

 


dojo.connect
OK,window.onload搞定了,那么如何监听普通的dom事件呢?没问题,强大的dojo.connect出场
Java代码
1. <script type="text/javascript">  
2. function sayHello(event)  
3. {  
4.     alert("Hello");  
5. }  
6. dojo.addOnLoad(function(){  
7.     var btn = dojo.byId('hello');  
8.     dojo.connect(btn,"onclick",sayHello);  
9. });  
10. </script>  
11. <input type="button" id="hello" value="Hello" />  
Java代码
1. <script type="text/javascript">  
2. function sayHello(event)  
3. {  
4.     alert("Hello");  
5. }  
6. dojo.addOnLoad(function(){  
7.     var btn = dojo.byId('hello');  
8.     dojo.connect(btn,"onclick",sayHello);  
9. });  
10. </script>  
11. <input type="button" id="hello" value="Hello" />  
Java代码
1. <script type="text/javascript">  
2. function sayHello(event)  
3. {  
4.     alert("Hello");  
5. }  
6. dojo.addOnLoad(function(){  
7.     var btn = dojo.byId('hello');  
8.     dojo.connect(btn,"onclick",sayHello);  
9. });  
10. </script>  
11. <input type="button" id="hello" value="Hello" />


是不是和prototype的Event.observe($('btnAdd'), "load", doAdd)差不多?
用prototype时最烦的就是那个长长的bindAsListener了,使用dojo.conncect,可以在第三个参数中指定当前的scope:
Java代码
1. var name = "Mark"  
2. function sayHello()  
3. {  
4.     alert("Hello " + this.name);  
5. }  
6. var obj = {  
7.     name: "Karl"  
8. }  
9. dojo.addOnLoad(function(){  
10.     var btn = dojo.byId('hello');  
11.     dojo.connect(btn,"onclick",obj,sayHello);//注意这行的第三个和第四个参数  
12. });  
Java代码
1. var name = "Mark"  
2. function sayHello()  
3. {  
4.     alert("Hello " + this.name);  
5. }  
6. var obj = {  
7.     name: "Karl"  
8. }  
9. dojo.addOnLoad(function(){  
10.     var btn = dojo.byId('hello');  
11.     dojo.connect(btn,"onclick",obj,sayHello);//注意这行的第三个和第四个参数  
12. });  
Java代码
1. var name = "Mark"
2. function sayHello()  
3. {  
4.     alert("Hello " + this.name);  
5. }  
6. var obj = {  
7.     name: "Karl"
8. }  
9. dojo.addOnLoad(function(){  
10.     var btn = dojo.byId('hello');  
11.     dojo.connect(btn,"onclick",obj,sayHello);//注意这行的第三个和第四个参数  
12. });

OK,点击按钮,将输出:Hello Karl
这里dojo.connect的第三个参数变成了scope,而handler函数是第四个,实际上
dojo.connect(btn,"onclick",sayHello);

dojo.connect(btn,"onclick",null,sayHello);
相同。
更加复杂的用法这里不作介绍,写太多就越搞越复杂了,后面再写文章详细介绍dojo.connect,这里只简单介绍如何绑定DOM事件。

 

xmlhttp dojo.xhrGet
OK,介绍了简单的DOM操作方法,接下来该到Ajax的传统项目-XmlHttp了
在使用xmlhttp时,需要注意到编码的问题,要让dojo默认绑定为utf-8怎么办呢?很简单,只需要修改一下引入dojo.js时的标签:
Java代码
1. <script type="text/javascript" src="./dojo-lib/dojo/dojo.js" djConfig="isDebug:true,bindEncoding:'UTF-8'"></script>  
Java代码
1. <script type="text/javascript" src="./dojo-lib/dojo/dojo.js" djConfig="isDebug:true,bindEncoding:'UTF-8'"></script>  
Java代码
1. <script type="text/javascript" src="./dojo-lib/dojo/dojo.js" djConfig="isDebug:true,bindEncoding:'UTF-8'"></script>

多了一个djConfig属性,很简单,第一个isDebug是说是否打开FireBug的Console,第二个是xmlhttp使用的编码。第二个才是重点,设置了就一劳永逸了。

这次我们要点击了hello按钮后发出一个xmlhttp请求:
Java代码
1. function sayHello() {  
2.     dojo.xhrGet({  
3.         url: "
http://localhost/hello/sayHello.jsp",  
4.         handleAs: "text",  
5.         load: function(responseText)  
6.         {  
7.           alert(responseText);  
8.           dojo.byId("divHello").innerHTML = responseText;  
9.         },  
10.         error: function(response)  
11.         {  
12.           alert("Error");  
13.         }  
14.     });  
15. }  
16. dojo.connect(btn,"onclick",sayHello);  
Java代码
1. function sayHello() {  
2.     dojo.xhrGet({  
3.         url: "
http://localhost/hello/sayHello.jsp",  
4.         handleAs: "text",  
5.         load: function(responseText)  
6.         {  
7.           alert(responseText);  
8.           dojo.byId("divHello").innerHTML = responseText;  
9.         },  
10.         error: function(response)  
11.         {  
12.           alert("Error");  
13.         }  
14.     });  
15. }  
16. dojo.connect(btn,"onclick",sayHello);  
Java代码
1. function sayHello() {  
2.     dojo.xhrGet({  
3.         url: "
http://localhost/hello/sayHello.jsp",  
4.         handleAs: "text",  
5.         load: function(responseText)  
6.         {  
7.           alert(responseText);  
8.           dojo.byId("divHello").innerHTML = responseText;  
9.         },  
10.         error: function(response)  
11.         {  
12.           alert("Error");  
13.         }  
14.     });  
15. }  
16. dojo.connect(btn,"onclick",sayHello);


看看,够不够一目了然?

url 就是url……
handleAs 把获取的内容作为text/html
load 成功时的回调函数
error 失败时的回调函数


那如果要传入参数怎么办?
Java代码
1. var params = {  
2.     username:'Mark',  
3.     id:'105'  
4. }  
5. dojo.xhrGet({  
6.     url: "
http://localhost/hello/sayHello.jsp",  
7.     content:params,  
8.     //...  
9. });  
Java代码
1. var params = {  
2.     username:'Mark',  
3.     id:'105'  
4. }  
5. dojo.xhrGet({  
6.     url: "
http://localhost/hello/sayHello.jsp",  
7.     content:params,  
8.     //...  
9. });  
Java代码
1. var params = {  
2.     username:'Mark',  
3.     id:'105'
4. }  
5. dojo.xhrGet({  
6.     url: "
http://localhost/hello/sayHello.jsp",  
7.     content:params,  
8.     //...  
9. });

注意那个content参数,你要传入的参数是个关联数组/object,dojo会自动把参数解析出来,要使用post方法?
dojo.xhrGet ---> dojo.xhrPost
其他的还有
dojo.xhrPut
dojo.xhrDelete


json
那要是我想更换获取到的数据类型,比如json?xml?
修改handleAs即可,如:
handleAs: "json"
Java代码
1. dojo.xhrGet({  
2.     url: "
http://localhost/hello/sayHello.jsp",  
3.     handleAs: "json",  
4.     load: function(json)  
5.     {  
6.         alert(json.name)  
7.     }  
8.     //...  
9. });  
Java代码
1. dojo.xhrGet({  
2.     url: "
http://localhost/hello/sayHello.jsp",  
3.     handleAs: "json",  
4.     load: function(json)  
5.     {  
6.         alert(json.name)  
7.     }  
8.     //...  
9. });  
Java代码
1. dojo.xhrGet({  
2.     url: "
http://localhost/hello/sayHello.jsp",  
3.     handleAs: "json",  
4.     load: function(json)  
5.     {  
6.         alert(json.name)  
7.     }  
8.     //...  
9. });

引用

handleAs: "json-comment-filtered" 使用注释符号/**/把json数据包含起来,推荐使用
handleAs: "json-comment-optional" 首先尝试使用json-comment-filtered,如果执行错误,再使用普通的json格式解析
handleAs: "javascript" dojo尝试把服务器返回的数据当作javascript执行,并把结果作为参数传递给load函数
handleAs: "xml" xml对象。注意在Mozilla和IE中的xml是不同的,推荐使用sarissa


至于json和object的转换等,在
http://dojotoolkit.org/book/dojo-book-0-9/part-3- programmatic-dijit-and-dojo/other-miscellaneous-function/converting-json 有一个表格,应该能找到你需要的。


想要直接提交一个表单,就这样:
Java代码
1. dojo.xhrGet({  
2.     url: "
http://localhost/hello/sayHello.jsp",  
3.     form: dojo.byId("form1")  
4.     //...  
5. });  
Java代码
1. dojo.xhrGet({  
2.     url: "
http://localhost/hello/sayHello.jsp",  
3.     form: dojo.byId("form1")  
4.     //...  
5. });  
Java代码
1. dojo.xhrGet({  
2.     url: "
http://localhost/hello/sayHello.jsp",  
3.     form: dojo.byId("form1")  
4.     //...  
5. });

要解决IE下那个臭名昭著的缓存问题,就这样,preventCache会帮你自动生成一个timestamp
Java代码
1. dojo.xhrGet({  
2.     url: "
http://localhost/hello/sayHello.jsp",  
3.     preventCache: true  
4.     //...  
5. });  
Java代码
1. dojo.xhrGet({  
2.     url: "
http://localhost/hello/sayHello.jsp",  
3.     preventCache: true  
4.     //...  
5. });  
Java代码
1. dojo.xhrGet({  
2.     url: "
http://localhost/hello/sayHello.jsp",  
3.     preventCache: true
4.     //...  
5. });