在現代的網頁應用中,我們經常需要用到JavaScript來為我們的網頁增添一些互動和動態效果。但是當我們需要對網頁進行編輯或更改時,我們很有可能需要重新加載一次,這樣就會導致我們之前做的一些操作、渲染或者狀態信息都消失了。那么怎么樣才能讓JavaScript保持前臺呢?
第一種方式是使用Local Storage。
if(localStorage.getItem('data') !== null) { var data = JSON.parse(localStorage.getItem('data')); // 在這里恢復數據的狀態 } window.addEventListener('beforeunload', function() { // 在這里將數據序列化然后保存至 local storage localStorage.setItem('data', JSON.stringify(data)); });
這樣我們就可以在網頁關閉后重新打開頁面,或者在瀏覽器的其他頁面間切換之后,還原之前的操作和狀態信息。
第二種方式是使用Cookie。
if(document.cookie != "") { var cookies = document.cookie.split(";"); for(var i = 0; i< cookies.length; i++) { var name = cookies[i].split("=")[0].trim(); var value = cookies[i].split("=")[1]; // 在這里恢復名為"name" 的 cookie 值 } } window.addEventListener('beforeunload', function() { // 在這里保存名為 "name" 的 cookie 值 document.cookie = "name=xxx"; });
與Local Storage不同的是,Cookie數據在每次HTTP請求時會通過HTTP頭部發送給服務器端,因此保存在Cookie中的數據應該是比較小的,例如表單的數據、用戶名、購物車信息等等。相對于Local Storage而言,Cookie的優勢是可以跨頁面讀取,比較方便實現多個站點之間共享數據的需求。
第三種方式是使用Fragment Identifier。
var isRestored = false; window.addEventListener('load', function() { if(window.location.hash != "" && !isRestored) { var hash = window.location.hash.substring(1); // 在這里根據 hash 值恢復數據狀態 isRestored = true; } }); window.addEventListener('beforeunload', function() { // 在這里將數據序列化加入 hash 值中 window.location.hash = '#' + data; });
Fragment Identifier一般用于在URL中作為跳轉的標記,例如當我們在論壇中對某個帖子點贊時,可以自動返回到之前的位置。在上面的代碼中,我們通過監聽onload事件和beforeunload事件,來使頁面在刷新或者重載的時候始終保存之前的狀態。
以上三種方式中,Local Storage應該是使用最廣泛的一種方式了,尤其對于需要處理大量數據狀態的應用而言。但是在一些場景下,我們也可以考慮選擇Cookie或者Fragment Identifier來達到保持前臺的效果。