国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
DOJO試用手記 - Enjoy Lucky Life Eternally - CSDNB...

1、前言
    最近發(fā)現(xiàn)ajax很不錯(cuò),由于它的存在,b/s結(jié)構(gòu)的應(yīng)用,在使用上與c/s結(jié)構(gòu)的更接近了。至于什么是ajax,這就不是我所要說明的,不清楚的自己去網(wǎng)上搜索。
    由于看ajax的東西,進(jìn)而找到幾個(gè)與此相關(guān)的框架。由于我是做java的,一般用eclipse,eclipse的編輯javascript的插件 JSEclipse中,有對dojo的支持,而我以前看的eclipse中對ajax的支持框架中也有dojo,所以,我就研究dojo了。
  首先,當(dāng)然是把整個(gè)框架下載下來,在http://dojotoolkit.org/download/里就可以下載到最近的dojo了。下完后,看了下demo,就開始滿互連網(wǎng)的搜索關(guān)于dojo的東西,發(fā)現(xiàn)還真是不多,而且不是講得很清楚,于是,就有想寫點(diǎn)東西了。
    下完后,將dojo.js和src里的東西都拷出來,就開始了dojo之旅。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

2、Event System

  首先接觸到的,是dojo的Event System。
   以前,我們是由頁面控件觸發(fā)一系列時(shí)間的時(shí)候,整個(gè)事件鏈要先定義好,然后才能按需要調(diào)用已經(jīng)寫好的調(diào)用模塊,一旦要修改事件鏈,就不是那么容易了。由 一個(gè)函數(shù)調(diào)用另一個(gè)函數(shù),能隨便說要調(diào)用哪個(gè)嗎?能在運(yùn)行的時(shí)候很容易修改嗎?除了那些大師級的人物,我相信我們這些菜鳥要解決這些問題,要費(fèi)不少事。
  在dojo中,其關(guān)注的事件不僅僅是Dom事件,它把任何的js方法調(diào)用都看作可以偵聽的事件,這就把一切都統(tǒng)一到一個(gè)地方了。
  我們都寫過這樣的代碼:

1 var buttonNode= document.getElementById("button");
2 function foo()
3 {
4     alert("foo");
5 }
6 buttonNode.onclick = function()
7 {
8     foo();
9 }

  
  要調(diào)用foo函數(shù),需要這么寫,如果說接著我還要調(diào)用一個(gè)函數(shù)呢?那么,就需要重寫buttonNode的onclick事件函數(shù),把以前的都再寫一遍,如果我還要再調(diào)用呢。。。。
   我們來看看dojo中是怎么解決的,看下面的一句

1 dojo.event.connect(buttonNode,"onclick","foo");

  就這么一句,就綁定了觸發(fā)函數(shù),想再加?那就繼續(xù)用dojo.event.connect(buttonNode,"onclick","foo2")...
  還有這么一種寫法:

dojo.event.connect(handlerNode, "onclick"function(evt){
    
// 

});

  上面是buttonNode綁定一個(gè)函數(shù),如果要與某對象的某個(gè)函數(shù)綁定的話,就用

dojo.event.connect(buttonNode, "onclick", object, "handler");

  object是目標(biāo)對象,handler是目標(biāo)對象的函數(shù),這里要注意,object不僅僅是頁面控件,一切對象皆可行,就又回到“關(guān)注的事 件不僅僅是Dom事件,它把任何的js方法調(diào)用都看作可以偵聽的事件”。要解除綁定的話,就可以使用dojo的disconnect方法,調(diào)用參數(shù)一定要 與connect一致,即可解除之前的綁定操作。
  dojo中connect函數(shù)的參數(shù)有下面幾種:
  • object, name, name
  • object, name, function pointer
  • object, name, object, name
再看看這段:

 1 var exampleObj = {
 2     counter: 0,
 3     foo: function(){ 
 4         alert("foo");
 5         this.counter++;
 6     },
 7     bar: function(){
 8         alert("bar");
 9         this.counter++;
10     }
11 };
12 
13 dojo.event.connect(exampleObj, "foo", exampleObj, "bar");
14 
15 

  最后一句的作用是什么?使得執(zhí)行exampleObj的foo函數(shù)之后,執(zhí)行exampleObj的bar函數(shù),一切對象皆可綁定!
  為了防止不經(jīng)意間對事件的多處綁定,造成連鎖調(diào)用。Dojo提供關(guān)鍵字鏈綁定,比如可以只綁定一次:

