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