欧美成人精品手机在线观看_69视频国产_动漫精品第一页_日韩中文字幕网 - 日本欧美一区二区

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

在 Web 中判斷頁面是不是刷新

freeflydom
2024年9月18日 9:29 本文熱度 897

在 Web 開發中,我們經常需要區分用戶是否通過刷新操作重新加載了頁面。這一操作可能是由用戶手動刷新(如按下 F5 鍵或點擊瀏覽器刷新按鈕)或通過瀏覽器自動重新加載。判斷頁面是否刷新有助于開發者優化用戶體驗,例如在使用 vue 的時候需要進行權限控制,就需要判斷在刷新后根據登錄者的權限去添加對應的路由。

本文將詳細解析幾種常見的判斷頁面是否刷新的技術方案,并探討各自的適用場景、優缺點以及瀏覽器的兼容性。

1. 使用 window.name

window.name 是一個持久的窗口屬性,它的值在頁面刷新、甚至通過標簽頁導航到其他頁面時也會保留,因此可以利用它來判斷頁面是否是通過刷新重新加載。

代碼示例

window.onload = function() {

  if (window.name === 'isRefreshed') {

    console.log('頁面被刷新');

  } else {

    console.log('首次加載頁面');

    window.name = 'isRefreshed';

  }

};

工作原理

  • 首次加載時,window.name 是空字符串,通過設置它為 'isRefreshed' 來標記狀態。

  • 刷新頁面后,window.name 仍保持為 'isRefreshed',因此可以判斷頁面是通過刷新加載的。

優點

  • 簡單易用:不依賴外部存儲機制或服務器端邏輯。

  • 跨頁面持久性:在頁面間導航時,window.name 的值依然保持,適合跨頁面場景。

缺點

  • 安全性問題window.name 的值在不同頁面間共享,可能被其他頁面讀取。

  • 手動清理:在某些場景下可能需要手動清除 window.name,例如頁面關閉時。

兼容性

window.name 是一個非常老的 Web API,幾乎在所有瀏覽器中都有廣泛的支持,包括:

2. 使用 sessionStorage

sessionStorage 是 Web 存儲 API 的一部分,它為每個標簽頁維護獨立的存儲空間,并且其數據在標簽頁關閉后會被清空。我們可以利用 sessionStorage 來判斷頁面是否被刷新:

window.onload = function() {

  if (sessionStorage.getItem('isRefreshed')) {

    console.log('頁面被刷新');

  } else {

    console.log('首次加載頁面');

  }

  sessionStorage.setItem('isRefreshed', true);

};

工作原理

  • 當頁面首次加載時,sessionStorage 中沒有 isRefreshed 條目,因此可以判斷這是首次加載。

  • 通過設置 sessionStorage.setItem('isRefreshed', true);,標記頁面已加載。

  • 當頁面刷新后,sessionStorage 中的 isRefreshed 條目依然存在,因此可以檢測到頁面的刷新操作。

優點

  • 簡單且不依賴服務器端邏輯。

  • 只對當前標簽頁有效,適合單個頁面或 SPA(單頁應用)場景。

缺點

  • 可以被人為的篡改,不能保證百分之百準確。

兼容性

sessionStorage 是廣泛支持的 API,適用于以下瀏覽器:

3. 使用 performance.navigation API

瀏覽器的 performance.navigation API 提供了頁面加載的詳細信息,包括是否是通過刷新操作加載的頁面。通過檢查 performance.navigation.type 屬性可以判斷頁面的加載方式。

window.onload = function() {

  if (performance.navigation.type === performance.navigation.TYPE_RELOAD) {

    console.log('頁面被刷新');

  } else {

    console.log('首次加載頁面');

  }

};

屬性解釋

  • performance.navigation.TYPE_RELOAD: 表示頁面通過刷新加載。

  • 其他類型(如 TYPE_NAVIGATE)表示正常導航。

優點

  • 直接提供了判斷頁面刷新與否的接口,較為精確。

  • 不需要手動存儲狀態。

缺點

  • 該 API 正在逐步棄用,未來的瀏覽器可能不會支持。

  • 不適合未來長期維護的項目,應考慮遷移到更新的 API,比如下文中的 performance.getEntriesByType

兼容性

performance.navigation API 在大多數瀏覽器中都被支持,但該 API 已逐步被棄用:

4. 使用 beforeunload 事件

beforeunload 事件在用戶離開頁面之前觸發,無論是頁面刷新、關閉還是導航到其他頁面。在此事件中,我們可以設置一個標志位來判斷用戶是否通過刷新離開當前頁面。

window.addEventListener('beforeunload', function() {

  localStorage.setItem('isRefreshed', 'true');

});


