html5的localstorage詳解

来源:http://www.cnblogs.com/moqiutao/archive/2017/05/08/6828346.html
-Advertisement-
Play Games

HTML API localstorage在瀏覽器的API有兩個:localStorage和sessionStorage,存在於window對象中:localStorage對應window.localStorage,sessionStorage對應window.sessionStorage。loca ...


HTML API

localstorage在瀏覽器的API有兩個:localStoragesessionStorage,存在於window對象中:localStorage對應window.localStoragesessionStorage對應window.sessionStorage
localStoragesessionStorage的區別主要是在於其生存期。

基本使用方法

localStorage.setItem("b","isaac");//設置b為"isaac"
var b = localStorage.getItem("b");//獲取b的值,為"isaac"
var a = localStorage.key(0); // 獲取第0個數據項的鍵名,此處即為“b”
localStorage.removeItem("b");//清除b的值
localStorage.clear();//清除當前功能變數名稱下的所有localstorage數據

作用域

  • 這裡的作用域指的是:如何隔離開不同頁面之間的localStorage(總不能在百度的頁面上能讀到騰訊的localStorage吧,哈哈哈)。

  • localStorage只要在相同的協議、相同的主機名、相同的埠下,就能讀取/修改到同一份localStorage數據。

  • sessionStoragelocalStorage更嚴苛一點,除了協議、主機名、埠外,還要求在同一視窗(也就是瀏覽器的標簽頁)下。

生存期

localStorage理論上來說是永久有效的,即不主動清空的話就不會消失,即使保存的數據超出了瀏覽器所規定的大小,也不會把舊數據清空而只會報錯。但需要註意的是,在移動設備上的瀏覽器或各Native App用到的WebView里,localStorage都是不可靠的,可能會因為各種原因(比如說退出App、網路切換、記憶體不足等原因)被清空。
sessionStorage的生存期顧名思義,類似於session,只要關閉瀏覽器(也包括瀏覽器的標簽頁),就會被清空。由於sessionStorage的生存期太短,因此應用場景很有限,但從另一方面來看,不容易出現異常情況,比較可靠。

數據結構

localstorage為標準的鍵值對(Key-Value,簡稱KV)數據類型,簡單但也易擴展,只要以某種編碼方式把想要存儲進localstorage的對象給轉化成字元串,就能輕鬆支持。舉點例子:把對象轉換成json字元串,就能讓存儲對象了;把圖片轉換成DataUrl(base64),就可以存儲圖片了。另外對於鍵值對數據類型來說,“鍵是唯一的”這個特性也是相當重要的,重覆以同一個鍵來賦值的話,會覆蓋上次的值。

過期時間

很遺憾,localstorage原生是不支持設置過期時間的,想要設置的話,就只能自己來封裝一層邏輯來實現:

function set(key,value){
  var curtime = new Date().getTime();//獲取當前時間
  localStorage.setItem(key,JSON.stringify({val:value,time:curtime}));//轉換成json字元串序列
}
function get(key,exp)//exp是設置的過期時間
{
  var val = localStorage.getItem(key);//獲取存儲的元素
  var dataobj = JSON.parse(val);//解析出json對象
  if(new Date().getTime() - dataobj.time > exp)//如果當前時間-減去存儲的元素在創建時候設置的時間 > 過期時間
  {
    console.log("expires");//提示過期
  }
  else{
    console.log("val="+dataobj.val);
  }
}

容量限制

目前業界基本上統一為5M,已經比cookies的4K要大很多了,省著點用吧騷年。

功能變數名稱限制

由於瀏覽器的安全策略,localstorage是無法跨域的,也無法讓子功能變數名稱繼承父功能變數名稱的localstorage數據,這點跟cookies的差別還是蠻大的。

異常處理

