本文將闡述目前AJAX應用程式在使用書籤和後退按鈕方面所面臨的嚴重問題；展示Really Simple History（RSH）庫——一個可以解決以上問題的開源架構，並提供幾個運行中的例子。
書籤和後退按鈕在傳統的多頁面Web應用程式中運行得非常好。當使用者瀏覽web網站的時候，其瀏覽器的地址欄記錄隨新的URL而更新，這些記錄可以被粘貼到電子郵件或者書籤中供以後使用。後退和前進按鈕也可以正常操作，使使用者可以在訪問過的頁面中向前或向後翻動。
但是AJAX應用程式卻不一樣，它們是運行在單個Web頁面中的複雜程式。瀏覽器並不是為這類程式而構建的——這類Web應用程式已經過時，它們在每次滑鼠點擊的時候都需要重新重新整理整個頁面。
在這種類似於Gmail的AJAX軟體中，瀏覽器的地址欄在使用者選擇功能和改變程式狀態的時候保持不變，這使得無法在特定的應用程式視圖中使用書籤。此外，如果使用者按下[上一頁] 按鈕來“撤銷”上次的操作，他們會驚奇地發現，瀏覽器會完全離開該應用程式的Web頁面。
開源RSH架構可以解決這些問題，它為AJAX應用程式提供了書籤和控制後退、前進按鈕的功能。RSH目前還處於Beta階段，可以在Firefox 1.0、Netscape 7+、Internet Explorer 6+等瀏覽器上運行；目前還不支援Safari。
目前有幾個AJAX架構對書籤和記錄問題有所協助；但這些架構目前都有幾個由於實現而造成的重大Bug。此外，很多AJAX記錄架構被綁定到較大的庫上，例如Backbase和Dojo；這些架構為AJAX應用程式引入了完全不同的編程模型，迫使開發人員使用全新的方式來獲得記錄功能。
相較之下，RSH是一個可以包含在現有AJAX系統中的簡單模組。此外，RSH庫採用了一些技術以避免產生影響其他記錄架構的Bug。
DhtmlHistory類為AJAX應用程式提供記錄抽象。AJAX頁面使用add()方法添加記錄事件到瀏覽器，指定新的地址和相關的記錄資料。DhtmlHistory類使用一個錨散列（如#new-location）更新瀏覽器當前的URL，同時把記錄資料和該新URL關聯。AJAX應用程式將自己註冊為記錄的監聽器，當使用者使用後退和前進按鈕進行瀏覽時，記錄事件被觸發，為瀏覽器提供新的位置以及與add()調用一起儲存的任何記錄資料。
讓我們先從一個簡單的例子開始。
首先，任何需要使用RSH架構的頁面都必須包含dhtmlHistory.js指令碼：
DHTML記錄應用程式也必須在與AJAX Web頁面相同的目錄下包含blank.html檔案；這個檔案與RSH架構打包在一起，且對於Internet Explorer來說是必需的。順便提一下，RSH使用一個隱藏Iframe來跟蹤和添加Internet Explorer的記錄變化；這個Iframe需要我們指定一個實際的檔案位置才能正常工作，這就是blank.html。
RSH架構建立了一個叫做dhtmlHistory的全域對象，這是操縱瀏覽器記錄的進入點。使用dhtmlHistory的第一步是在Web頁面載入完成後初始化dhtmlHistory對象：
historyChange()方法很簡單，該函數在使用者導航到一個新位置後接收newLocation以及任何與該事件關聯的可選historyData。
上面用到的debug()方法是定義在樣本源檔案中的一個實用函數，它與完整樣本打包在一起供下載。debug()只是用來將訊息列印到Web頁面上；第二個布爾型參數（在上述代碼中值為true）控制是否在列印新的調試訊息之前清除原有的全部訊息。
開發人員使用add()方法添加記錄事件。添加記錄事件涉及為記錄變化指定一個新地址，例如edit:SomePage，以及提供一個和該事件一起儲存的可選historyData值。
然後使用者可以將這個頁面做成書籤，如果以後用到這個書籤，AJAX應用程式可以讀取#helloworld值，並用它來初始化Web頁面。散列後面的地址值是RSH架構可以透明編碼和解碼的URL地址。
使用dhtmlHistory的最後一步是isFirstLoad()方法。在某些瀏覽器中，如果導航到一個Web頁面，再跳轉到另一個不同的頁面，然後按[上一頁] 按鈕返回到起始的網站，第一頁將完全重新載入，並觸發onload事件。這樣會對想要在第一次載入頁面時用某種方式對其進行初始化（而其後則不使用這種方式重新載入該頁面）的代碼造成破壞。isFirstLoad()方法可以區分是第一次載入一個Web頁面還是使用者導航到儲存在記錄中的Web頁面時觸發的“假載入”事件。
在範例程式碼中，我們只想在第一次載入頁面的時候添加記錄事件；如果使用者在載入頁面後按後退按鈕返回該頁面，我們就不想重新添加任何記錄事件：
然後，如果使用者離開頁面後又通過後退按鈕返回該頁面，我們可以使用get()方法提取儲存的值，或者使用hasKey()方法檢查該值是否存在。
prettyPrintXml()是一個定義在完整樣本原始碼中的實用方法；此函數準備在web頁面中顯示以便用於調試的簡單XML。
請注意，相關資料只在該頁面的記錄中進行持久化；如果瀏覽器被關閉，或者使用者開啟一個新視窗並再次鍵入AJAX應用程式的地址，則該記錄資料對於新的Web頁面不可用。記錄資料只有在用到後退或前進按鈕時才被持久化，當使用者關閉瀏覽器或清空緩衝的時候就會消失。如果想真正長期持久化，請參閱Ajax MAssive Storage System (AMASS)。
我們的簡單樣本已經完成。
我們的第二個例子是一個簡單的AJAX電子郵件類比應用程式的樣本，即O'Reilly Mail，它類似於Gmail。O'Reilly Mail描述了如何使用dhtmlHistory類來控制瀏覽器的記錄，以及如何使用historyStorage對象來緩衝記錄資料。
O'Reilly Mail使用者介面由兩部分組成。在頁面的左邊是一個帶有不同電子郵件檔案夾和選項的菜單，例如收件匣、草稿箱等。當使用者選擇了一個功能表項目（如收件匣），就用這個功能表項目的內容更新右邊的頁面。在一個現實應用程式中，我們會遠程擷取並顯示選擇的信箱內容，不過在O'Reilly Mail中，我們只顯示已選擇的選項。
O'Reilly Mail使用RSH架構向瀏覽器記錄中添加菜單變化並更新地址欄，允許使用者利用瀏覽器的後退和前進按鈕為應用程式做收藏書籤和跳到上次變化的菜單。
我們用initialize()方法儲存和檢索地址簿：
處理記錄變化的代碼也很簡單。在下面的原始碼中，無論使用者按後退還是前進按鈕，都將調用handleHistoryChange。使用O'Reilly Mail定義的displayLocation實用方法，我們可得到newLocation並使用它將我們的使用者介面更新到正確的狀態。
現在我們已經瞭解了如何使用RSH API來使AJAX應用程式支援書籤以及後退和前進按鈕，並提供了範例程式碼，您可參考該樣本來建立自己的應用程式。希望您能利用書籤和記錄的支援來增強AJAX應用程式。