window.onload = function() {

  if (localStorage.getItem('isRefreshed') === 'true') {

    console.log('頁面被刷新');

    localStorage.removeItem('isRefreshed');  // 刷新后清除標志位

  } else {

    console.log('首次加載頁面');

  }

};

工作原理

  • 在頁面卸載時(包括刷新),通過 beforeunload 事件設置一個標志位。

  • 頁面重新加載時,根據該標志位判斷頁面是否通過刷新操作加載。

優點

  • 靈活,可以處理不同類型的頁面離開操作。

  • localStorage 的數據不會在頁面關閉時清除,因此可以用于判斷跨頁面的刷新。

缺點

  • beforeunload 事件在部分瀏覽器(尤其是移動端)可能表現不一致。

  • 如果用戶清除了瀏覽器緩存或 localStorage,則無法正確判斷。

兼容性

beforeunload 事件在大多數現代瀏覽器中都有廣泛支持,但可能在一些移動端瀏覽器上表現不一致:

5. 使用 performance.getEntriesByType

performance.getEntriesByType("navigation") 是一個現代 Web 性能 API,用于獲取頁面導航的詳細信息。通過這個方法,我們可以獲取一個包含導航信息的對象,并通過檢查該對象的 type 屬性,判斷頁面是通過刷新加載還是其他方式進入的。

示例代碼

window.onload = function() {

  const [navigationEntry] = performance.getEntriesByType('navigation');

  

  if (navigationEntry && navigationEntry.type === 'reload') {

    console.log('頁面被刷新');

  } else {

    console.log('首次加載頁面');

  }

};

工作原理

  • performance.getEntriesByType('navigation') 返回一個 PerformanceNavigationTiming 對象數組,其中包含頁面導航的詳細信息。

  • 通過檢查 navigationEntry.type,可以確定頁面加載的類型:

    • type === 'reload': 頁面通過刷新加載。

    • type === 'navigate': 頁面通過正常導航進入。

    • type === 'back_forward': 頁面通過瀏覽器的前進或后退按鈕加載。

    • type === 'prerender': 頁面通過預渲染加載(這個狀態通常不常見)。

優點

  • 現代性performance.getEntriesByType 是較新的 API,能夠在現代瀏覽器中準確區分頁面的導航方式。

  • 詳細信息:除了判斷頁面刷新,還可以獲取更多關于頁面加載性能的數據,如 DNS 解析時間、請求時間等,有助于調優頁面性能。

  • 無狀態管理:無需依賴 sessionStoragelocalStorage 等外部狀態,避免了狀態同步問題。

缺點

  • 瀏覽器兼容性:雖然大多數現代瀏覽器支持此 API,但 Internet Explorer 不支持(現在已不是問題)。

  • 不適用于多次刷新:如果需要在用戶進行多次刷新的情況下進行追蹤,單次判斷可能不足。

使用場景

performance.getEntriesByType 適合那些只需要快速判斷頁面是否是刷新加載的場景,并且同時有進一步性能優化需求的應用。對于現代 Web 開發,這是一個較為精確且無需額外存儲或會話管理的解決方案。

監控頁面加載性能示例

window.onload = function() {

  const [navigationEntry] = performance.getEntriesByType('navigation');


  if (navigationEntry) {

    console.log(`頁面加載類型: ${navigationEntry.type}`);

    console.log(`頁面加載時間: ${navigationEntry.loadEventEnd - navigationEntry.startTime} ms`);

  }

};

這種方式不僅能幫助判斷頁面加載類型,還能幫助開發者優化頁面性能,提供更多性能數據來分析頁面加載瓶頸。

兼容性

performance.getEntriesByType 是較新的 API,在現代瀏覽器中得到廣泛支持,但較舊瀏覽器不支持:

總結

判斷頁面是否刷新是一個常見的需求,本文介紹了五種技術方案。每種方案都有其特定的適用場景和優缺點。總結如下:

方案優點缺點瀏覽器兼容性
window.name簡單、易跨頁面保持狀態安全性問題,需手動清理適用于所有現代瀏覽器
sessionStorage簡單,不依賴復雜邏輯關閉標簽頁時清空支持現代瀏覽器及部分較舊瀏覽器
performance.navigation直接提供頁面刷新判斷API 正被棄用廣泛支持,但逐漸被廢棄
performance.getEntriesByType精確判斷加載類型較新,舊版瀏覽器不支持僅支持現代瀏覽器
beforeunload靈活,可處理多種離開頁面的操作部分瀏覽器不支持,尤其是在移動端大多數現代瀏覽器支持

不同的方案各有優劣,開發者應根據應用的目標用戶群體、性能需求和瀏覽器支持情況靈活選擇。如果需要簡單、跨頁面的刷新判斷,window.name 是一個不錯的選擇;而在需要更精確、現代化的判斷方式時,performance.getEntriesByType 提供了更高的靈活性。



該文章在 2024/9/18 9:32:31 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved