HTTP 無狀態,瀏覽器不主動告知「是刷新還是首次加載」。需通過**客戶端狀態標記**來推斷。
// 頁面入口腳本(越早執行越好)
(function() {
const KEY = 'page_loaded_flag';
const isReload = sessionStorage.getItem(KEY) === 'true';
if (isReload) {
console.log('頁面被重新加載/刷新了');
// 執行刷新邏輯:恢復表單、刷新數據等
} else {
console.log('首次加載');
}
// 標記已加載
sessionStorage.setItem(KEY, 'true');
// 可選:頁面卸載時清理(視業務而定)
window.addEventListener('beforeunload', () => {
// sessionStorage 隨標籤頁關閉自動清理,通常無需手動清除
});
})();
// 獲取導航類型
const navEntry = performance.getEntriesByType('navigation')[0];
if (navEntry) {
switch (navEntry.type) {
case 'navigate': console.log('正常導航進入'); break;
case 'reload': console.log('用戶點擊刷新 / F5 / Cmd+R'); break;
case 'back_forward':console.log('歷史前進/後退'); break;
case 'prerender': console.log('預渲染'); break;
default: console.log('其他方式');
}
}
兼容性:Chrome 60+、Firefox 58+、Edge 79+、Safari 15.4+。舊版瀏覽器可回退 performance.navigation.type(已棄用)。
// 頁面卸載前保存關鍵狀態
window.addEventListener('beforeunload', () => {
const state = { scrollY: window.scrollY, formData: collectFormData() };
localStorage.setItem('page_state_backup', JSON.stringify(state));
});
// 頁面加載時恢復
const backup = localStorage.getItem('page_state_backup');
if (backup) {
const state = JSON.parse(backup);
window.scrollTo(0, state.scrollY);
restoreFormData(state.formData);
localStorage.removeItem('page_state_backup'); // 用完即刪
}
| 方案 | 檢測類型 | 優點 | 缺點 |
|---|---|---|---|
| SessionStorage Flag | 首次 vs 非首次 | 簡單、全瀏覽器支持、無需權限 | 無法區分「刷新」與「歷史返回」 |
| Performance Navigation | 導航類型(reload/back_forward/...) | 語義精確、標準化 | 舊瀏覽器不支持、iframe 中受限 |
| LocalStorage 狀態備份 | 跨會話恢復狀態 | 關閉瀏覽器後重開也能恢復 | 涉及隱私/存儲配額、需手動清理 |
performance.navigation.type(含 polyfill) 精確識別刷新/前進後退。sessionStorage 標記會話內重複加載。beforeunload + sessionStorage 即時保存恢復。onbeforeunload 彈窗阻攔刷新,現代瀏覽器多已限制。組合使用上述方案,即可全方位感知頁面加載上下文,構建更智能的用戶體驗。