日韩欧美国产精品免费一二-日韩欧美国产精品亚洲二区-日韩欧美国产精品专区-日韩欧美国产另-日韩欧美国产免费看-日韩欧美国产免费看清风阁

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

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

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

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

本文將詳細(xì)解析幾種常見的判斷頁面是否刷新的技術(shù)方案,并探討各自的適用場景、優(yōu)缺點(diǎn)以及瀏覽器的兼容性。

1. 使用 window.name

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

代碼示例

window.onload = function() {

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

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

  } else {

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

    window.name = 'isRefreshed';

  }

};

工作原理

  • 首次加載時,window.name 是空字符串,通過設(shè)置它為 'isRefreshed' 來標(biāo)記狀態(tài)。

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

優(yōu)點(diǎn)

  • 簡單易用:不依賴外部存儲機(jī)制或服務(wù)器端邏輯。

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

缺點(diǎn)

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

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

兼容性

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

2. 使用 sessionStorage

sessionStorage 是 Web 存儲 API 的一部分,它為每個標(biāo)簽頁維護(hù)獨(dú)立的存儲空間,并且其數(shù)據(jù)在標(biāo)簽頁關(guān)閉后會被清空。我們可以利用 sessionStorage 來判斷頁面是否被刷新:

window.onload = function() {

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

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

  } else {

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

  }

  sessionStorage.setItem('isRefreshed', true);

};

工作原理

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

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

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

優(yōu)點(diǎn)

  • 簡單且不依賴服務(wù)器端邏輯。

  • 只對當(dāng)前標(biāo)簽頁有效,適合單個頁面或 SPA(單頁應(yīng)用)場景。

缺點(diǎn)

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

兼容性

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

3. 使用 performance.navigation API

瀏覽器的 performance.navigation API 提供了頁面加載的詳細(xì)信息,包括是否是通過刷新操作加載的頁面。通過檢查 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)表示正常導(dǎo)航。

優(yōu)點(diǎn)

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

  • 不需要手動存儲狀態(tài)。

缺點(diǎn)

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

  • 不適合未來長期維護(hù)的項(xiàng)目,應(yīng)考慮遷移到更新的 API,比如下文中的 performance.getEntriesByType。

兼容性

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

4. 使用 beforeunload 事件

beforeunload 事件在用戶離開頁面之前觸發(fā),無論是頁面刷新、關(guān)閉還是導(dǎo)航到其他頁面。在此事件中,我們可以設(shè)置一個標(biāo)志位來判斷用戶是否通過刷新離開當(dāng)前頁面。

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

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

});


window.onload = function() {

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

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

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

  } else {

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

  }

};

工作原理

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

  • 頁面重新加載時,根據(jù)該標(biāo)志位判斷頁面是否通過刷新操作加載。

優(yōu)點(diǎn)

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

  • localStorage 的數(shù)據(jù)不會在頁面關(guān)閉時清除,因此可以用于判斷跨頁面的刷新。

缺點(diǎn)

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

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

兼容性

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

5. 使用 performance.getEntriesByType

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

示例代碼

window.onload = function() {

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

  

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

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

  } else {

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

  }

};

工作原理

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

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

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

    • type === 'navigate': 頁面通過正常導(dǎo)航進(jìn)入。

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

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

優(yōu)點(diǎn)

  • 現(xiàn)代性performance.getEntriesByType 是較新的 API,能夠在現(xiàn)代瀏覽器中準(zhǔn)確區(qū)分頁面的導(dǎo)航方式。

  • 詳細(xì)信息:除了判斷頁面刷新,還可以獲取更多關(guān)于頁面加載性能的數(shù)據(jù),如 DNS 解析時間、請求時間等,有助于調(diào)優(yōu)頁面性能。

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

缺點(diǎn)

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

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

使用場景

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

監(jiān)控頁面加載性能示例

window.onload = function() {

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


  if (navigationEntry) {

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

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

  }

};

這種方式不僅能幫助判斷頁面加載類型,還能幫助開發(fā)者優(yōu)化頁面性能,提供更多性能數(shù)據(jù)來分析頁面加載瓶頸。

兼容性

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

總結(jié)

判斷頁面是否刷新是一個常見的需求,本文介紹了五種技術(shù)方案。每種方案都有其特定的適用場景和優(yōu)缺點(diǎn)。總結(jié)如下:

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

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



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

主站蜘蛛池模板: 午夜爽片超清 | 国产亚洲欧美日韩精品一区二区 | 中日韩精品视频 | 免费观看性生交大片 | 日本好屌色不卡视频在线观看 | 欧美在线观看h片 | 一区二区三区激情 | 国产在线精品一区二区高清不卡 | 国产萌白酱喷水在线播放尤物 | 亚洲国产呦萝小初 | 大陆精大陆国产国语精品 | 亚洲日本欧美中文幕 | 天天爱天天做天天做天天吃中 | 中文字幕在线播放 | 99亚洲综合精品 | 国产制服丝袜亚洲高清 | 国产偷人视频免费538 | 欧美日韩不卡中文网 | 国产一区国产二 | 亚洲二三区| 综合中文字幕 | 亚洲精品在看在线 | 2025中文字幕无 | 91精品视频在线看 | 操中国美女逼美女 | 日韩电影手机在线观看 | 青青青国产爽爽视频免费观看 | 亚洲人成电影网 | 免费午夜伦费影视在线观看 | 国内精品美女a在线播放 | 欧美日韩大尺码免费专区 | 鲁丝一区二 | 欧美一级aa | 国产自产视 | 国产精品日产三级在线观看 | 在线免费观看成年人视频 | 水蜜桃www| 国产日韩精品欧美一区色 | 日韩欧美一区二区三区视频在线 | 电影天堂 | 亚洲大片在线观看网址 |