傳統多頁應用天然支援書籤與歷史導航。單頁 Ajax 應用僅在單一 URL 內動態更新狀態,導致:
開源輕量級 JavaScript 庫,提供 DHtmlHistory 與 HistoryStorage 兩大核心類,解決書籤與歷史導航問題。支援 Firefox 1.0+、IE 6+、Netscape 7+ (不支援 Safari)。
location.hash 變化。統一抽象為歷史事件模型。<!-- 頁面需引入 -->
<script src="dHtmlHistory.js"></script>
<!-- 同目錄需放置 blank.html 供 IE IFrame 使用 -->
<script>
// 初始化
window.onload = function() {
dHtmlHistory.initialize();
dHtmlHistory.addListener(historyChanged);
if (dHtmlHistory.isFirstLoad()) {
dHtmlHistory.add('home', {view: 'welcome'});
}
};
function historyChanged(newLocation, historyData) {
// 根據 newLocation 還原 UI 狀態
switch (newLocation) {
case 'home': showWelcome(); break;
case 'edit': loadEditor(historyData); break;
// ...
}
}
// 使用者操作觸發狀態變更
function onEditClick(docId) {
dHtmlHistory.add('edit', {docId: docId, timestamp: Date.now()});
loadEditor({docId: docId});
}
</script>
| 方法 | 用途 |
|---|---|
dHtmlHistory.initialize() | 啟動歷史監聽,必須在 onload 中調用 |
addListener(callback) | 註冊歷史變更回調 callback(newLocation, historyData) |
add(location, historyData) | 新增歷史點,更新 URL 為 #location,可選附帶任意可序列化資料 |
isFirstLoad() | 判斷是否首次載入 (非歷史導航觸發) |
HistoryStorage.put(key, value) | 跨頁面持久化資料 (配合隱藏表單) |
HistoryStorage.get(key) | 讀取持久化資料 |
historyData 不隨書籤持久化,瀏覽器關閉或清除歷史即失效。XMLHttpRequest 等非序列化物件。RSH 以極簡 API 解決 Ajax 最大易用性缺憾,讓單頁應用擁有原生 Web 的導航體驗。建議納入專案基礎設施,提升產品專業度。