1 dojo.event.kwConnect({
2   srcObj: exampleObj,
3   srcFunc: "foo",
4   targetObj: exampleObj,
5   targetFunc: "bar",
6   once: true
7 });

  同樣,對應(yīng)也提供了一個(gè)kwDisconnect()方法來進(jìn)行關(guān)鍵字綁定的解除。
  在connect()和KwConnect()中,可以實(shí)現(xiàn)延遲執(zhí)行和循環(huán)執(zhí)行。
  KwConnect()中,只需要加一個(gè)delay屬性就可以了,測試代碼如下:
 1 <HTML>
 2 <HEAD>
 3 <TITLE> New Document </TITLE>
 4 <META NAME="Generator" CONTENT="EditPlus">
 5 <META NAME="Author" CONTENT="">
 6 <META NAME="Keywords" CONTENT="">
 7 <META NAME="Description" CONTENT="">
 8 <script type="text/javascript" src="dojo.js"></script>
 9 
10 </HEAD>
11 
12 <BODY>
13 <INPUT TYPE="button" id="eee" value="test">
14 <script language="javascript">
15 
16 var exampleObj = {
17     counter: 0,
18     foo: function(){ 
19         alert("foo");
20         this.counter++;
21     },
22     bar: function(){
23         alert("bar");
24         this.counter++;
25     }
26 };
27 
28 dojo.event.kwConnect({
29   srcObj: exampleObj,
30   srcFunc: "foo",
31   targetObj: exampleObj,
32   targetFunc: "bar",
33   delay: 3000
34 });
35 dojo.event.connect(document.getElementById("eee"),"onclick",exampleObj,"foo");
36 
37 
38 </script>
39 </BODY>
40 </HTML>

  由上面的延遲,可以想到,如果目標(biāo)等于源的話,那么就是一個(gè)循環(huán)執(zhí)行!
  據(jù)說在connect()中,延遲信息在它的第九個(gè)參數(shù),具體怎么樣,我還沒去試。
  上面是在事件發(fā)生后調(diào)用目標(biāo),如果要在發(fā)生前呢?就是下面的東西了:

dojo.event.connect("before", exampleObj, "foo", exampleObj, "bar");

  很容易理解吧,我就不多說了。在KwConnect中,就是

dojo.event.kwConnect({
    type:       
"before"
    srcObj:     exampleObj, 
    srcFunc:    
"foo"
    targetObj:  exampleObj,
    targetFunc: 
"bar"
});

  默認(rèn)情況下,connect()中第一個(gè)參數(shù)就是"after"了,同理KwConnect中的type默認(rèn)是"after"。
  下面要說的是方法包裝。當(dāng)我們想改變方法的輸入輸出時(shí),一般情況下是直接去修改代碼,那么,如果不修改原方法怎么辦呢?在dojo中,也給出了解決方法,就是用Around advice包裝方法。下面是一個(gè)例子:

<HEAD>
<TITLE> New Document </TITLE>
<script type="text/javascript" src="dojo.js"></script>

</HEAD>

<BODY>
<INPUT TYPE="button" id="eee" value="test">
<script language="javascript">
function foo(arg1, arg2)
{
   
return arg1+arg2;
}
function aroundFoo(invocation){
  
if(invocation.args.length < 2){    
    invocation.args.push(
3);
  }
  
var result = invocation.proceed(); 
  
//result="sss";
  return result;
}
dojo.event.connect(
"around""foo""aroundFoo");
dojo.event.connect(document.getElementById(
"eee"),"onclick",function(){alert(foo(1))});
</script>
</BODY>
</HTML>

  結(jié)果是4,如果取消注釋,則結(jié)果為"sss",開始調(diào)用的時(shí)候,只傳了個(gè)參數(shù)1,經(jīng)過包裝處理,添加了一個(gè)默認(rèn)參數(shù),然后繼續(xù),函數(shù)執(zhí)行完畢后,還可以將輸出結(jié)果再處理一遍,當(dāng)然,只是在函數(shù)有返回值的時(shí)候。
  這里要注意的是:函數(shù)aroundFoo有且只能有一個(gè)參數(shù),就是要改變的方法對象。這樣,每次執(zhí)行foo函數(shù)時(shí),都會(huì)進(jìn)行包裝,然后再輸出。
  利用connect()的時(shí)候,有一個(gè)問題就是參數(shù)傳遞,參數(shù)不一致,該怎么辦?先看下面一段:
 1 <HTML>
 2 <HEAD>
 3 <TITLE> New Document </TITLE>
 4 <script type="text/javascript" src="dojo.js"></script>
 5 </HEAD><BODY>
 6 <script language="javascript">
 7 var obj1 = {
 8     twoArgFunc: function(arg1, arg2){
 9         alert("1:"+arg1+" "+arg2);
10     }
11 };
12 
13 var obj2 = {
14     oneArgFunc: function(arg1,arg2){
15         alert("2:"+arg1+" "+arg2);
16     }
17 };
18 
19 dojo.event.connect(obj1, "twoArgFunc"
20                     obj2, "oneArgFunc");
21 
22 obj1.twoArgFunc(1,4);
23 </script>
24 </BODY>
25 </HTML>


  結(jié)果是怎樣的呢?2個(gè)連接的函數(shù)的參數(shù)相同!所以,要傳遞參數(shù)到另外一個(gè)函數(shù)中,已經(jīng)不需要我們多做什么,dojo已經(jīng)傳過去了,參數(shù)的格式不一致的話,我們只需要再包裝一下目標(biāo)函數(shù)。
  網(wǎng)上的那個(gè)例子我怎么也調(diào)試不成功,花了點(diǎn)時(shí)間,改了下,終于好了,下面是代碼:

 1 <HTML>
 2 <HEAD>
 3 <TITLE> New Document </TITLE>
 4 <script type="text/javascript" src="dojo.js"></script>
 5 
 6 </HEAD>
 7 
 8 <BODY>
 9 <script language="javascript">
10 var obj1 = {
11     twoArgFunc: function(arg1, arg2){
12         // 需要2個(gè)參數(shù)
13         alert("1: "+arg1+" "+arg2);
14     }
15 };
16 
17 var obj2 = {
18     oneArgFunc: function(arg1){
19         //只需要一個(gè)數(shù)組作為參數(shù)
20         alert("2: "+arg1);        
21     }
22 };
23 
24 function aroundFunc(invocation){
25     var tmpArgs = [ 
26                     invocation.args[0],
27                     invocation.args[1]
28                   ];
29     invocation.args = [tmpArgs];
30     return invocation.proceed();
31 }
32 
33 // after-around advice
34 dojo.event.connect("after",obj1, "twoArgFunc",obj2, "oneArgFunc","aroundFunc");
35 
36 //也可以寫成下面2句
37 //dojo.event.connect(obj1, "twoArgFunc",obj2, "oneArgFunc");
38 //dojo.event.connect("around",obj2,"oneArgFunc","aroundFunc");
39 
40 obj1.twoArgFunc(1,4);
41 </script>
42 </BODY>
43 </HTML>
44 


  要注意的是,34行的after不能少,少了就觸發(fā)不了了,照道理默認(rèn)就是after的啊,具體可能是dojo內(nèi)部問題吧。
   接下來介紹匿名通信。
   對象之間,不可能總是互相可見的,可能要連接的對象不是同時(shí)產(chǎn)生的,也就是說,異步產(chǎn)生,這樣的話,用connect()就不是那么方便了,什么時(shí)候 connect(),就是個(gè)問題了。dojo中,"Topics to the rescue!",dojo是利用topic機(jī)制來解決的??聪旅娴拇a

 1 var exampleObj = {
 2     counter: 0,
 3     foo: function(){ 
 4         alert("foo");
 5         this.counter++;
 6     },
 7     bar: function(){
 8         alert("bar");
 9         this.counter++;
10     }
11 };
12 
13 // previously we used this connect syntax
14 //
15 //  dojo.event.connect(exampleObj, "foo", exampleObj, "bar");
16 //
17 // which we now replace with:
18 
19 // set up our publisher
20 dojo.event.topic.registerPublisher("/example", exampleObj, "foo");
21 
22 // and at some point later, register our listener
23 dojo.event.topic.subscribe("/example", exampleObj, "bar");
24 
25 


  由上面可以看到,連接是分步進(jìn)行的。在前面說明,要連接一個(gè)對象,具體是哪個(gè),它可以不用知道,后面,可以指定一個(gè)連接對象,這樣,2個(gè)連接的對象,不知道對方是誰,因?yàn)樗鼈兪峭ㄟ^發(fā)布/訂閱機(jī)制通信,是通過中轉(zhuǎn)的。這么做有什么好處?不用我說了吧。這就是匿名通信。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

