在 JSP 頁面中,只要瀏覽器地址欄變化 (跳轉、關閉、重新整理),在離開前執行特定 JS 方法 (如儲存草稿、發送統計、確認提示)。
| 事件 | 觸發時機 | 可阻止跳轉 | 典型用途 |
|---|---|---|---|
onbeforeunload | 文檔即將卸載 (跳轉、關閉、重整)**之前** | **是** (返回字串顯示確認對話框) | 防止誤離開、提示未儲存資料 |
onunload | 文檔**已**卸載 | 否 | 發送統計 (Beacon)、清理資源、記錄日誌 |
onpagehide | 頁面隱藏 (bfcache、切換分頁) | 否 | 頁面生命週期管理、暫停動畫 |
<script>
// 1. 離開確認 (彈出瀏覽器原生確認框)
window.onbeforeunload = function(e) {
// 標準寫法:設定 returnValue 觸發確認框
var msg = '確定要離開嗎?未儲存的資料將會遺失。';
(e || window.event).returnValue = msg; // IE/Chrome/Firefox
return msg; // 部分舊版瀏覽器需要 return
};
// 2. 執行具體邏輯 (不可阻止,不可彈窗 alert)
window.onunload = function() {
// 僅支援同步、非阻塞操作
// 1. navigator.sendBeacon (推薦:可靠、非阻塞、支援跨域)
navigator.sendBeacon('/api/log/pageview', JSON.stringify({
url: location.href,
time: Date.now(),
action: 'unload'
}));
// 2. 同步 AJAX (不推薦:可能被瀏覽器取消、阻塞卸載)
// var xhr = new XMLHttpRequest();
// xhr.open('POST', '/api/log', false); // false = 同步
// xhr.send('data');
// 3. localStorage/sessionStorage 寫入 (同步、即時)
sessionStorage.setItem('lastVisit', Date.now());
// 注意:這裡不能用 alert()、confirm()、異步 fetch/XHR (可能失敗)
};
</script>
function handleUnload() {
navigator.sendBeacon('/api/heartbeat', 'unload');
}
window.addEventListener('beforeunload', (e) => {
if (hasUnsavedChanges) {
e.preventDefault();
e.returnValue = '';
}
});
window.addEventListener('unload', handleUnload);
window.addEventListener('pagehide', (e) => {
if (e.persisted) {
// 頁面進入 bfcache,視同 unload
handleUnload();
}
});
JSP 頁面跳轉前執行 JS:**用 `beforeunload` 彈確認框阻止誤離開,用 `unload`/`pagehide` + `navigator.sendBeacon()` 可靠發送統計/日誌**。嚴禁在 `unload` 使用 `alert`/異步請求。關鍵業務邏輯 (如儲存草稿) 應採用**定時自動儲存** 或 **`beforeunload` 同步 XHR** (謹慎),不可完全依賴卸載事件。