警惕AJAX應(yīng)用開發(fā)中的輕罪和死罪
——
乍看之下,具備一些常識似乎就能夠避免這些缺陷,在某種程度上來看,的確如此。但是從AJAX 應(yīng)用的DHTML起源來看,AJAX應(yīng)用中充滿了結(jié)構(gòu)性的差異。無論您在應(yīng)用開發(fā)工作中掌握了多少常識,學(xué)習(xí)前人的教訓(xùn)都是有好處的。我們將這些錯誤稱為我們的“七宗死罪”,但是這些錯誤并不能代表全部的錯誤。
事實上,在您犯下任何一宗死罪之前,您都可能首先犯了一些較為輕微的錯誤。因此,我們首先從這里著手。以下是每個人都可能會犯的一些錯誤,這些錯誤是如此常見,只要用Google搜索一下,就能找到大不部分的錯誤。
七宗輕罪
1.濫用后退鍵-這是每個人都會犯的錯誤。后退鍵在很多種Web應(yīng)用中已然成為用戶的期望。很多AJAX開發(fā)新手在開發(fā)AJAX應(yīng)用時,出于多種原因都會使用后退鍵。首先,JavaScript對于它來說不是最友好的語言;其次,AJAX 設(shè)計需要一種全新的思考分析。
對于AJAX新手來說很難接受“后退”不是最好選擇的思路?!昂笸恕笔歉马撁鏁r,或是在特定情況下進行“撤消”時才需要的功能。在您進行編碼時就要認識到,否則您最后可能會重復(fù)做功。
2.忘記告訴用戶當前發(fā)生的狀況-AJAX的工作原理中一部分就是它不使用通常的網(wǎng)頁用戶界面加載程序。因此,您需要設(shè)計一些可視的提示,使用戶能夠了解正在發(fā)生的狀況。
3.忘記鏈接-這也是標準的AJAX錯誤:漏做了外部用戶能夠剪切和粘貼的URL鏈接。我們都曾經(jīng)復(fù)制過某個URL鏈接然后將其發(fā)送給別人。在我們使用AJAX時,只有采用純手工輸入的方式才能把鏈接提供給他人。為什么?因為在AJAX應(yīng)用中,服務(wù)器不提供在JavaScript自動生成的這個頁面。不要忽視您的用戶可能感興趣的這項在網(wǎng)絡(luò)應(yīng)用中最為常見的功能。請花點時間為用戶提供URL地址,因為服務(wù)器并不提供。
4.用內(nèi)容控制替代頁面控制-如果您在尋求動態(tài)的內(nèi)容控制,那么AJAX應(yīng)用對傳統(tǒng)的客戶端服務(wù)器交互方式的突破對您來說可算一份大禮。但是,這樣同時也會招來禍端:在重寫頁面上某精確位置上的內(nèi)容以調(diào)整用戶的交互體驗時的確能夠進行很好的控制,但是這可能將使您的頁面不再完整。
在很多情況下,我們專注于處理頁面的某個部分,會忘記服務(wù)器不會刷新頁面。這樣可能導(dǎo)致頁面零亂,使用戶體驗降低:當他們查看頁面時看的可能是過時的頁面。請關(guān)注整個頁面;確保任何出現(xiàn)動態(tài)內(nèi)容的頁面都得到更新。
5.累死蜘蛛-AJAX的優(yōu)勢在于無需重裝就可以提供給頁面的大量文本;AJAX的缺陷也在于那些無需重裝就可以提供給頁面的大量文本。如果應(yīng)用被設(shè)計為對搜索引擎友好,那么您應(yīng)該能夠想到會出現(xiàn)什么狀況。無論頁面中出現(xiàn)了什么情況,請務(wù)必在最上面植入大量穩(wěn)定的文本,讓蜘蛛們?nèi)ネ姘伞?
6.導(dǎo)致亂碼文本-AJAX不能支持多種字符集。這并不是什么涉及生死的局限性,但是如果忘記這點可能會導(dǎo)致真正的問題發(fā)生。最基本的字符集是UTF-8。無論JavaScript發(fā)送的是什么字符集,請不要忘了正確編碼,并根據(jù)內(nèi)容設(shè)置服務(wù)器端的字符集?! ?
7.沒有為使用不支持JavaScript的瀏覽器的用戶提供提示。有些瀏覽器不支持JavaScript,這些用戶一時不能明白出了什么狀況。請給他們一些提示。
以上都是一些很容易發(fā)現(xiàn)的錯誤。真正的問題都是容易被人忽視的?! ?
AJAX七宗死罪
1.造成內(nèi)存泄露-任何長期從事開發(fā)工作的人都知道什么是循環(huán)引用,并了解循環(huán)引用給內(nèi)存管理帶來的危害。AJAX 所使用的JavaScript是一種內(nèi)存管理語言。也就是說JavaScript具有內(nèi)置的信息包收集功能,因此能夠抽取不再有引用路徑使用的變量并重新分配這些變量所使用的內(nèi)存。
作為基本工作原理來說,這樣并無不妥;但是在模型層對象與查看元素之間互相引用時,由于這些循環(huán)引用,您就不能依靠這個功能來實現(xiàn)內(nèi)存使用的最優(yōu)化。從原則上來說,對象為零,則元素為零。但是如果這是從元素到對象的向后引用,那么信息包搜集器不會動這些對象。
現(xiàn)在,問題出來了:在文件對象模型中,任何文件樹中的DOM節(jié)點都可能被樹中存在的其他元素引用,而無論其是否被其他對象所引用!因此,任何在信息包收集器中經(jīng)過標注的被DOM節(jié)點向后引用的對象在這一方向上都必須為零,否則它的內(nèi)存就會一直處于已分配狀態(tài)。
2.不了解“異步”的含義-異步這個詞很容易讓不熟悉它的用戶感到緊張。但是如果您為這些用戶所設(shè)計的網(wǎng)頁應(yīng)用屬于桌面應(yīng)用,那么他們肯定不會感到不安。這是一個致關(guān)重要的設(shè)計點。大部分網(wǎng)頁應(yīng)用功能與桌面副本非常類似。但是在網(wǎng)頁應(yīng)用中,用戶期望這種虛幻的特征導(dǎo)致他們截然不同。
用戶在與網(wǎng)頁瀏覽器打交道時會帶有非常不同的偏見和期望,而對于桌面應(yīng)用中他們并沒有這樣的行為。因此,盡管頁面與服務(wù)器之間頻繁的響應(yīng)會非常好,非常高效,頁面能夠同時對自身進行修訂,但是這將會使用戶頭暈眼花。因此,您需要遵守兩條守則,要考慮到進入用戶視覺范圍內(nèi)的每個變化:如果對于用戶來說不是很迫切的更新,那么要使升級更為溫和,不會轉(zhuǎn)移;如果更新對于用戶與應(yīng)用的交互非常重要,那么更新要清楚而明顯。
3.使服務(wù)器變成瞎子-用戶端與服務(wù)器交流的減少是一大問題,而以前并非如此。在以前,服務(wù)器端的應(yīng)用了解全部情況并且能夠看到全部狀況:每個例外,每次重新加載,每個事件多能被看到并記錄下來,當然服務(wù)器也道到底客戶端是什么狀況,因為服務(wù)器會記錄下屏幕上顯示的一起。
在AJAX應(yīng)用中可不是這樣。當有事件發(fā)生時,這些事件是與服務(wù)器相互獨立的,也就是說,當客戶端出現(xiàn)問題時,服務(wù)器端并不會馬上知道。在某個位置發(fā)現(xiàn)和記錄客戶端發(fā)生的事件以及例外,使服務(wù)器能夠追蹤需要干涉的問題
4.用GET偷懶-GET的作用是找回數(shù)據(jù);POST的作用是對GET進行設(shè)置。不要在不適當?shù)臅r候使用GET,即使你認為這樣做沒有危害也不要嘗試。GET的動作會改變狀態(tài),會改變狀態(tài)的鏈接會使用戶感到困惑;大部分都認為鏈接的作用是導(dǎo)航,而不是功能。
5.數(shù)據(jù)類型不兼容-JavaScript并非.NET 框架中的一部分。盡管這有點讓人傷心,但是它的確為我們展示了一個我們可能會碰到的問題:確認JavaScript能夠理解其運行平臺上的數(shù)據(jù)類型,反之,對于.NET或其它也是如此。可能會有多種轉(zhuǎn)換,您需要一一進行。例如,Ajax .NET Pro 資料庫提供能夠轉(zhuǎn)換.NET和JavaScript對象符號的轉(zhuǎn)換器。
6.有些應(yīng)用不知何時應(yīng)該關(guān)閉-無需刷新頁面的內(nèi)容動態(tài)生成如果沒有關(guān)閉時間將會非常糟糕。How many Web pages hav你見過多少比美國國會議事錄還長的網(wǎng)頁?如果網(wǎng)頁無限延長無疑會是用戶的噩夢,只要想想用戶會怎么看待永不停止的應(yīng)用就知道了。讓您的網(wǎng)絡(luò)應(yīng)用具有動態(tài),但是一定要在可行的限度之內(nèi)。
7.JavaScript和DOM相互獨立-請記住AJAX是建立在“模型-視覺-控制器”(Model-View-Controller)結(jié)構(gòu)之上,請認真對待這點。JavaScript屬于模型層,DOM屬于視覺層,而控制器是銜接他們的婚姻顧問。請確保您的網(wǎng)絡(luò)文件獨立于JavaScript之外(這樣對于不支持JavaScript的用戶比較有用) – 除非內(nèi)容自身只在用戶使用JavaScript才有意義。在這種情況下,用JavaScript來創(chuàng)建內(nèi)容。
評論