2009年1月29日 星期四

AJAX 技術設計考量

看完 部署AJAX技術的七個錯誤(上)

想一想設計是否也會掉進去該陷阱?

不過有些是 Internet 有些是 Intranet




七項輕罪

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

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

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

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

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

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

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

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

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

  • 七項致命原罪


  • 造成記憶空間缺漏-任何進行技術開發的人員,必須要對循環參照與這個動作在記憶體管理上的風險有徹底了解。AJAX的主體JavaScript是一種記憶體已被管理的語言。這代表JavaScript有內建的垃圾清除(garbage collection)功能,所以當它發現變數不再被任何參照所存取到時,就會從記憶體上把它清除。

    這個功能一般來說是沒有問題的;但卻無法讓記憶體使用最佳化,因為當模組層的物件在參照檢視物層,或相反方向時,會有循環參照的情況發生。理論上當你清除這個物件時,就把元件給清除,但當元件向後指向物件時,垃圾清除程式就不會碰這個物件

    這裡就是有趣的地方:在文件物件模型中,任何是文件樹部分的DOM節點,不管它是否被其他物件所參照,都會被它在樹上的位置所參照。所以任何你要清除,卻向後參照到DOM節點的物件,需要在該方向上徹底清除,否則它依舊會佔記憶體!

  • 沒有考慮非同步的狀況-非同步狀況會讓不習慣的使用者操作不順。這是網路化程式非常諷刺的一件事,因為如果放在 個人電腦上面,使用者就不會覺得這個程式操作不順。這是設計時需要考慮的重點!大多數的網頁應用都與桌面版本程式的功能十分類似。但在網路應用環境下,有 個特性讓他們有所不同:使用者的期待。

    使用者帶有先入為主的觀念,認為網路瀏覽器就應該要能提供跟桌面的互動相等品質的東西。所以如果有一些酷炫的大量回應從網頁的伺服端傳來,而頁面在同時進 行顯示,那瞬間大量變動的頁面就可能會讓使用者不知所措。因此你必須在每次更動使用者視覺欄位時遵守兩個原則:如果這個更新對使用者來說不是立即必要,就 讓它不醒目,不會影響使用者;如果這個更新對使用者與應用程式的互動十分重要,就在網頁上顯著清楚地顯示出來。

  • 伺服器自顧自地運作- 用戶端與伺服端分處兩地的架構,會造成一些平常不容易察覺的問題。伺服器端的程式可以了解並觀察到所有狀況:所有例外狀況、資料更新與事件都可以被觀察記錄,因為用戶端的螢幕基本上也是伺服器端所繪製,因此伺服器端也徹底知道用戶端顯示的畫面。

    然而在AJAX應用程式中卻不是如此。有些事件只在伺服器發生,所以如果伺服端沒有即時告知用戶端,就有可能會發生問題。請在用戶端抓取並記錄事件,讓伺服器可以在需要時儘快介入,修正問題。

  • 使用不必要的GET指令-GET指令是用來抓取資料;POST是用來設定資料。即便你覺得使用GET指令沒什麼壞處,還是不要在不該使用的時候使用。GET的運作會改變程式狀態,而改變狀態的鏈結會迷惑使用者;大多數使用者都習慣把鏈結當成是一個指引,而不是一個功能。

  • 不考慮資料型別-JavaScript並不是.NET架構的一部分。如果你如此認為,那一定會讓你在遇到問題時 欲哭無淚。請確定JavaScript知道它執行的平台,比方.NET或其他平台上的資料型別。市面有很多轉換程式可供使用,你應該找出來使用。比方 Ajav.NET Pro程式庫就有提供轉換器,讓你可以在.NET與JavaScript物件標示之間轉換物件。

  • 有些程式不知道何時停止-不需要重讀頁面的內容動態產生程式如果啟動放著不管,可能會造成問題。你覺得網頁寫得比立法院議程還長能看嗎?如果網頁會持續顯示不停,絕對會成為使用者的恐怖惡夢,光想像一個顯示不停的程式就知道那種感覺。在設計動態顯示網頁時,記得要設下一些顯示限制。

  • 撰寫JavaScript時不使用DOM模型-請記得AJAX建立在模型-檢視-控制架構之上。請認真看待這件 事情。JavaScript屬於模型層,DOM屬於檢視層,而控制層則負責他們之間的連結管理。除非網頁內容只對可以使用JavaScript的使用者有 用,否則請確認你的網頁文件有獨立於JavaScript的相同內容(可以提供給無法使用JavaScript的使用者)。但如果資訊只對 JavaScript的使用者有用,就可以只使用JavaScript來創建內容。
  • 沒有留言:

    張貼留言