與任何技術(shù)一樣,使用Ajax在相當(dāng)多的方面都可能范錯(cuò)誤。我在這兒討論的問(wèn)題目前都缺少解決方案,并將會(huì)隨著Ajax的成熟而解決或提高。隨著開(kāi)發(fā) Ajax應(yīng)用經(jīng)驗(yàn)的不斷獲取,開(kāi)發(fā)者社區(qū)中將會(huì)出現(xiàn)最好的實(shí)踐經(jīng)驗(yàn)與指導(dǎo)方針。
1、XMLHttpRequest的有效性
Ajax開(kāi)發(fā)者面對(duì)的一個(gè)最大問(wèn)題是當(dāng)XMLHttpRequest不可用時(shí)如何反應(yīng)。雖然大部分現(xiàn)代瀏覽器支持XMLHttpRequest,但還是有少量的用戶,他們的瀏覽器不能支持,或由于瀏覽器安全設(shè)置而阻止對(duì)XMLHttpRequest的使用。若你的Web應(yīng)用發(fā)布于公司內(nèi)部的 Intranet上,你很可能可以指定支持哪種瀏覽器,并可以確保XMLHttpRequest是可用的。若你在公共WEB上發(fā)布,則你必須意識(shí)到由于假定XMLHttpRequest是可用的,所有就阻止了老瀏覽器、手持設(shè)備瀏覽器等等用戶來(lái)使用你的系統(tǒng)。
然而,你應(yīng)該盡力保證應(yīng)用系統(tǒng)“正常降級(jí)”使用,在系統(tǒng)中保留適用于不支持XMLHttpRequest的瀏覽器的功能。在購(gòu)物車?yán)又校詈玫姆椒ㄊ怯幸粋€(gè)Add to Cart按鈕,可以進(jìn)行常規(guī)的提交處理,并刷新頁(yè)面來(lái)反映購(gòu)物車狀態(tài)的變化。Ajax行衛(wèi)可以在頁(yè)面被載入時(shí)通過(guò)JavaScript添加到頁(yè)面中,只在 XMLHttpRequest可用的情況下,為每個(gè)Add to Cart按鈕加上JavaScript處理函數(shù)。另一個(gè)方法是在用戶登錄時(shí)檢測(cè)XMLHttpRequest,再?zèng)Q定是提供Ajax版本還是常規(guī)基于 form提交的版本。
2、可用性考慮
圍繞著Ajax應(yīng)用的大部分問(wèn)題都是很普通的問(wèn)題。例如,讓用戶知道他們的輸入已經(jīng)被注冊(cè)并處理,是很重要的,因?yàn)樵赬MLHttpRequest處理過(guò)程中并不能提供通常的漏斗旋轉(zhuǎn)光標(biāo)。一種方法是將“確認(rèn)”按扭上的文本替換為“正在更新中…”,以避免用戶在等待響應(yīng)時(shí)多次點(diǎn)擊按鈕。
另一個(gè)問(wèn)題是,用戶可能沒(méi)有注意到他們正在觀看的頁(yè)面已經(jīng)被更新。可以通過(guò)使用各種視覺(jué)技巧來(lái)將用戶的眼光吸引到頁(yè)面的更新區(qū)域。還有一個(gè)問(wèn)題是通過(guò) Ajax更新頁(yè)面打斷了瀏覽器“退回前頁(yè)”按鈕的正常工作,地址欄中的URL不能反映頁(yè)面的全部狀態(tài),并且不能使用書(shū)簽功能。參見(jiàn)Resource章節(jié)中列出的網(wǎng)站地址上的文章來(lái)了解更多Ajax應(yīng)用關(guān)于可用性方面的問(wèn)題。
3、服務(wù)器負(fù)載
使用Ajax界面代替?zhèn)鹘y(tǒng)的基于form的界面可能戲劇性地增加傳遞到服務(wù)器的請(qǐng)求數(shù)量。例如,一個(gè)普通的Google搜索給服務(wù)器造成一次命中,并在用戶確認(rèn)搜索表單時(shí)發(fā)生。然而,Google Suggest,將會(huì)試圖自動(dòng)完成你的搜索詞,在用戶打字時(shí)將會(huì)往服務(wù)器發(fā)送多個(gè)請(qǐng)求。在開(kāi)發(fā)一個(gè)Ajax應(yīng)用時(shí),要注意到你將會(huì)發(fā)送多少請(qǐng)求到用戶器端,以及服務(wù)器的負(fù)載指標(biāo)。你可以通過(guò)在客戶端適當(dāng)?shù)鼐彺嬲?qǐng)求、與服務(wù)器響應(yīng)來(lái)緩減負(fù)載壓力。你也應(yīng)該在設(shè)計(jì)Ajax應(yīng)用時(shí)盡量在客戶端處理更多的邏輯,而不用與服務(wù)器端通訊。
4、處理異步
一定要記住,沒(méi)有任何東西可以保證XMLHttpRequest將會(huì)按照它們被發(fā)送的順序來(lái)依次結(jié)束。實(shí)際上,你在設(shè)計(jì)系統(tǒng)時(shí),腦子里應(yīng)該始終假定它們不會(huì)按原來(lái)順序結(jié)束。在購(gòu)物車?yán)又校褂昧艘粋€(gè)最后更新的時(shí)間戳來(lái)保證最新的數(shù)據(jù)不會(huì)被改寫(xiě)。這個(gè)非常基本的方法可以在購(gòu)物車場(chǎng)景中工作,但可能不能在其它情況下工作。在設(shè)計(jì)時(shí)刻就要考慮你該如何處理異步服務(wù)器響應(yīng)。
結(jié)論
你現(xiàn)在應(yīng)該對(duì)于Ajax的基本原則有了一個(gè)良好的了解,另外,你應(yīng)該理解一些更高級(jí)的隨Ajax方法而來(lái)的設(shè)計(jì)問(wèn)題。創(chuàng)建一個(gè)成功的Ajax應(yīng)用需要一系列的方法—從JavaScript UI設(shè)計(jì)到服務(wù)器端架構(gòu)—但是你現(xiàn)在應(yīng)該已經(jīng)具備了需要使用到的Ajax核心知識(shí)。