localstorage在目前的瀏覽器環境來說,還不是完全穩定的,可能會出現各種各樣的bug,一定要考慮好異常處理。我個人認為localstorage只是資源本地化的一種優化手段,不能因為使用localstorage就降低了程式的可用性,那種只是在console里輸出點錯誤信息的異常處理我是絕對反對的。localstorage的異常處理一般用try/catch來捕獲/處理異常。

如何測試用戶當前瀏覽器是否支持localstorage

目前普遍的做法是檢測window.localStorage是否存在,但某些瀏覽器存在bug,雖然“支持”localstorage,但在實際過程中甚至可能出現無法setItem()這樣的低級bug。因此我建議,可以通過在try/catch結構里set/get一個測試數據有無出現異常來判斷該瀏覽器是否支持localstorage,當然測試完後記得刪掉測試數據哦。

瀏覽器相容性

如何調試

在chrome開發者工具里的Resources - Local Storage面板以及Resources - Session Storage面板里,可以看到當前功能變數名稱下的localstorage數據。

在ios設備上無法重覆setItem()

另外,在iPhone/iPad上有時設置setItem()時會出現詭異的QUOTA_EXCEEDED_ERR錯誤,這時一般在setItem之前,先removeItem()就ok了。

相關插件推薦

store.js

mozilla/localForage

localFont

參考文章

W3C - Web Storage

HTML5 LocalStorage 本地存儲

MDN - Window.localStorage

轉載地址:
localstorage 必知必會


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1 #include 2 #include 3 4 using namespace std; 5 6 7 class STAbstractProductA 8 { 9 public: 10 virtual void use() = 0; 11 }; 12 13 class STProductA1: ... ...
  • 起源 user 在插著 充電器 打電話的狀況下, 為了安全起見, 避免 充電器在這時損害手機,間接造成 user 的傷害, 而有了這 feature, 在 battery voltage Vbat 4V 時,不充電; 在 battery voltage Vbat V_CC2TOPOFF_THRES) ...
  • Zookeeper是一個分散式應用程式協調服務,功能包含:配置管理、名字服務、分散式鎖、集群管理等,適合使用在讀多於寫的操作。 1. 配置管理 分散式系統都有好多機器,比如我在搭建hadoop的HDFS的時候,需要在一個主機器上(Master節點)配置好HDFS需要的各種配置文件,然後通過scp命令 ...
  • 驚悚!異能者為了美女居然..... 備忘錄模式(Memento): 在不破壞封閉的前提下, 捕獲一個對象的內部狀態, 併在該對象之外保存這個狀態. 這樣以後就可將該對象恢復到原先保存的狀態. 備忘者模式優點: 發起人備份狀態不需要自己管理, 可以備份到外部, 這樣可以很好的保持封裝的邊界, 這樣做的 ...
  • 一、日誌採集:從網路埠接收數據,下沉到logger 文件netcat-logger.conf: 啟動命令:#告訴flum啟動一個agent,指定配置參數, --name:agent的名字,flume-ng agent --conf conf --conf-file conf/netcat-logg ...
  • 持續的故事更新, 轉載 建造者模式(Builder)定義: 將一個複雜的對象的構造與它的表示分離, 是同樣的構建過程可以創建不同的表, 這樣的設計模式稱之為建造者模式 建造者模式主要需要註意的是 建造者模式解決的問題 建造者模式的使用場景 註釋 構建意思就是對象的創建 表示指的是構建對象的各種組合 ...
  • 在網上百度了很久,都是一樣的答案,而且根本執行不了~~~每次都會報錯,最後總算找到一個對的....不容易啊! 重點1:方法要寫在iframe onload裡面,載入完成再執行 重點2:用id獲取iframe元素,contentWindow獲取文檔對象 方法如下: var iFrame=documen ...
  • 最近在弄框架,用到了webpack打包,當然不可避免的遇到了開發實際問題。在實際開發中,我們不可能改一個文件,就去構建一次,於是想到了實時更新。查看webpack,看到了webpack-dev-server。 webpack-dev-server webpack已經想到了開發流程中的自動刷新,這就是 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...