判斷是否從"上一頁"進入網頁

performance.getEntriesByType("navigation") 搭配 pageshow 事件,缺點是只能告訴你這次進入頁面的方式,但是不會告訴你「上一頁的 URL」,所以沒辦法做更細緻的判斷。

由於我使用 Laravel + Inertia,編譯過後的網頁返回上一頁不會觸發 performance.getEntriesByType("navigation"),所以要再加上 pageshow 事件。

經測試:
npm run build 走 event.persisted
npm run dev 走 performance.getEntriesByType
// 使用者是從上一頁返回的
// npm run build 走這邊
window.addEventListener("pageshow", (event) => {
    if (event.persisted) {
        console.log("上一頁返回");
    }
});

// npm run dev 走這邊
const entries = performance.getEntriesByType("navigation");
if (entries[0] && entries[0].type === "back_forward") {
   console.log("上一頁返回");
}

// 兩者整合
window.addEventListener("pageshow", (event) => {
    if (
        event.persisted ||
        performance.getEntriesByType("navigation")[0]?.type === "back_forward"
    ) {
        console.log("上一頁返回");
    }
});

問題紀錄:
上面的程式一段時間之後開發環境變成不會觸發,所以又改了寫法,但如果連到外站再回來好像也有問題,持續測試中。
// 使用者是從上一頁返回的
window.addEventListener('popstate', function () {
    if (event.state.props.routeName == 'your route name') {
        console.log("上一頁返回");
    }
});

留言