通過(guò)最優(yōu)秀的 Web 2.0 應(yīng)用程序?qū)W習(xí)改進(jìn)用戶體驗(yàn) ![]() |
![]() |
![]() |
級(jí)別: 初級(jí) Jack D Herrington (jherr@pobox.com), 高級(jí)軟件工程師, Leverage Software Inc. 2007 年 5 月 21 日 跟隨本文一起游覽 Web 2.0 世界中的一些頂尖的 Asynchronous JavaScript + XML (Ajax) 應(yīng)用程序。探索這些應(yīng)用程序在用戶層面上獲得成功的秘決,發(fā)現(xiàn)各種技巧并著手開(kāi)發(fā)自己的 Web 2.0 應(yīng)用程序,創(chuàng)造令人興奮的用戶體驗(yàn)。 這篇文章著眼于一些最優(yōu)秀的新一代 Web 應(yīng)用程序,向大家展示了從中能學(xué)到什么 —— 模仿最優(yōu)秀的應(yīng)用程序是引以自豪的傳統(tǒng)。我相信這些站點(diǎn)不會(huì)介意的, 畢竟模仿是最誠(chéng)摯的敬佩。
然而,我沒(méi)有把技術(shù)層面的問(wèn)題放在首位。因?yàn)檫@些站點(diǎn)的技術(shù)問(wèn)題 —— 數(shù)據(jù)如何在 Ajax 中傳遞,固然重要,但是并不是某個(gè)站點(diǎn)賴以成功的關(guān)鍵因素。應(yīng)該要重點(diǎn)考慮站點(diǎn)是如何使用瀏覽器的 Ajax 特性結(jié)合動(dòng)態(tài) HTML (Dynamic HTML,DHTML )創(chuàng)建杰出的用戶體驗(yàn)的,以及站點(diǎn)是如何與它們的用戶社區(qū)進(jìn)行交互的。我將探究所有這些因素,它們和技術(shù)一樣在站點(diǎn)獲得成功的過(guò)程中發(fā)揮著重要作用。 如果 “最具影響力的 Web 2.0 應(yīng)用程序” 設(shè)有奧斯卡獎(jiǎng)或者金球獎(jiǎng),那么得獎(jiǎng)?wù)叻?Google 地圖 莫屬。我清晰地記得我的一些同事第一次看到 Google 地圖時(shí)的反應(yīng):瀏覽器竟然可以完成這些任務(wù)? 在我的印象中,Google 地圖重新定義了用戶對(duì)瀏覽器中的應(yīng)用程序的期許,引領(lǐng)了一場(chǎng) Web 2.0 的運(yùn)動(dòng)。 我不太確定這篇文章的讀者是否曾經(jīng)使用過(guò) Google 地圖,但不管怎樣我還是在 圖 1 中展示一下這個(gè)站點(diǎn)。 圖 1. Google 地圖的最新版 ![]() 瀏覽地圖的操作很簡(jiǎn)單,只需點(diǎn)擊和拖拽地圖即可,就像是在紙制地圖中操作一樣。 如果您要尋找路線,則它們會(huì)以線條的形式出現(xiàn)在地圖中,屏幕不會(huì)閃爍、地圖也不會(huì)移動(dòng)(除非需要這樣做)。 實(shí)際上,Google 地圖大部分功能的實(shí)現(xiàn)都不需要重新與服務(wù)器交互以獲取一個(gè)新的 HTML 頁(yè)面。 Google 地圖誕生之后,Ajax 和 Dynamic HTML這幾個(gè)詞語(yǔ)永久地刻入了第二次 Web 革命的語(yǔ)言中。但是最讓人興奮地是,嚴(yán)格來(lái)講 Google 地圖并不是運(yùn)行在 Ajax 之上(如果把 Ajax 定義為使用 但是 Google 地圖為什么不使用 Ajax 呢? 我不能代表 Google 的工程師發(fā)言,但是我感覺(jué) Google 地圖的設(shè)計(jì)靈感來(lái)自于 JavaScript 的 “mashup 能力”。 在文章開(kāi)頭,我談到了對(duì)用戶社區(qū)的支持。我承認(rèn),這有點(diǎn)兒官腔,但我認(rèn)為這很重要。Mashup 是支持用戶社區(qū)的根本。 mashup 的意思就是把某個(gè)站點(diǎn)的功能與另一個(gè)站點(diǎn)的功能合并到一起,然后創(chuàng)建出更加有趣的一些東西。Mashup 的一個(gè)很好的例子就是從 Craigslist 獲取房屋出租列表并使用 Google 地圖反映其位置的站點(diǎn)。 MapMyRun.com 是Google 地圖 mashup 的另一個(gè)例子,它使用 Google 地圖讓賽跑者(或者任何其他人)能計(jì)算出地圖上各路線的距離。圖 2 顯示這個(gè)功能。 圖 2. Map My Run 界面 ![]() 此處,我在左窗格的輸入字段中輸入起點(diǎn)。然后使用鼠標(biāo)指定跑步的經(jīng)過(guò)點(diǎn)。當(dāng)我單擊鼠標(biāo)時(shí),左窗格立刻動(dòng)態(tài)地更新顯示出距離。我可以放大地圖獲得更詳細(xì)的內(nèi)容或者切換到衛(wèi)星模式(如果路線超過(guò)了視圖)。 所有繁重的地圖繪制工作都是由 Google 地圖完成的。MapMyRun 站點(diǎn)只是在地圖的表層添加了一些 JavaScript 代碼,用于處理鼠標(biāo)點(diǎn)擊和計(jì)算距離。 這樣,當(dāng)我要成功地構(gòu)建 Web 2.0 應(yīng)用程序時(shí)可以從 Google 地圖中獲得哪些靈感呢??
Google 地圖為 Web 2.0 應(yīng)用程序設(shè)置了很高的門(mén)檻。但是可以使用 Ajax 在應(yīng)用程序中快速添加大量的數(shù)值。TaDaList 就是這種數(shù)值的一個(gè)例子。TaDaList 是一個(gè)非常簡(jiǎn)單并且免費(fèi)的 to-do 列表管理程序。為了演示這個(gè)站點(diǎn),我創(chuàng)建了一個(gè)帳戶和游泳列表,用來(lái)提醒我繼續(xù)完成游泳訓(xùn)練的各種事項(xiàng)。列表如 圖3 所示。 圖 3. 游泳列表 ![]() 如果我想要添加購(gòu)買(mǎi)護(hù)目鏡的事件,便可以在文本字段中填寫(xiě)該事件然后單擊 Add to list。該項(xiàng)內(nèi)容立刻被添加到列表中相應(yīng)的位置,而不需要刷新頁(yè)面,顯示界面如 圖 4 所示。 圖 4. 添加 “Buy New Goggles” 之后 ![]() 這看上去沒(méi)什么打不了的,而且使用 Ajax 實(shí)現(xiàn)這個(gè)功能也不難,但是最終用戶卻會(huì)感到這像是從桌面應(yīng)用程序得到的結(jié)果。 請(qǐng)注意,TaDaList 是在 Rails 框架之上編寫(xiě)的,這點(diǎn)很重要。實(shí)際上,這個(gè)程序是人們學(xué)習(xí) Rails 時(shí)使用到的一個(gè)演示應(yīng)用程序。而且 Rails 框架使這種類型的 Ajax 應(yīng)用程序的開(kāi)發(fā)極為輕松。 為了演示,我使用 Rails 花了幾分鐘時(shí)間編寫(xiě)了一個(gè)簡(jiǎn)化版的 TaDaList 應(yīng)用程序。to-do 項(xiàng)的列表如 圖 5 所示。 圖 5. to-do 項(xiàng)的列表 ![]() 然后鍵入 圖 6. 添加 “Buy earplugs” 之后 ![]() 為了實(shí)現(xiàn)這個(gè)功能,我創(chuàng)建了一個(gè)小型的數(shù)據(jù)庫(kù)用來(lái)保存 to-do 項(xiàng)。然后再創(chuàng)建一個(gè) Rails 控制器,如 清單 1 所示。 |














清單 1 中的代碼使用了兩個(gè)方法。list()
方法用于顯示頁(yè)面。add()
方法用于在列表中添加新的項(xiàng)目,然后再在 HTML 中返回列表。
list()
方法的 RHTML 如 清單 2所示。
清單 2. List.rhtml
























這個(gè)頁(yè)面使用 form_remote_tag
把簡(jiǎn)單表單的內(nèi)容提交到控制器中的 add()
方法。add()
方法把 to-do 項(xiàng)添加到表中,然后為得到的 <div>
標(biāo)記返回新的內(nèi)容。這一功能的代碼如 清單 3所示。
清單 3. Add.rhtml








那么,我可以從 TaDaLists 中學(xué)到些什么呢? 第一,少許 Ajax 應(yīng)用程序會(huì)花大力氣使 Web 應(yīng)用程序感覺(jué)更像是桌面應(yīng)用程序。第二,選擇使用 Web 框架 —— 特別是那些包含 Ajax 的框架 —— 可以使這種類型的工作相當(dāng)簡(jiǎn)單。
![]() ![]() |
![]()
|
Campfire 是 TaDaLists 的同伴,它們都是由相同的工作組開(kāi)發(fā)的(37signals)。在本例中,應(yīng)用程序?qū)?huì)模擬一個(gè)虛擬的 campfire 站點(diǎn),它托管一個(gè)在線聊天室,使遠(yuǎn)程團(tuán)隊(duì)可以相互聊天,并方便地傳送文件。
我設(shè)置了一個(gè)試用帳號(hào),并進(jìn)行了聊天和上傳文件的操作。結(jié)果如 圖 7 所示。
圖 7. 為遠(yuǎn)程團(tuán)隊(duì)設(shè)計(jì)的虛擬 campfire

