Dojo的庫(kù)定義使用了模塊,就像JAVA一樣。這樣可以讓你只引用自己需要的部分,而不是全部,保證了瀏覽速度。
例如Dojo的event包定義在模塊dojo.event中。
(譯者注:此部分原著甚是啰嗦,我給精簡(jiǎn)了一下,有興趣的朋友可以參見(jiàn)原文。)
引用模塊格式:
dojo.require("dojo.module[.sub module]");
例如我們想引用lite effects systems,
dojo.require("dojo.lfx");
這會(huì)引入所有l(wèi)fx下的子模塊,當(dāng)然你也可以使用dojo.lfx.*,如果想單獨(dú)引用lfx下的toggle模塊:
dojo.require("dojo.lfx.toggle");
什么是widget呢?一個(gè)按鈕 ,一個(gè)圖片,這都是widget,最常見(jiàn)的html widget有鏈接,按鈕,輸入框。
使用Dojo可以改變widget ,例如在日期輸入框旁邊加上一個(gè)彩色日歷,讓用戶可以選擇日期,與此同時(shí)Dojo并不會(huì)破壞你原始的輸入框,因?yàn)镈ojo是擴(kuò)展了你的html而不是替換了它。
使用widget的優(yōu)勢(shì)主要三點(diǎn):
- 跨平臺(tái):使用Dojo widget,無(wú)論使用任何瀏覽器,都會(huì)準(zhǔn)確的得到正確效果。
- 自動(dòng)退化:一些老瀏覽器可能對(duì)javascript支持并不是那么完美,Dojo也可以讓它們顯示出正確的內(nèi)容,例如前面彩色日歷的例子,如果瀏覽器不支持,那么Dojo會(huì)自動(dòng)將日歷退化到一個(gè)簡(jiǎn)單的選擇框,或者其他(根據(jù)不同widget而定)。
- 擴(kuò)展性:你可以利用Dojo提供的widget創(chuàng)造出新的widget,在這個(gè)過(guò)程中你并不需要從庫(kù)中復(fù)制任何代碼或者修改庫(kù)中的代碼。
如何使用Widget
Widget有很多使用方法。Widget會(huì)搜索整個(gè)網(wǎng)頁(yè)框架,然后自動(dòng)把應(yīng)該添加的內(nèi)容加入到當(dāng)中。
下面是個(gè)簡(jiǎn)單的例子,我們也可以看出WIdget是怎樣自動(dòng)退化的,因?yàn)槲覀儾](méi)有給ComboBox定義選擇項(xiàng),而只是一個(gè)value,而且所以最后顯示出來(lái)的只象是一個(gè)簡(jiǎn)單的inputbox,如果用戶禁用了javascript,顯示結(jié)果也會(huì)一樣。
<input dojoType="ComboBox" value="default" dataUrl="comboBoxData.js">
但是如果我們只想使用W3C標(biāo)準(zhǔn)(譯者注:沒(méi)有那些額外的tag,例如dojoType),我們可以用下面的方法。
<input class="dojo-ComboBox?" value="default" dataUrl="comboBoxData.js">
<dojo:ComboBox? value="default" dataUrl="comboBoxData.js">
你可能注意到了dataUrl,他的作用是把comboBoxData.js中的內(nèi)容加到comboBox中,但是現(xiàn)在comboBoxData.js中沒(méi)用任何內(nèi)容。(譯者注:當(dāng)然你可以隨意改變dataUrl的內(nèi)容,名字不是固定的。)
下面是一個(gè)select的例子:
<select dojoType="combobox">
<option value="foo">foo</option>
<option value="bar">bar</option>
<option value="baz">baz</option>
<option value="thud">thud</option>
</select>
從上面的例子中,你知道了很多事情,但卻好像沒(méi)什么用處,這里只是想告訴你其實(shí)dojo并沒(méi)有那么復(fù)雜。
動(dòng)態(tài)網(wǎng)頁(yè)程序(dynamic web application)避免了頻繁的刷新頁(yè)面,不過(guò)通常也帶來(lái)后退和前進(jìn)按鈕會(huì)失去作用。更多的,有的時(shí)候,用戶可能很難把網(wǎng)頁(yè)加入收藏夾。
Dojo提供了一個(gè)解決辦法,讓網(wǎng)頁(yè)程序處理瀏覽器的后退和前進(jìn),并且提供給瀏覽器一個(gè)唯一的地址。這個(gè)解決辦法就是使用dojo.undo.browser。
使用dojo.undo.browser
在dojo 0.2.2版本中,并沒(méi)有dojo.undo.browser,這是在0.3以后的版本中才加入的。
首先,需要使用dojo.undo.browser.setInitialStae(state)設(shè)定當(dāng)瀏覽器第一次載入網(wǎng)頁(yè)的狀態(tài)。
理論
動(dòng)態(tài)網(wǎng)頁(yè)程序會(huì)調(diào)用XMLHTTPRequest和DOM來(lái)更新網(wǎng)頁(yè)內(nèi)容而避免了刷新,更新瀏覽歷史,并且也不會(huì)改變?yōu)g覽器的地址欄。這就意味著當(dāng)用戶點(diǎn)擊了后退按鈕,整個(gè)網(wǎng)頁(yè)程序丟失了當(dāng)前運(yùn)行的狀態(tài)(state)。而且即使用戶想把當(dāng)前的網(wǎng)頁(yè)內(nèi)容加入收藏夾,也是不可能的,因?yàn)槭詹貖A不會(huì)記錄網(wǎng)頁(yè)程序運(yùn)行的狀態(tài),而只會(huì)簡(jiǎn)單的記錄下網(wǎng)頁(yè)程序的地址(URL)。
開(kāi)發(fā)者可以使用dojo.undo.browser包得到用戶點(diǎn)擊后退和前進(jìn)的事件(event),然后根據(jù)這些事件來(lái)更新頁(yè)面內(nèi)容。 dojo.undo.browser通過(guò)使用一個(gè)隱藏的表單(hidden IFRAME)或者一個(gè)唯一的標(biāo)簽(fragment identifier)傳遞瀏覽的歷史記錄。(譯者注:可以想像成一個(gè)cookie或者一個(gè)session,但是這個(gè)session信息是存儲(chǔ)在hidden IFRAME或者標(biāo)簽中) 例如:
http://some./my/path/to/page.html#fragmentIdentifier
(譯者注:#fragmentIdentifier就是標(biāo)簽記錄)
因?yàn)楫?dāng)改變標(biāo)簽的時(shí)候并不會(huì)使網(wǎng)頁(yè)刷新,所以非常適合記錄當(dāng)前網(wǎng)頁(yè)程序的狀態(tài)。當(dāng)然開(kāi)發(fā)者可以自定義一個(gè)更容易讀懂的標(biāo)簽,并且使用戶可以把它加入收藏夾。
dojo.undo.browser允許開(kāi)發(fā)者創(chuàng)建一個(gè)相對(duì)于運(yùn)行狀態(tài)的對(duì)象(state object),這個(gè)對(duì)象會(huì)得到回叫(callback)當(dāng)用戶點(diǎn)擊后退或者前進(jìn)按鈕。
開(kāi)發(fā)
下面是使用dojo.undo.browser之前必須作的一些事情:
1:在djConfig中設(shè)置preventBackButtonFix: false。這樣保證了隱藏的表單(hidden IFRAME)將會(huì)添加到頁(yè)面當(dāng)中,如果不加入這段,dojo.undo.browser不會(huì)正常工作。
譯者注:設(shè)置方法就是在header中加入如下代碼:
<script language="JavaScript" type="text/javascript">
djConfig = { isDebug: true, preventBackButtonFix: false };
</script>
2: 加入dojo.require("dojo.undo.browser");
設(shè)定網(wǎng)頁(yè)程序的初始狀態(tài):
dojo.undo.browser.setInitialState(state);
當(dāng)用戶每次點(diǎn)擊前進(jìn)或者后退,state對(duì)象都會(huì)被調(diào)用。
然后我們需要給state對(duì)象創(chuàng)建幾個(gè)方法(function)
- 得到后退提示:back(),backButtion()或者handle(type),type可以是“back”或者是“forward”。
- 得到前進(jìn)提示:forward(),forwardButton()或者handle(type),type如上。
下面是個(gè)簡(jiǎn)單的例子:
var state = {
back: function() { alert("Back was clicked!"); },
forward: function() { alert("Forward was clicked!"); }
};
注冊(cè)一個(gè)state對(duì)象使用下面的方法:
dojo.undo.browser.addToHistory(state);
如果向改變?yōu)g覽器的地址(URL),引用state對(duì)象的changeUrl屬性。如果changeUrl是true,dojo.undo.browser 就將產(chǎn)生一個(gè)唯一的標(biāo)簽,如果changeUrl被定義為任何其他的值(不包括undefined,null,0和空string),那么這個(gè)值就會(huì)被使用為標(biāo)簽。這樣用戶就可以把當(dāng)前頁(yè)加入收藏夾了。
提示