3、異步通信
    既然dojo是ajax的一個(gè)框架,那異步通信是必不可少的,否則叫什么ajax。dojo中,這一部分是在dojo.io包中的。
  先看看這一段:
 1 // an asynchronous request to foo.php that returns a JavaScript literal
 2 // which is eval()‘d
 3 var bindArgs = {
 4     url:        "foo.php",
 5     mimetype:   "text/javascript",
 6     error:      function(type, errObj){
 7         // handle error here
 8     },
 9     load:      function(type, data, evt){
10         // handle successful response here
11     }
12 };
13 
14 // dispatch the request
15 var requestObj = dojo.io.bind(bindArgs);
16 
17 
18 //當(dāng)然,可以寫成
19 //dojo.io.bind({
20 //    url:        "t4.htm",
21 //    mimetype:   "text/javascript",
22 //    error:      function(type, errObj){
23 //        // handle error here
24 //    },
25 //    load:      function(type, data, evt){
26 //        // handle successful response here
27 //    }});
28 

  dojo.io.bind(requestObject)方法中,只有一個(gè)參數(shù),就是請求對象,請求對象可以是dojo.io.Request,也可以是指明了dojo.io.Request基本屬性的一個(gè)匿名對象。在上面的代碼中,我們沒有new一個(gè)dojo.io.Request對象,所以使用的是匿名對象,在應(yīng)用中,常用的是匿名對象。
  由上面的匿名對象的代碼,可以看到dojo.io.Request對象有2個(gè)屬性和2個(gè)方法:
 ?。保?url",表示被請求的資源地址。
 ?。玻?mimetype",回應(yīng)內(nèi)容類型,默認(rèn)是"text/plain",注意與http傳輸時(shí)的mimetype區(qū)別,當(dāng)mimetype為"text/javascript"時(shí),表示請求javascript腳本并執(zhí)行。
 ?。常?error"方法,表示請求失敗時(shí)的處理。
 ?。矗?load"方法,請求成功后的操作。
  dojo.io.Request對象sync屬性默認(rèn)為false,也就是說不同步(就是異步了),發(fā)出請求后,可繼續(xù)后續(xù)操作,就是所謂的異步操作了。一旦該項(xiàng)取值為true,發(fā)出請求,則必須等待請求處理完畢,才能繼續(xù)后續(xù)操作,否則將一直阻塞操作。
  上面的代碼沒有指定sync屬性,就是說其為默認(rèn)值false,所以是異步執(zhí)行的。

  dojo.io.Request對象還有幾個(gè)屬性,介紹如下:
  method:相信form用多的人都不會(huì)陌生,對了,就是和它一個(gè)意思,取值為"POST"或"GET",默認(rèn)取值為"GET"。
  formNode:一個(gè)DOM節(jié)點(diǎn),指定一個(gè)form將被此次請求提交,其將繼承上面的url和method屬性,若前面沒給method屬性賦值,則取該form的method屬性。該屬性取值如document.getElementById("form1")。
  content:鍵/值對,將被加在參數(shù)里被傳輸,相當(dāng)于http傳輸方式中g(shù)et和post的數(shù)據(jù)。
  transport: 指明此次傳輸所用的傳輸對象,一旦指定的傳輸對象不可用,則此次請求將失敗,同時(shí)觸發(fā)error事件。若不指定,bind()方法將試圖從已經(jīng)注冊的傳輸 對象列表中查找最合適的可用的傳輸對象來執(zhí)行請求。如要確認(rèn)用XMLHttp來執(zhí)行請求,則需指定:transport: "XMLHTTPTransport"。下面是bind()試圖查找最合適的傳輸對象的代碼部分:
1 for(var x=0; x<dojo.io.transports.length; x++)
2 {
3     var tmp = dojo.io.transports[x];
4     if((this[tmp])&&(this[tmp].canHandlerequest)))
5     {
6         tsName = tmp;
7     }
8 }

  changeUrl: 請求完成后,發(fā)出請求的頁面是否將跳轉(zhuǎn)到某錨點(diǎn)。雖然官方文檔解釋的時(shí)候說是boolean類型,默認(rèn)為false,但是該項(xiàng)也可以是自定義的字符串,就 是要跳轉(zhuǎn)到的錨點(diǎn)名稱。當(dāng)該項(xiàng)為true時(shí),錨點(diǎn)名稱將根據(jù)當(dāng)前時(shí)間生成,具體有什么用處我也不清楚。但是我們可以通過指定錨點(diǎn)名稱,來跳轉(zhuǎn)到我們希望的 錨點(diǎn)。要注意的是,不管請求處理成功與否,都會(huì)發(fā)生跳轉(zhuǎn)。官網(wǎng)文檔中,說在Mozilla/Firefox中,URL改變將失敗,也就有了這句"This may be removed in the future as it pertains exclusively to in-browser HTTP transports.",將來將被去掉,因?yàn)榕c傳輸對象的結(jié)合太專有。例子如下:若該項(xiàng)為true,則跳轉(zhuǎn)地址可能將變?yōu)?a aa",則地址將為http://192.168.0.168/t3.htm#aa。
  useCache: 布爾類型,默認(rèn)為false,表示是否將此次請求的結(jié)果緩存,以后直接從緩存中獲取此次請求的結(jié)果。一旦該項(xiàng)為true后,則發(fā)出的請求若為以前發(fā)過的, 直接從緩存中讀取結(jié)果。我們可以在bind()執(zhí)行后,在立刻alert一個(gè)東西,當(dāng)然,要異步執(zhí)行的。在發(fā)出新請求的時(shí)候,后面的alert是先執(zhí)行 的,然后執(zhí)行請求結(jié)果。再發(fā)出一樣的請求后,由于結(jié)果在緩存中,所以直接取請求結(jié)果,從而我們會(huì)看到alert是在執(zhí)行完結(jié)果后,再執(zhí)行的。
  bindSuccess:布爾類型,默認(rèn)為false,指明請求是否可以被其它傳輸對象接受并執(zhí)行請求。具體用法我也不清楚,以后清楚的時(shí)候再補(bǔ)完這里。
  下面說說dojo.io.Request對象的幾個(gè)方法。
  上面已經(jīng)講了error()和load()方法,這里要注意這2個(gè)方法的參數(shù)。error(type, errorObject)方法有2個(gè)參數(shù),第一個(gè)參數(shù)表示處理結(jié)果,在error()中,永遠(yuǎn)是"error",第二個(gè)參數(shù)表示的是傳輸細(xì)節(jié)。load(type, data, event)有3個(gè)參數(shù),第一位也是處理結(jié)果,load()中永遠(yuǎn)取值為"load",表示處理成功,第二位表示處理成功后返回的信息,第三位表示可以處理傳輸細(xì)節(jié)的底層傳輸對象,官網(wǎng)的一個(gè)例子是:當(dāng)利用dojo.io.XMLHTTPTransport進(jìn)行傳輸?shù)臅r(shí)候,第三個(gè)參數(shù)表示的是對執(zhí)行請求的XMLHTTP對象的一個(gè)引用。
  dojo.io.Request對象中,還有2個(gè)方法。首先是handle(type, data, event), 可以用來處理所有的情況,如load()、error()和其它一些情況。當(dāng)type=="load"的時(shí)候,三個(gè)參數(shù)和load()是一樣的,當(dāng) type=="error"的時(shí)候,data就表示error()中的errorObject,而event就無效了??聪旅嬉粋€(gè)用handle()的例 子(摘自官網(wǎng)):
 1 dojo.io.bind({
 2     url: "http://foo.bar.com/sampleData.txt",
 3     handle: function(type, data, evt){
 4         if(type == "load"){
 5             // do something with the data object
 6         }else if(type == "error"){
 7             // here, "data" is our error object
 8             // respond to the error here
 9         }else{
10             // other types of events might get passed, handle them here
11         }
12     },
13     mimetype: "text/plain"
14 });


  由上面,可以很容易明白handle()的用法。
  dojo.io.Request對象中最后一個(gè)方法是abort(),字面意思理解是中止請求,是用來中斷執(zhí)行待處理的請求的。這個(gè)行為是用來執(zhí)行請求的傳輸對象所擁有的。
  在io.js中,可以找到這么一行
