編寫 iPhone Friendly 的 Web 應用程式 (Part 6 - iUI)

weixin_34377065發表於2008-01-07

iUI是一個針對iPhone Safari的Web開發框架,由Joe Hewitt開發。這位Joe Hewitt曾經參與過Firefox的開發,包括其中的DOM Inspector以及Firebug,後來到了Facebook,為Facebook開發了iPhone專用版本,對iPhone Web開發社群算是作出了巨大貢獻。

樣式

我們繼續說iUI這個框架。這個框架所做的事情,就是提供iPhone Friendly的互動方式與樣式。為了簡單起見,我們先來說說樣式方面,iUI提供的不僅僅是一個CSS檔案,基於這個CSS檔案你所建立的頁面能夠符合iPhone的人機介面指引,並且看起來的效果貼近iPhone原生的應用程式,從而降低使用者學習門檻,避免你自己設計的Web應用對iPhone操作不友善(例如按鈕不夠大,手指難以點選)。

互動

至於互動方面,iUI提供一個基於page的換頁導航機制。這裡所說的page不是一個Web頁面,而是一個<body />內的頂級DOM元素,每一個這樣的DOM元素都可以作為一個page,同一時間上僅顯示一個page。頁面上的所有連結,要麼導致page轉跳,要麼導致整個頁面轉跳。這種轉跳有如下幾種情況。

轉跳

如果連結的href指向的是一個錨點,例如#somePage,那麼iUI就會在頁面中尋找id="somePage"的page物件,然後進行轉跳。

如果連結的href指向的是站內地址,例如/somePage.html,那麼iUI就會使用AJAX的方法載入/somePage.html的內容並追加到<body />內,注意,/somePage.html必然是一個文件片段而不可能是完整的XHTML文件,否則把<html />追加到<body />下就是錯誤的了。追加的內容內可以有多個page,如果其中一個有selected="true"的屬性,那麼接下來將顯示該page,否則顯示追加內容中的第一個page。

最後一種情況是指向站內地址,但是有target="_replace"屬性。iUI在看到target="_replace"屬性後,就會知道該<a />所在的page內直屬元素要被刪除,並且替換為目標頁面的內容。在這裡用CSS來解釋一下所謂的直屬元素,body > ul#somePage > li > a[target="_replace"],這裡<li />就是<ul id="somePage />的直屬元素了。這種轉跳通常用於曾亮載入,例如iPhone內建的Mail開啟郵箱後自動載入50封郵件,點選more之後再載入50封,Web介面上就可以通過這種方式實現——一個<ul />內包含51個<li />,前面50個對應50封郵件,最後一個<li />包含<a target="_replace" />的more連結,目標頁面就是下50封郵件的<li />

在轉跳的時候,iUI提供了一種很好看的效果,你能夠看到當前page從螢幕左邊移出去,新的page從螢幕右邊移進來,好像PowerPoint的某種幻燈片切換動畫那樣。如果新增了axis="y"屬性,page還能夠子底向下滾動。

歷史記錄

AJAX式的頁內內容更新不是不好,問題就在於瀏覽器無法自動儲存歷史記錄,導致前進後退按鈕實效。iUI已經解決了這個問題,上述3種轉跳中的前兩種iUI都會自動建立新的hash以便建立歷史記錄,hash預設就是#_pageId的形式,如果當前顯示的page沒有id,那麼hash就按照增量自動分配id。

在擁有歷史記錄之後,使用者就可以通過瀏覽器的後退按鈕向前翻頁了,此時相當於載入前面的page,iUI知道這是一個後退操作,就會提供反向的滾動效果(自左向右或自上向下)。

如果我訪問頁面的順序是A > B > C > D > B,那麼歷史記錄會如何呢?歷史記錄會變成A > C > D > B,也就是說第一次訪問B時B從歷史記錄中刪除並重新新增到最前的位置了。

演示

說了那麼多,我們來看看iUI的實戰效果吧!又是Facebook或者Digg的iPhone版?不是,我們來看看自己利用iUI開發一個小應用的效果以及成本如何。就在上個週末,我花了不到20小時做了個名為iBaidu的小東西,自動抓取Baidu的搜尋結果與排行榜並以iPhone friendly的方式顯示出來。以下是釋出到YouTube的演示視訊:

伺服器端使用的技術是Ruby on Rails以及ASP.NET。為什麼需要ASP.NET?這是一個很鬱悶的問題,因為Baidu是基於GBK的,而RoR的編碼轉換能力其若無比,我懶得花時間去尋找適合的轉碼庫,因此直接拿了ASP.NET來做抓去代理,抓取的時候順便做一下編碼轉換。如果不是編碼問題,那麼只需要RoR就能輕鬆完成任務。

小結

在這篇文章中,我們已經看到了如果使用RoR搭配Prototype,不好意思,iUI才對,要設計一個iPhone friendly的Web應用程式是多麼地容易,開發過程也相當敏捷。如果你喜歡iPhone開發系列的文章,歡迎訂閱:

相關文章