謹慎!使用AJAX技術的七個易忽視的錯誤

最近大家都搶着進入AJAX的行列。因爲這個技術讓你可以製造更快、更有效率、同時更爲動態的程序。然而它本身也有一些問題。

  起初,這些問題多少可以透過簡單的常識來避免。但AJAX程序與它的前身DHTML之間,還是充滿許多結構上的不同。

  不管你對佈署應用程序有多少知識,還是需要不斷從發生過的錯誤中學習。我們把這些錯誤稱爲七個原罪,然而它不是這篇文章的全部內容。

  因爲在你犯下任何一項嚴重錯誤之前,很可能就會先犯幾個較輕的錯誤。

  所以我們從這些每個人都會犯的較輕錯誤開始講起。這些錯誤十分常見,你只要隨便上Google搜尋就可以找到大部分的錯誤。

  七項輕罪

  上一頁按鈕的誤用-這是每個人都可能犯的錯。上一頁按鈕已經變在用戶在各類網頁應用上都期待要有的東西。許多AJAX的新手會從AJAX設計程序上直接拖拉一個上一頁按鈕到程序裏,結果是不能用。這有幾個原因。首先,JavaScript並不是十分適合這樣作的程序語言;其次,AJAX的設計思維比較新。

  AJAX開發新手不見得都瞭解到,使用「上頁」按鈕不見得最好。「上一頁」是你在更新頁面,或要在事件上進行「復原」動作時需要的功能。在你寫之前請先徹底思考過,否則恐怕就要重寫一次。

  不告訴使用者發生什麼事-AJAX的好處之一是它在加載時不使用傳統的網頁用戶界面。所以你必須額外設計一些視覺指示,讓用戶知道發生了什麼事。

  忽略連結-這是另個AJAX可能發生的標準錯誤:忽略可以被拷貝貼在程序之外的網址。你自己應該也常複製網頁上的網址然後寄給別人吧?當你使用AJAX技術時,讓使用者可以剪貼網址的唯一辦法就是手動提供這個功能。爲什麼呢?因爲在一個AJAX程序裏,服務器不提供網頁: 網頁由JavaScript動態產生!所以請不要忽略使用者的潛在需要,因爲對一般網頁來說這是最常見的功能。請自己花力氣提供網址,因爲服務器不會作這件事。

  使用內容控制來取代頁面控制-如果你希望提供動態的內容控制,那AJAX打破傳統的客戶-伺服端架構是一個絕佳的功能。但它同時也會是個詛咒:重寫頁面的特定區域,來調整用戶的互動模式,絕對有所幫助,但這也讓你見樹不見林。

  我們往往會關注於網頁特定的區塊,而忘記整個網頁不會隨之被服務器更新。在屏幕上陳舊的信息可能會讓網頁四分五裂,或讓使用者困惑。請把你的注意放在整個頁面上;並確定任何動態內容的改變,能讓使用者看到的部分都有被更新。

  把spider拒於門外-AJAX的好處是,你可以在不需要重新讀取的情況下,把一大堆文字貼到頁面上。而這同時也是它的壞處。如果這個應用希望兼容於搜索引擎--呃,結果會怎樣你可以自己想象。不管這個網頁怎麼變化更動,請放幾個固定的文字在網頁上方,讓搜索引擎的spider可以處理。

  產生亂碼-AJAX支持的字符碼並不多。這雖然不是極關重要,但忘記這件事的確會造成問題。程序基本的字符組是UTF-8。不管JavaScript傳送什麼,請不要忘記將其正確編碼,同時記得在服務器端設定內容的編碼。

  讓不支持JavaScript的使用者無所適從-市面上有些瀏覽器不支持JavaScript,但使用這些瀏覽器的人不會知道這代表什麼意思。請記得要提供信息給這些用戶。

  老實說大多時候這些是常識問題。但問題的發生往往是在情況沒那麼顯而易見的時候。

