亚洲乱色熟女一区二区三区丝袜,天堂√中文最新版在线,亚洲精品乱码久久久久久蜜桃图片,香蕉久久久久久av成人,欧美丰满熟妇bbb久久久

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

在 Web 中判斷頁(yè)面是不是刷新

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

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

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

1. 使用 window.name

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

代碼示例

window.onload = function() {

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

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

  } else {

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

    window.name = 'isRefreshed';

  }

};

工作原理

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

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

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

  • 簡(jiǎn)單易用:不依賴(lài)外部存儲(chǔ)機(jī)制或服務(wù)器端邏輯。

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

缺點(diǎn)

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

  • 手動(dòng)清理:在某些場(chǎng)景下可能需要手動(dòng)清除 window.name,例如頁(yè)面關(guān)閉時(shí)。

兼容性

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

2. 使用 sessionStorage

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

window.onload = function() {

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

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

  } else {

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

  }

  sessionStorage.setItem('isRefreshed', true);

};

工作原理

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

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

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

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

  • 簡(jiǎn)單且不依賴(lài)服務(wù)器端邏輯。

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

缺點(diǎn)

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

兼容性

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

3. 使用 performance.navigation API

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

window.onload = function() {

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

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

  } else {

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

  }

};

屬性解釋

  • performance.navigation.TYPE_RELOAD: 表示頁(yè)面通過(guò)刷新加載。

  • 其他類(lèi)型(如 TYPE_NAVIGATE)表示正常導(dǎo)航。

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

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

  • 不需要手動(dòng)存儲(chǔ)狀態(tài)。

缺點(diǎn)

  • 該 API 正在逐步棄用,未來(lái)的瀏覽器可能不會(huì)支持。

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

兼容性

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

4. 使用 beforeunload 事件

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

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

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

});


window.onload = function() {

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

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

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

  } else {

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

  }

};

工作原理

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

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

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

  • 靈活,可以處理不同類(lèi)型的頁(yè)面離開(kāi)操作。

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

缺點(diǎn)

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

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

兼容性

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

5. 使用 performance.getEntriesByType

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

示例代碼

window.onload = function() {

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

  

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

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

  } else {

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

  }

};

工作原理

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

  • 通過(guò)檢查 navigationEntry.type,可以確定頁(yè)面加載的類(lèi)型:

    • type === 'reload': 頁(yè)面通過(guò)刷新加載。

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

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

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

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

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

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

  • 無(wú)狀態(tài)管理:無(wú)需依賴(lài) sessionStorage、localStorage 等外部狀態(tài),避免了狀態(tài)同步問(wèn)題。

缺點(diǎn)

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

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

使用場(chǎng)景

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

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

window.onload = function() {

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


  if (navigationEntry) {

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

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

  }

};

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

兼容性

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

總結(jié)

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

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

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



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