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