AJAX bandwagon是個好去處。它能爲您提供更快捷高效,動態更強的應用。但是它也有自己的缺陷。

  乍看之下,具備一些常識似乎就能夠避免這些缺陷,在某種程度上來看,的確如此。但是從AJAX 應用的DHTML起源來看,AJAX應用中充滿了結構性的差異。無論您在應用開發工作中掌握了多少常識,學習前人的教訓都是有好處的。我們將這些錯誤稱爲我們的“七宗死罪”,但是這些錯誤並不能代表全部的錯誤。

  事實上,在您犯下任何一宗死罪之前,您都可能首先犯了一些較爲輕微的錯誤。因此,我們首先從這裏着手。以下是每個人都可能會犯的一些錯誤,這些錯誤是如此常見,只要用Google搜索一下,就能找到大不部分的錯誤。

  七宗輕罪

  1.濫用後退鍵-這是每個人都會犯的錯誤。後退鍵在很多種Web應用中已然成爲用戶的期望。很多AJAX開發新手在開發AJAX應用時,出於多種原因都會使用後退鍵。首先,JavaScript對於它來說不是最友好的語言;其次,AJAX 設計需要一種全新的思考分析。

  對於AJAX新手來說很難接受“後退”不是最好選擇的思路。“後退”是更新頁面時,或是在特定情況下進行“撤消”時才需要的功能。在您進行編碼時就要認識到,否則您最後可能會重複做功。

  2.忘記告訴用戶當前發生的狀況-AJAX的工作原理中一部分就是它不使用通常的網頁用戶界面加載程序。因此,您需要設計一些可視的提示,使用戶能夠了解正在發生的狀況。

  3.忘記鏈接-這也是標準的AJAX錯誤:漏做了外部用戶能夠剪切和粘貼的URL鏈接。我們都曾經複製過某個URL鏈接然後將其發送給別人。在我們使用AJAX時,只有採用純手工輸入的方式才能把鏈接提供給他人。爲什麼?因爲在AJAX應用中,服務器不提供在JavaScript自動生成的這個頁面。不要忽視您的用戶可能感興趣的這項在網絡應用中最爲常見的功能。請花點時間爲用戶提供URL地址,因爲服務器並不提供。

  4.用內容控制替代頁面控制-如果您在尋求動態的內容控制,那麼AJAX應用對傳統的客戶端服務器交互方式的突破對您來說可算一份大禮。但是,這樣同時也會招來禍端:在重寫頁面上某精確位置上的內容以調整用戶的交互體驗時的確能夠進行很好的控制,但是這可能將使您的頁面不再完整。

  在很多情況下,我們專注於處理頁面的某個部分,會忘記服務器不會刷新頁面。這樣可能導致頁面零亂,使用戶體驗降低:當他們查看頁面時看的可能是過時的頁面。請關注整個頁面;確保任何出現動態內容的頁面都得到更新。

  5.累死蜘蛛-AJAX的優勢在於無需重裝就可以提供給頁面的大量文本;AJAX的缺陷也在於那些無需重裝就可以提供給頁面的大量文本。如果應用被設計爲對搜索引擎友好,那麼您應該能夠想到會出現什麼狀況。無論頁面中出現了什麼情況,請務必在最上面植入大量穩定的文本,讓蜘蛛們去玩吧。

  6.導致亂碼文本-AJAX不能支持多種字符集。這並不是什麼涉及生死的侷限性,但是如果忘記這點可能會導致真正的問題發生。最基本的字符集是UTF-8。無論JavaScript發送的是什麼字符集,請不要忘了正確編碼,並根據內容設置服務器端的字符集。

  

  7.沒有爲使用不支持JavaScript的瀏覽器的用戶提供提示。有些瀏覽器不支持JavaScript,這些用戶一時不能明白出了什麼狀況。請給他們一些提示。

  以上都是一些很容易發現的錯誤。真正的問題都是容易被人忽視的。

  

  AJAX七宗死罪

  1.造成內存泄露-任何長期從事開發工作的人都知道什麼是循環引用,並瞭解循環引用給內存管理帶來的危害。AJAX 所使用的JavaScript是一種內存管理語言。也就是說JavaScript具有內置的信息包收集功能,因此能夠抽取不再有引用路徑使用的變量並重新分配這些變量所使用的內存。

  作爲基本工作原理來說,這樣並無不妥;但是在模型層對象與查看元素之間互相引用時,由於這些循環引用,您就不能依靠這個功能來實現內存使用的最優化。從原則上來說,對象爲零,則元素爲零。但是如果這是從元素到對象的向後引用,那麼信息包蒐集器不會動這些對象。

  現在,問題出來了:在文件對象模型中,任何文件樹中的DOM節點都可能被樹中存在的其他元素引用,而無論其是否被其他對象所引用!因此,任何在信息包收集器中經過標註的被DOM節點向後引用的對象在這一方向上都必須爲零,否則它的內存就會一直處於已分配狀態。

  

  2.不瞭解“異步”的含義-異步這個詞很容易讓不熟悉它的用戶感到緊張。但是如果您爲這些用戶所設計的網頁應用屬於桌面應用,那麼他們肯定不會感到不安。這是一個致關重要的設計點。大部分網頁應用功能與桌面副本非常類似。但是在網頁應用中,用戶期望這種虛幻的特徵導致他們截然不同。

  用戶在與網頁瀏覽器打交道時會帶有非常不同的偏見和期望,而對於桌面應用中他們並沒有這樣的行爲。因此,儘管頁面與服務器之間頻繁的響應會非常好,非常高效,頁面能夠同時對自身進行修訂,但是這將會使用戶頭暈眼花。因此,您需要遵守兩條守則,要考慮到進入用戶視覺範圍內的每個變化:如果對於用戶來說不是很迫切的更新,那麼要使升級更爲溫和,不會轉移;如果更新對於用戶與應用的交互非常重要,那麼更新要清楚而明顯。

  

  3.使服務器變成瞎子-用戶端與服務器交流的減少是一大問題,而以前並非如此。在以前,服務器端的應用瞭解全部情況並且能夠看到全部狀況:每個例外,每次重新加載,每個事件多能被看到並記錄下來,當然服務器也道到底客戶端是什麼狀況,因爲服務器會記錄下屏幕上顯示的一起。

  在AJAX應用中可不是這樣。當有事件發生時,這些事件是與服務器相互獨立的,也就是說,當客戶端出現問題時,服務器端並不會馬上知道。在某個位置發現和記錄客戶端發生的事件以及例外,使服務器能夠追蹤需要干涉的問題

  

  4.用GET偷懶-GET的作用是找回數據;POST的作用是對GET進行設置。不要在不適當的時候使用GET,即使你認爲這樣做沒有危害也不要嘗試。GET的動作會改變狀態,會改變狀態的鏈接會使用戶感到困惑;大部分都認爲鏈接的作用是導航,而不是功能。

  

  5.數據類型不兼容-JavaScript並非.NET 框架中的一部分。儘管這有點讓人傷心,但是它的確爲我們展示了一個我們可能會碰到的問題:確認JavaScript能夠理解其運行平臺上的數據類型,反之,對於.NET或其它也是如此。可能會有多種轉換,您需要一一進行。例如,Ajax .NET Pro 資料庫提供能夠轉換.NET和JavaScript對象符號的轉換器。

  6.有些應用不知何時應該關閉-無需刷新頁面的內容動態生成如果沒有關閉時間將會非常糟糕。How many Web pages hav你見過多少比美國國會議事錄還長的網頁?如果網頁無限延長無疑會是用戶的噩夢,只要想想用戶會怎麼看待永不停止的應用就知道了。讓您的網絡應用具有動態,但是一定要在可行的限度之內。

  7.JavaScript和DOM相互獨立-請記住AJAX是建立在“模型-視覺-控制器”(Model-View-Controller)結構之上,請認真對待這點。JavaScript屬於模型層,DOM屬於視覺層,而控制器是銜接他們的婚姻顧問。請確保您的網絡文件獨立於JavaScript之外(這樣對於不支持JavaScript的用戶比較有用) – 除非內容自身只在用戶使用JavaScript纔有意義。在這種情況下,用JavaScript來創建內容。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章