想法與目標
從AJAX誕生至今,就存在著Back/Forward Button和bookmark失效的問題,我 以前一般提倡,一個好的AJAX應用應該不讓使用者有點擊“Back/Forward”的想法 ,並且使用某種方式提供給使用者一個能夠記錄直接產生頁面的Bookmark。 Windows Live Local應該是這種應用最好的典範之一,其靈活的互動,良好的界 面讓我在初遇時不得不眼前一亮。
另外,我也曾經見過把後退按鈕禁用的做法(其實這樣對於解決問題的確不 錯),不過這些都似乎只是一個workaround,設法避開這個AJAX應用普遍存在的 問題。似乎Gmail能夠支援Back按鈕,但是我驚奇的發現,在點擊Back後,卻不 能使用Forward,所以這還不算成功的解決這個問題。那麼能否解決?似乎已經 有了一定的實現。
事實上,之所以我會產生實現自己的解決方案的想法,是因為從Nikhil Kothari的Blog上看到了他的解決方案(點擊這裡查看)。他實現了一個 HistoryControl控制項,可以在頁面中配合UpdatePanel使用,在一定程度上實現 了對Back/Forword Button已經Bookmark的支援。但是正如他在Blog上所說的, 這隻是他的一個prototype。我在使用了他的示範之後,也的確發現了一些問題 (示範也能從Nikhil的Blog上下載):
HistoryControl是一個Server控制項,必須配合UpdatePanel使用,並沒有對於 Atlas的用戶端應用甚至普通的AJAX應用提供基本的支援。
不支援FireFox(不知為何,我在自己嘗試之後覺得支援FireFox比IE容易實 現)。
在IE裡使用時,從Back和Forward的下拉框裡可以看出,那些Title都成為了 “Empty Page”。
不支援在Back和Forward下拉框中選擇一項History跳轉。
如果訪問了別的網站再Back,則在IE下不支援多次回退。
部署麻煩。事實上我覺得很奇怪,我除了直接在他的項目中成功運行之外。 部署到別的項目或者是我的空間都有問題,怎麼也找不出原因,估計是檔案路徑 問題,需要仔細讀一下他的代碼。
總之,這個解決方案還很不成熟,但是我們要對Nikhil,Atlas和微軟有信心 ,對於Back/Forward的內建支援應該會出現在Atlas的後續版本中。
於是我想,不如我來實現一個自己的吧,雖然我一直提倡軟體複用,但是如 果找不到成熟的解決方案,那麼就該發揮程式員的主觀能動性了。對於我最後的 實現,它有以下特點:
一個輕量級的JS解決方案。雖然我是在Atlas的基礎上寫的,但是只是使用了 Atlas中的Sys.Timer類,很容易修改成獨立於任何庫的JS代碼。
支援IE和FireFox。
簡單的支援Back和Forward的下拉框裡的Title文字,在大多數情況下不會出 錯。產生Nikhil的這個問題的原因在闡述我的實現時會提及。我簡單地解決了這 個問題,但是沒有設計出完整支援title問題的完美實現。我有一些想法,似乎 十分複雜,在嘗試時都宣告失敗。
支援在Back和Forword下拉框中選擇一項History跳轉。
支援Bookmark,使用者可以輕鬆將頁面加入收藏夾。
便於使用,部署簡單。
對於我列出Nikhil的實現裡的第5個問題,我想了一些辦法,卻依舊沒有解決 。現在雖然腦子裡有想法,但還需要繼續嘗試。