dojo.io.transports = [];

  由上面bind()查找最合適的可用傳輸對象的過程,我們知道,這是用來存放已注冊的傳輸對象的。這是一個(gè)數(shù)組,里面的傳輸對象將被每一個(gè)bind請求所參考,并且第一個(gè)傳輸對象接受一個(gè)特殊請求并處理它(這句由于沒找個(gè)合適的例子,理解還不夠透徹,以后補(bǔ)過)。
  dojo.io.transports有個(gè)addTransport(name)方法,是注冊一個(gè)可用來處理請求的傳輸對象,要注意的是name是要在dojo.io 命名空間中的,如我們常用的dojo.io.XMLHTTPTransport,注冊時(shí)用 dojo.io.transports.addTrasnport("XMLHTTPTransport"),在上面講dojo.io.Request對 象是也說過,要確認(rèn)用XMLHttp來執(zhí)行請求,需指定:transport: "XMLHTTPTransport",正好吻合。
  根據(jù)上面的資料,transport是可以自己寫的,然后定義自己需要的一些東西,具體要怎么寫我現(xiàn)在也不清楚,不過個(gè)人感覺正如java中的繼承那樣,能出現(xiàn)相當(dāng)誘人的結(jié)果。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

4、Dojo基礎(chǔ)

  前面說了dojo在ajax方面的一些個(gè)東西,感覺要理解透徹還有些dojo內(nèi)部的東西需要理解,所以想好好看一下dojo的東西,惡補(bǔ)一陣:-)
  看了會(huì)官方一些個(gè)文檔,有了些許體會(huì)。
  dojo.js 被包含進(jìn)來后,一些對象和函數(shù)就可以用了,在用JSEclipse編輯的時(shí)候,可以看到一些,不過是包含在dojo.js中的,官網(wǎng)說還包括 boostrap文件里的,我查了下,有bootstrap1.js和bootstrap2.js,不過那些對象直接顯示不出來,估計(jì)有什么地方要設(shè)置, 弄清楚后再補(bǔ)上來。
  可用的東東有:
 ?。保?span>dojo.render對象:該對象存放了dojo運(yùn)行環(huán)境的一些信息。
  dojo.render.name:根據(jù)dojo.render.name = navigator.appName,可以知道這是瀏覽器的名稱,但是直接顯示出來是空的,估計(jì)還沒有被賦值,運(yùn)行

1 dojo.render.name = navigator.appName;
2 alert(dojo.render.name);


我的出來的是:Microsoft Internet Explorer。
  dojo.render.os: 看名字就知道與操作系統(tǒng)有關(guān),事實(shí)確實(shí)如此。這個(gè)屬性直接打印出來是[object Object],可以知道是一個(gè)對象。查了下源代碼,發(fā)現(xiàn)這個(gè)對象有3個(gè)屬性:dojo.render.os.osx,當(dāng)操作系統(tǒng)為"MacOS"取值為 true;dojo.render.os.linux,當(dāng)操作系統(tǒng)為"Linux"的時(shí)候?yàn)閠rue;dojo.render.os.win, Windows系統(tǒng)取值為true。3個(gè)屬性的默認(rèn)值都為false,一進(jìn)dojo,則某一個(gè)屬性被賦值為true,我的Windows系統(tǒng)當(dāng)然是 dojo.render.os.win為true了。根據(jù)源碼,若不是這3種系統(tǒng),dojo.render.os.linux將賦值為true。
  dojo.render.ver,官網(wǎng)上說與dojo.version 一樣,但我一打印發(fā)現(xiàn)不對,查了下代碼,發(fā)現(xiàn)如下一段:dojo.render.ver = parseFloat(navigator.appVersion, 10),是與瀏覽器版本號有關(guān),我這里dojo.render.ver的值為4。再找dojo.version,發(fā)現(xiàn)這么一段:

