傳統 Web 以頁面跳轉為單位,瀏覽器工具列的「後退/前進」按鈕天然匹配。但 AJAX/Rich Internet Application 在單頁內完成多次狀態變更,導致:
在 JavaScript 中建立一個陣列 historyStack 模擬 LIFO(後進先出)結構,搭配指標 stackPointer 指向當前狀態。
var historyStack = []; // 儲存狀態快照:{stateData, urlFragment, timestamp}
var stackPointer = -1; // -1 表示空堆疊
push 進堆疊:historyStack.push(newState)。stackPointer = historyStack.length - 1。#stateId)供書籤/分享使用,不觸發頁面重載。function goBack() {
if (stackPointer > 0) {
stackPointer--;
restoreState(historyStack[stackPointer]);
}
}
function goForward() {
if (stackPointer < historyStack.length - 1) {
stackPointer++;
restoreState(historyStack[stackPointer]);
}
}
function refresh() {
restoreState(historyStack[stackPointer]); // 重新套用當前狀態
}
function restoreState(state) {
// 1. 根據 state.urlFragment 發送 AJAX 請求
// 2. 回調中更新 DOM:填充列表、表單、分頁等
// 3. 同步更新自定義按鈕啟用/禁用狀態
updateNavButtons();
}
window.onhashchange(HTML5)或輪詢 location.hash,當用戶手動修改片段或使用書籤進入時,同步 stackPointer 並恢復狀態。aria-label="回到上一步"。現代瀏覽器支援 history.pushState()、replaceState()、popstate 事件,可直接操作原生歷史,無需手工堆疊。但理解手工堆疊原理有助於兼容舊瀏覽器與掌握核心邏輯。