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