dojo.version = {
    major: 
0, minor: 2, patch: 2, flag: "",
    revision: Number(
"$Rev: 2836 $".match(/[0-9]+/)[0]),
    toString: 
function() {
        
with (dojo.version) {
            
return major + "." + minor + "." + patch + flag + " (" + revision + ")";
        }
    }
};


將dojo.version打印一下,是0.2.2(2836),上面一段的結(jié)果。
  dojo.render.html,這也是一個(gè)對象,它有好幾個(gè)屬性。dojo.render.html.capable,宿主環(huán)境是否支持html,一般來說,都是true。其它幾個(gè)是與瀏覽器類型有關(guān)的,都是布爾類型。dojo.render.html.moz,當(dāng)瀏覽器為Mozilla或者M(jìn)ozilla核心的瀏覽器(例如 Firefox)時(shí)為true; dojo.render.html.safari,使用蘋果的Safari瀏覽器的時(shí)候?yàn)閠rue,dojo.render.html.ie,平常的機(jī)器這個(gè)屬性都是true,因?yàn)槲覀兓臼怯肕icrosoft Internet Explorer,即ie瀏覽器;dojo.render.html.opera,使用Opera瀏覽器的時(shí)候?yàn)閠rue;dojo.render.html.khtml,使用KHTML瀏覽器(例如Konqueror,但是我還就真沒聽過這種KHTML瀏覽器,其它的都知道,看來還是知識(shí)不夠,唉~)的時(shí)候?yàn)閠rue。dojo.render.html對象主要是用來判斷瀏覽器類型的。我的機(jī)器上dojo.render.html.ie為true。
  其它還有dojo.render.svg,dojo.render.vmldojo.render.swf,dojo.render.swt,由上面的資料,可以知道是對SVG、VML、SWF、SWT的支持,它們都有個(gè)capable屬性,表示是否支持該技術(shù),ie5.0以上版本支持VML,所以我的dojo.render.vml.capable為true,SVG需要裝插件,所以不支持該項(xiàng),dojo.render.svg.capable為false,dojo.render.swf.capable 也為false,這里的swf不是指flash的swf,而是Simple Web Framework,Simple Web Framework (SWF)是一個(gè)基于事件的web框架.它很適合于那些想要開發(fā)胖客戶端Web應(yīng)用程序但又不想轉(zhuǎn)向JSF的Struts開發(fā)人員。SWF跟Struts 一樣也是構(gòu)建在Jakarta commons基礎(chǔ)之上,但使用一個(gè)不同的request processor。SWF事件模型支持基于XmlHttpRequest的事件提交。至于dojo.render.swt,不清楚了,難道與java中的SWT有關(guān)系?這四個(gè)對象的其它屬性,在源碼中居然沒看到相應(yīng)代碼??以后弄明白再回來補(bǔ)過。
 ?。玻?span>dojo.version對象。在上面已經(jīng)講過這個(gè)對象,是dojo庫文件的版本,沒啥好研究的了。
  ?。常甦ojo.hostenv對象,個(gè)人認(rèn)為里面的東西很有看頭,不過要慢慢講來也太費(fèi)時(shí)間了,具體可以去看源碼中那幾個(gè)hostenv_XXX.js 文件,dojo.hostenv.getText函數(shù)和dojo.hostenv.println函數(shù)還有點(diǎn)意思,以后隨時(shí)補(bǔ)充吧。
  

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
dojo事件機(jī)制及壓縮
Dojo Javascript 編程規(guī)范(精)
進(jìn)程,線程,協(xié)程
python編程 FAQ
關(guān)于V8 JavaScript Engine的使用方法研究(二)
《源碼探秘 CPython》64. 裝飾器是怎么實(shí)現(xiàn)的?
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服