顯示界面的左側(cè)是一個(gè)簡(jiǎn)單的聊天窗口,在這個(gè)窗口中用戶可以隨時(shí)提交新的消息。界面的右側(cè)顯示了在線用戶,還有一個(gè)區(qū)域用于上傳文件。
文件的上傳是就地完成的,適用JavaScript 代碼來(lái)監(jiān)控文件上傳過(guò)程。這意味著,我們可以在會(huì)話的同時(shí)添加文件和圖像,而不會(huì)因?yàn)橐频搅硪粋€(gè)不同的頁(yè)面而離開(kāi)會(huì)話窗口。
從 Campfire 中可以學(xué)到一些有趣的東西。第一,它大膽地替換了用戶在桌面應(yīng)用程序中常用到的聊天服務(wù)的類型。在團(tuán)體會(huì)議的上下文中托管聊天的,并以此替換了原來(lái)的服務(wù),同時(shí)構(gòu)建了一個(gè)系統(tǒng),這個(gè)系統(tǒng)和桌面應(yīng)用程序比起來(lái)特性相當(dāng)局限,但是因?yàn)樗?dú)到地使用了會(huì)議的上下文,所以顯得更加有價(jià)值。
第二,一些通常會(huì)造成頁(yè)面刷新的操作,如上傳一個(gè)文件,都得到了處理,從而不再需要加載頁(yè)面。這可以使用戶的注意力保持在當(dāng)前的任務(wù)上,并且加強(qiáng)了桌面應(yīng)用程序的感覺(jué)。
![]() ![]() |
![]()
|
如果說(shuō)一些站點(diǎn)少量地使用了 Web 2.0,那么 YourMinis 則恰恰相反,它足以成為 Web 上的小部件/小工具站點(diǎn)。使用它,我們可以創(chuàng)建和定制載有各種小部件(或者是小工具,如果您更喜歡微軟的行業(yè)用語(yǔ))的頁(yè)面。頁(yè)面的功能相當(dāng)于控制板,它能以引人注意的方式及時(shí)地提供信息。
圖 8 中顯示了在頁(yè)面中添加一個(gè) Rottentomatoes 電影小部件后的站點(diǎn)。
圖 8. 顯示電影評(píng)論的 YourMinis

