Web數據存儲之localStorage和sessionStorage

Web數據存儲之localStorage和sessionStorage

學習前端以來,自己了解有localStorage和sessionStorage的相關存儲的知識,也有實踐過,但是之前只限于能用的基礎上,但最近看了一本書,深入了解了localStorage和sessionStorage,才意識到自己了解太表面,于是想借此總結一下。

1.Web存儲簡介

Web存儲分為兩種,分別對應兩個JavaScript對象:

  • 本地存儲:對應localStorage對象,用于長期保存網站的數據,并且站內任何頁面都可以訪問該數據。也就是說,如果有一個網頁利用本地存儲保存了數據,那么訪客在一天后、一星期后,甚至一年之后再上線,該數據仍然還會在那兒。
  • 會話存儲:對應sessionStorage對象,用于臨時保存針對一個窗口(或標簽頁)的數據。在訪客關閉窗口或標簽頁之前,這些對象是存在的,而關閉之后就會被瀏覽器刪除。不過,只要用戶不關閉窗口或標簽頁,就算他從你的網站跑到別人的網站然后又回來,這些數據還是會存在的。

    區別:從頁面代碼的角度說,本地存儲和會話存儲的操作完全相同。它們的區別僅在于數據的壽命。本地存儲主要用于保存訪客將來還能看到的數據,而會話存儲則用于保存那些需要從一個頁面傳遞到下一個頁面的數據。

注意:

  • 無論是本地存儲還是會話存儲,都是與網站所在的域聯系在一起的
  • 由于數據保存在用戶的計算機上(或移動設備上),這些數據也是跟計算機綁定的;頁面不能訪問保存在其他計算機上的數據。類似的,如果你用不同的用戶名登錄自己的電腦,或者使用不同的瀏覽器,那么存取的也將是不同的本地存儲數據。

    盡管HTML5沒有硬性規定存儲空間的上限,但大多數瀏覽器都把本地存儲限制為5MB以下

2.存儲數據

要把一段信息保存到本地存儲或會話存儲中,首先要為該信息想一個合適的名字。這個名字叫作鍵,將來要通過它來取回數據。

1.保存數據

要保存數據,需使用localStorage.setItem()方法:

localStorage.setItem(keyName, data);

如下所示,保存用戶名,那么這個鍵就可以叫作user_name;

localStorage.setItem("user_name", "xingxi");

當然,像這樣保存硬編碼的數據沒有多大意思。更多的情況下,可以保存動態數據,比如當前日期、數據計算的結果等,或者用戶在文本框中輸入的某些文本,等等。如:

//取得文本框
var nameInput = document.getElementById("userName");
//保存文本框中的文本
localStorage.setItem("user_name", nameInput.value);

2.讀取數據
讀取本地存儲中是數據跟保存數據一樣簡單,只需要使用localStorage.getItem()方法。

//讀取用戶名
localStorage.getItem("user_name");

無論這個名字是5秒前保存的,還是5個月前保存的,這行代碼都管用。

當然,有可能這個鍵下面尚未保存任何數據。要檢測某個鍵是否為空,可以直接測試它是否等于null。如:

if(localStorage.getItem("user_name") == null) {alert("不存在這樣的名字哦。")
}else {//將用戶名放到文本框中document.getElementById("userName").value = localStorage.getItem("user_name");
}

會話存儲也一樣簡單。唯一的區別是使用sessionStorage對象,而不是使用localStorage對象。

Web存儲還支持兩種讀寫數據的語法,除了使用getItem()和setItem(),還可以使用屬性名或索引方式。

  • 屬性名:localStorage.user_name;
  • 索引方式: localStorage[“user_name”]

注意:沒有web服務器則不能使用web存儲:在很多瀏覽器中,只有web服務器上打開的頁面才能讀寫web存儲。無論這個web服務器是遠程的還是本地的–關鍵就是不能從本地硬盤上打開頁面。這個問題的根源就在于瀏覽器要限制web存儲的空間大小。

3.瀏覽器對Web存儲的支持情況

Web存儲是現代瀏覽器支持情況最好的HTML5功能之一。在不支持Web存儲的可能就只有IE7了。如果要兼容IE7,可以使用cookie來模擬Web存儲。雖然不完美,但是可行。

4.深入Web存儲

前面已經介紹過關于Web存儲的基礎知識,接下來會介紹從Web存儲中刪除數據項,檢索當前保存的所有數據,以及處理不同的數據類型、保存自定義對象和響應存儲數據變化。

4.1 刪除數據項

這個任務只要調用removeItem()方法,傳入鍵名,即可刪除不想要的數據。

localStorage.removeItem("user_name");

或者調用clear()方法,清空網站在本地保存的會話數據。

sessionStorage.clear();

4.2 查找所有數據項

使用key()方法從本地或會話存儲中取得(當前網站保存的)所有數據項。

localStorage.key();  //可以取出所有數據項

4.3 保存數值和日期

到目前為止,我們還遺漏了關于web存儲的一個重要細節:在通過localStorage和sessionStorage保存數據時,該數據會自動被轉換為本文字符串。對于本來就是文本的數據,這當然沒有問題,但數值就不一樣了。

//oldX=5 為數值
newX = localStorage.getItem("oldX");
newX += 5;  //結果會變成‘55’

這里因為newX為字符串,javascript把5轉化為字符串了,實際運行的是’5’+ ‘5’,結果為55,而不是10。這里的解決辦法是需要給javascipt一個提示,告訴它你想計算兩個數值的加法。辦法如下:

newX = Number(localStorage.getItem("oldX"));

保存日期也是同樣的道理,結果并不會保存日期對象,而是會保存一個文本字符串。可是要將文本字符串轉回日期對象可不容易。為了解決這個問題,可以采用如下的方法:

//創建日期對象
var today = new Date();//按照YYYY/MM/DD的標準格式把日期轉換成文本字符串
var todayString = today.getFullYear() + "/" + today.getMonth() + "/" + today.getDate();
sessionStorage.setItem("session_started", todayString);
...
//取得日期文本,并基于該文本創建的日期對象,因為文本格式是有效的日期形式
today = new Date(sessionStorage.getItem("session_started"));

4.4 保存對象

為了把自定義對象保存到Web存儲中,必須先把對象轉換為文本形式。JSON是把結構化數據(類似封裝在對象中的那些值)轉化為文本的一種簡便格式。
直接調用JSON.stringify()就可以把任何對象連同其數據轉換為文本形式。調用JSON.parse()則可以把文本轉換回對象。

var params = {name: xingxi,age: 20
}
//將數據保存為JSON格式
sessionStorage.setItem("message", JSON.stringify(params));
//JSON文本轉換為原來的對象
JSON.parse(sessionStorage.getItem(message));

4.5 響應存儲變化

Web存儲為我們提供了在不同瀏覽器窗口間通信的機制。具體來說,就是在本地存儲或會話存儲發生變化時,其他查看同一頁面或同一站點中其他頁面的窗口就會觸發window.onStorage事件。
所謂存儲變化,指的就是向存儲中添加新數據項,修改既有數據項,刪除數據項或清除所有數據。但是,那些對存儲不產生任何影響的操作(如用既有的鍵名保存相同的值,或者清除原本就是空的存儲空間),不會引發onStorage事件

通過認真深入的學習這一塊的知識,現在對Web存儲有了比較深入的了解。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/249656.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/249656.shtml
英文地址,請注明出處:http://en.pswp.cn/news/249656.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

(四)RabbitMQ消息隊列-服務詳細配置與日常監控管理

(四)RabbitMQ消息隊列-服務詳細配置與日常監控管理 原文:(四)RabbitMQ消息隊列-服務詳細配置與日常監控管理RabbitMQ服務管理 啟動服務:rabbitmq-server -detached【 /usr/local/rabbitmq/sbin/rabbitmq-server -deta…

oracle中delete、truncate、drop的區別 (轉載)

一、delete 1、delete是DML,執行delete操作時,每次從表中刪除一行,并且同時將該行的的刪除操作記錄在redo和undo表空間中以便進行回滾(rollback)和重做操作,但要注意表空間要足夠大,需要手動提交…

前端開發工程化探討--基礎篇(長文)

轉載自UC資深前端工程師張云龍的github 喂喂喂,那個切圖的,把頁面寫好就發給研發工程師套模板吧。 你好,切圖仔。 不知道你的團隊如何定義前端開發,據我所知,時至今日仍然有很多團隊會把前端開發歸類為產品或者設計崗…

Python讀取Json字典寫入Excel表格的方法

需求: 因需要將一json文件中大量的信息填入一固定格式的Excel表格,單純的復制粘貼肯定也能完成,但是想偷懶一下,于是借助Python解決問題。 環境: Windows7 Python2.7 Xlwt 具體分析: 原始文件為json列表&am…

Spring-BeanFactory源碼分析

正式進入Spring 源碼分析這個模塊了,對于spring這個龐大的工程,如果要一點點的完全分析是非常困難的,對于應用型框架,我還是偏向于掌握思想或者設計,而不是記住代碼,對于初次看spring源碼,相信大…

Linux查看修改時間、時區

同步網絡時間 yum install ntpntpdate time.nist.gov timedatectl set-timezone Asia/Shanghai如果上面time.nist.gov服務器同步不了,可以換下面幾個時間服務器試試:time.nist.govtime.nuri.net0.asia.pool.ntp.org1.asia.pool.ntp.org2.asia.pool.ntp.o…

我所知道的HTTP和HTTPS