Rottentomatoes 是一個(gè)電影評(píng)論站點(diǎn)。它依據(jù)數(shù)百個(gè)電影評(píng)論為電影給定一個(gè)總分并提供了一個(gè)百分比。分?jǐn)?shù)等于或者高于 60% 的電影被認(rèn)為是 新鮮的(也就是好的意思)。在本例中,我選擇查看 Bridge To Terebithia,只需提供我的郵政編碼便可以馬上在同一個(gè)部件中獲得該電影分?jǐn)?shù)。圖 9 顯示了這個(gè)功能。
圖 9. 顯示本地電影分?jǐn)?shù)的電影小部件

界面干凈、打開(kāi)快速,并且在流行的瀏覽器上運(yùn)行良好。同時(shí)這些小部件可以放置在各種不同的位置 —— 比如說(shuō),站點(diǎn)創(chuàng)建者的博客中。
除了站點(diǎn)之外,YourMinis 還有一個(gè) Firefox 擴(kuò)展,用于在用戶瀏覽頁(yè)面時(shí)監(jiān)視瀏覽器。當(dāng)它發(fā)現(xiàn)一些 YourMinis 有可能使用的東西,比如 RSS feed 或者 MP3,它會(huì)彈出提示告訴用戶這些資源是可用的。與瀏覽器的這種集成相對(duì)來(lái)說(shuō)比較簡(jiǎn)單,使用這種方法把站點(diǎn)集成到用戶的桌面中是很不錯(cuò)的選擇。
在 Web 2.0 方面,從 YourMinis 中還可以學(xué)到一些東西。第一,minis 和框架是在 Macromedia Flash 中實(shí)現(xiàn)的。從用戶的視角看,這算不上真正的問(wèn)題。這又回到了另一個(gè)問(wèn)題,即選擇一個(gè)特定的技術(shù)并沒(méi)有最終產(chǎn)生的用戶利益重要。
他們鼓勵(lì)開(kāi)發(fā)人員站在用戶社區(qū)的角度思考,為整個(gè)用戶社區(qū)貢獻(xiàn)自己的頁(yè)面設(shè)計(jì)。這是與用戶社區(qū)協(xié)作的另一種表現(xiàn)形式,它將使用戶社區(qū)能以我們從未想到過(guò)的方式推進(jìn)站點(diǎn)的發(fā)展。
雖然 Lightbox 非常具體站點(diǎn),但是我想指出 Lightbox 技術(shù)在當(dāng)今許多站點(diǎn)中都發(fā)揮了很大的作用。lightbox 是用戶界面技術(shù)與一些 Ajax 技術(shù)的結(jié)合體。Web 頁(yè)面的例子如 圖 10 所示。
圖 10. Lightbox JS 主頁(yè)

如果單擊某個(gè)圖像,那么整個(gè)頁(yè)面會(huì)變暗,同時(shí)一個(gè)方框出現(xiàn)在頁(yè)面中間,顯示放大后的所選圖片。圖 11 顯示這個(gè)功能。
圖 11. 單擊圖像后 lightbox 出現(xiàn)

這種技術(shù)具有很多優(yōu)勢(shì)。它可以把用戶的注意力從頁(yè)面的其他區(qū)域到轉(zhuǎn)移選擇的圖片。因?yàn)橛脩艨梢詥螕?Close 返回正常的瀏覽頁(yè)面,因此這種技術(shù)可以為用戶顯示很多詳細(xì)內(nèi)容而又不必離開(kāi)當(dāng)前頁(yè)面。
這種 lightbox 技術(shù)不僅適用于圖像或者視頻,也適用于文本內(nèi)容。我經(jīng)常訪問(wèn)的一個(gè)站點(diǎn)就是使用 lightbox 技術(shù)在主頁(yè)上合適的區(qū)域顯示了每一篇文章的概要。但是用戶只有在單擊了 lightbox 鏈接(通過(guò) Ajax)之后,頁(yè)面才會(huì)加載該篇文章的概要。因此,用戶可以在一個(gè)頁(yè)面中同時(shí)閱讀幾篇文章的概要內(nèi)容,并且構(gòu)建大量的頁(yè)面會(huì)使服務(wù)的帶寬不夠,雖然用戶并不會(huì)同時(shí)訪問(wèn)所有的頁(yè)面。這于對(duì)于計(jì)算機(jī)和用戶來(lái)說(shuō)都是最好的。
一些開(kāi)源的 JavaScript 庫(kù)可用于開(kāi)發(fā) lightbox。上圖所顯示的是 Lightbox JS version 2。
![]() ![]() |
![]()
|
在撰寫(xiě)這篇文章時(shí),我訪問(wèn)了大量的 Web 2.0 站點(diǎn)。大多數(shù)站點(diǎn)都沒(méi)有應(yīng)用上述技巧 —— 盡管本文所有的技巧都值得應(yīng)用。Google 有一些尤為出色的內(nèi)容。Google 文檔 和電子表格 ( Spreadsheets ) 演示了在瀏覽器中使用 WYSIWYG 編輯可以完成哪些任務(wù)。Google 閱讀器 演示了如果應(yīng)用 RSS feed 并提供了一個(gè)解決方案使用戶在任何地方都能夠查看新聞。Google 電子郵件 使用了 Ajax、JavaScript、DHTML 和 Google 地圖。
另一個(gè)應(yīng)用領(lǐng)域就是 Google 表格處理軟件可以移動(dòng)訪問(wèn)。他們所有的服務(wù)都有簡(jiǎn)潔版,可以在電話和其他小型設(shè)置中良好地運(yùn)行。使用一個(gè) Googel 帳號(hào),您可以在 Web 上定制自己的主頁(yè),同時(shí)還可以為移動(dòng)電話定制一個(gè)主頁(yè)。
Google 并不是惟一使用 Ajax 創(chuàng)造驚人之舉的。Meebo 就是一個(gè)出色的例子。它是一個(gè)托管的聊天應(yīng)用程序,運(yùn)行于 Ajax 之上,并且擁有一個(gè)簡(jiǎn)單但雅致的界面。Kiko 是一個(gè)日歷應(yīng)用程序,它很巧妙地利用了 DHTML 來(lái)編輯日歷,并使用 Ajax 更新服務(wù)器中的約會(huì)、聯(lián)系方法和相關(guān)信息。
![]() ![]() |
![]()
|
這篇文章中出現(xiàn)的所有站點(diǎn)都值得我們學(xué)習(xí)和借鑒。尤其是可以從中學(xué)到一些非常有用的技巧。所有這些站點(diǎn)共同的特點(diǎn)就是尊重結(jié)合 HTML 和 JavaScript 代碼的威力。近來(lái),編程界常有關(guān)于 JavaScript 代碼的負(fù)面消息。我認(rèn)為這是不公平的,因?yàn)榫臀宜?tīng)到的大多數(shù)缺點(diǎn)而言,與其說(shuō)是 JavaScript 語(yǔ)言自身的問(wèn)題,倒不如說(shuō)是瀏覽器與文檔對(duì)象模型(Document Object Model,DOM)之間的兼容性問(wèn)題。很顯然,如果想要開(kāi)發(fā)一個(gè)出色的 Web 2.0 應(yīng)用程序,就應(yīng)該把 JavaScript 作為一門(mén)編程語(yǔ)言使用,并且應(yīng)當(dāng)給予它應(yīng)有的尊重。業(yè)內(nèi)的頂尖企業(yè)無(wú)一不照此行事。
![]() |
|
正如我在文章開(kāi)頭所提到的,這篇文章并不僅限于討論技術(shù)。同時(shí)還討論了如何創(chuàng)建令人贊嘆的用戶體驗(yàn)。本文中挑選的所有站點(diǎn)都在業(yè)內(nèi)開(kāi)拓了新天地。有的是封裝在一個(gè)簡(jiǎn)單的表單中(Google 地圖),有的是利用 Ajax 無(wú)縫地增強(qiáng)了界面。
Web 2.0 應(yīng)用程序歡迎社區(qū)。Google 地圖允許用戶分離出其技術(shù)以應(yīng)用于自己的應(yīng)用程序中。Campfire 之類的站點(diǎn)更加注重于增強(qiáng)社區(qū)體驗(yàn)。
當(dāng)然,您可以學(xué)到很多。但額外令人高興的是,構(gòu)建 JavaScript 和 DHTML 應(yīng)用程序的簡(jiǎn)便使得構(gòu)建 Web 2.0 應(yīng)用程序更加輕松愉快。
學(xué)習(xí)
- 您可以參閱本文在 developerWorks 全球網(wǎng)站上的 英文原文。
- Ajax 技術(shù)資源中心:developerWorks 上所有有關(guān) Ajax 的問(wèn)題都可以在這里找到解答。
- developerWorks 中國(guó)網(wǎng)站 XML 專區(qū):通過(guò) developerWorks XML 專區(qū)了解 XML 的方方面面。
- Meebo:進(jìn)一步學(xué)習(xí)用于任何地點(diǎn)之間即時(shí)消息傳送的托管聊天應(yīng)用程序
- Google 地圖:使用 Google 的地圖繪制應(yīng)用程序在各地點(diǎn)之間標(biāo)示線路、找尋企業(yè)和進(jìn)行更多操作。
- GMail:查閱 Google 的支持 Ajax 電子郵件應(yīng)用程序,這些應(yīng)用程序內(nèi)建有 Google 搜索技術(shù)和兆字節(jié)存儲(chǔ)技術(shù)。
- Campfire:了解來(lái)自 37signals 的群體聊天和文件交換應(yīng)用程序
- Kiko:查閱 Ajax 日歷應(yīng)用程序。
- Map My Run:使用這個(gè)作者最喜愛(ài)的 Google 地圖 mashup 之一標(biāo)示跑步線路并獲得準(zhǔn)確的距離。
- TaDaList:看看來(lái)自 37signals 的一個(gè)共享 to-do 列表系統(tǒng)可以完成哪些任務(wù)。
- YourMinis:在這個(gè)小部件/小工具站點(diǎn)上。創(chuàng)建您自己的控制板,貢獻(xiàn)您的小部件。
- Ajaxian:緊跟Ajax 和前端小部件發(fā)展的步伐,利用這個(gè)非常有用的資源。
- IBM XML 認(rèn)證:看看如何才能成為一名 IBM 認(rèn)證的 XML 及相關(guān)技術(shù)的開(kāi)發(fā)人員。
- XML 技術(shù)文檔庫(kù):查看 developerWorks XML 專區(qū)提供的大量技術(shù)文章、技巧、教程、標(biāo)準(zhǔn)和 IBM 紅皮書(shū)。
- developerWorks 技術(shù)活動(dòng) 和 網(wǎng)絡(luò)廣播 :通過(guò)這些活動(dòng)隨時(shí)關(guān)注技術(shù)的最新進(jìn)展。