摘要:相比之前的傳輸協議,HTTP/2在底層方面做了很多優化。有安全、省時、簡化開發、更好的適應復雜頁面、提供緩存利用率等優勢,阿里云早在去年發布的CDN6.0服務就已正式支持HTTP/2,訪問速度最高可提升68%。 寫在前面 超文本傳輸…

sql server常用性能計數器

https://blog.csdn.net/kk185800961/article/details/52462913?utm_sourceblogxgwz5 https://blog.csdn.net/kk185800961/article/details/27657239 以下部分轉自:http://www.cnblogs.com/zhijianliutang/p/4174697.html 常規計數器 收集操作系統服務器的服務器性能…

Python中正反斜杠('/'和'\')的意義

剛剛在學習些測試報告的時候,出現一個路徑的問題,找了很久的原因,竟然是少了一個反斜杠引起的,在此順便記錄一下正反斜杠的作用。 在Python中,記錄路徑時有以下幾種寫法,如:(大家都知…

什么是IOC容器

1.IOC不是一種技術,只是一種思想,一個重要的面向對象編程的法則,它能指導我們如何設計出松耦合,更優良的程序。傳統應用程序都是由我們在類內部主動創建依賴對象,從而導致類與類之間高耦合,難于測試&#x…

Jenkins配置與使用

Jenkins是一個開源軟件項目,旨在提供一個開放易用的軟件平臺,使軟件的持續集成變成可能。Jenkins是基于Java開發的一種持續集成工具,用于監控持續重復的工作,功能包括:1、持續的軟件版本發布/測試項目。2、監控外部調用…

fastDFS使用

fastDFS : 分布式文件系統C語言開發,fastDFS為互聯網量身定制,考慮到了冗余備份,負載均衡,線性擴容...很容易搭建集群文件存儲系統.存儲在fastDFS圖片:相當于存儲在本地磁盤一樣訪問圖片:相當于訪問本地磁盤存儲結構:組名/虛擬磁盤路徑/動態生成文件名.擴展名192.168.100.20/gr…

本地環境用eclipse搭建spring源碼環境

對于JAVA和.NET開發人員來講Spring框架并不陌生,對于想進行spring源碼學習的同學來講,在本地下載和構建spring項目很有必要。以下簡要說明下Spring源碼的下載和在eclipse下的構建方式。 工具/原料 JDK Eclipse 我們需要從源碼庫下載Spring的源碼文件到本…

SpringToolsSuite (STS)或Eclipse安裝gradle

對于新手剛進入職場,不知怎么在Spring Tools Suite (STS)或Eclipse上安裝gradle,因為該項目自動化構建開源工具在一些企業中是要用的。本經驗介紹如何安裝。 工具/原料 Spring Tools Suite (STS)或Eclipse開發工具 gradle-5.0-all.zip壓縮包 下載Gradle…

[NOI2007]貨幣兌換

題目 先來畫一畫柿子 設\(dp_i\)表示你第\(i\)天之后最多剩下多少錢 考慮一下對于\(i\)的轉移,我們肯定要在之前枚舉一天\(j\)這一天把所有的東西買進來,之后在\(i\)天賣掉 設那天買進\(A\)的量為\(d_a\),買進\(B\)的量為\(d_b\) 我們可以得到…

spring-beans模塊分析

描述:spring-beans負責實現Spring框架的IOC模塊 UML結構圖如下: AbstractBeanFactory:BeanFactory接口的抽象實現類,提供了ConfigurableBeanFactory 完整SPI。 通過DefaultSingletonBeanRegistry實現了單例緩存(singleton cache). 實現了通過…

spark-streaming first insight

一、 Spark Streaming 構建在Spark core API之上,具備可伸縮,高吞吐,可容錯的流處理模塊。 1)支持多種數據源,如Kafka,Flume,Socket,文件等; Basic sources: Sources dir…

DHCP服務器 出現的故障

系統版本:Windows Server 2008 R2 Standard 故障現象:近段時間,我們核心網絡DHCP服務器,總是發現有掉線重起現象,大約每10分鐘至30分鐘不定時會重起。 故障代碼:關鍵系統進程 C:\Windows\system32\lsass.ex…

雙親委派

雙親委派模式的工作原理的是:如果一個類加載器收到了類加載請求,它并不會自己先去加載,而是把這個請求委托給父類的加載器去執行,如果父類加載器還存在其父類加載器,則進一步向上委托,依次遞歸,請求最終將到…

程序設計入門-C語言基礎知識-翁愷-第六周:數組-詳細筆記(六)

目錄 第六章:數組6-1 數組6-2 數組計算6.3 課后習題第六章:數組 6-1 數組 題目:讓用戶輸入一組整數以-1結束輸入,算出這組數的平均值,并且輸出大于平均值的數。 我們需要記錄用戶所有輸入的數字才能在判斷出平均值后輸…