JavaScript高級程序設(shè)計 客戶端存儲學(xué)習(xí)筆記
更新時間:2011年09月10日 02:50:11 作者:
JavaScript高級程序設(shè)計 客戶端存儲學(xué)習(xí)筆記,在客戶端用于存儲會話信息
第十九章 客戶端存儲
1.cookie
①最初是在客戶端用于存儲會話信息的。
1.1 限制
①cookie在性質(zhì)上是綁定在特定的域名下的。當(dāng)設(shè)定了一個cookie后,再給創(chuàng)建它的域名發(fā)送請求時,都會包含這個cookie。
②cookie的限制:
□IE6以及更低版本限制每個域名最多20個cookie。
□IE7和之后版本每個域名最多50個cookie。
□Firefox50個
□Opera50個
□Safari和Chrome無硬性規(guī)定
③cookie尺寸限制:4096字節(jié)(加減1)的長度限制。尺寸限制到一個域下所有的cookie,而非每個cookie單獨(dú)限制。
1.2 cookie的成分
名稱、值、域、路徑、失效時間、安全標(biāo)志。
1.3 JavaScript中的cookie
JavaScript操作cookie是通過BOM的document.cookie屬性。
①當(dāng)用來獲取屬性時,document.cookie返回當(dāng)前頁面可用的所有cookie的字符串,一系列由分號隔開的名-值對。
name1=value;name2=value2;name3=value3
所有名字和值都經(jīng)URL編碼,所以必須使用decodeURIComponent()來解碼。
②用于設(shè)置值時,document.cookie屬性可以設(shè)為一個新cookie字符串。設(shè)置document.cookie并不會覆蓋cookie,除非設(shè)置的cookie名已經(jīng)存在。設(shè)置前必須用encodeURIComponent()編碼。
③沒有刪除cookie的直接方法。需要使用相同的路徑、域和安全選項(xiàng)再次設(shè)置cookie,并將失效時間設(shè)為過去的時間。
□cookie讀取、寫入和山粗功能:
var CookieUtil = {
get : function(name){
var cookieName = encodeURIComponent(name) + "=",
cookieStart = document.cookie.indexOf(cookieName),
cookieValue = null;
if(cookieStart > -1){
var cookieEnd = document.cookie.indexOf(";",cookieStart)
if(cookieEnd == -1){
cookieEnd = document.cookie.length;
}
cookieValue = decodeURIComponent(document.cookie.substring(cookieStart+cookieName.length,cookieEnd));
}
return cookieValue;
},
set : function(name, value, expires, path, domain, secure){
var cookieText = encodeURIComponent(name) + "=" + encodeURIComponent(value);
if(expires instanceof Date){
cookieText += ";expires=" + expires.toGMTString();
}
if(path){
cookieText += "; path=" + path;
}
if(domain){
cookieText += "; domain=" + domian;
}
if(secure){
cookieText += "; secure";
}
document.cookie = cookieText;
},
unset : function(name, path, domain, secure){
this.set(name, "", new Date(0), path, domain, secure);
}
};
1.4 子cookie
①子cookie是存放單個cookie中更小段的數(shù)據(jù)。也就是使用cookie值來存儲多個名稱-值對。
name=name1=value1&name2=value2&name3=value3
□操作子cookie,get、getAll、set、setAll、unset、unsetAll:
var subCookieUtil = {
get : function(name, subName){
var subCookies = this.getAll(name);
if(subCookies){
return subCookies[subName];
}else{
return null;
}
},
getAll : function(name){
var cookieName = encodeURIComponent(name) + "=",
cookieStart = document.cookie.indexOf(cookieName),
cookieValue = null,
result = {};
if(cookieStart > -1){
var cookieEnd = document.cookie.indexOf(";",cookieStart);
if(cookieEnd == -1){
cookieEnd = document.cookie.length;
}
cookieValue = document.cookie.substring(cookieStart + cookieName.length,cookieEnd);
if(cookieValue.length > 0){
var subCookies = cookieValue.split("&");
for(var i=0, len=subCookies.length; i<len; i++){
var parts = subCookies[i].split("=");
result[decodeURIComponent(parts[0])] = decodeURIComponent(parts[1]);
}
return result;
}
}
return null;
},
Set : function(name, subName, value, expires, path, domain, secure){
Var subCookies = this.getAll(name) || {};
Subcookies[subName] = value;
This.setAll(name, subcookies, expires, path, domain, secure);
},
setAll : function(name, subcookies, expires, path, domain, secure){
var cookieText = encodeURIComponent(name) + "=";
var subcookieParts = new Array();
for(var subName in subcookies){
if(subName.length>0 && subcookies.hasOwnProperty(subName)){
subcookieParts.push(encodeURIComponent(subName) + "=" + encodeURIComponent(subcookies[subName]));
}
}
if(cookieParts.length>0){
cookieText += subcookieParts.join("&");
if(expires instanceof Date){
cookieText += ";expires=" + expires.toGMTString();
}
if(path){
cookieText += ";path=" + path;
}
if(domain){
cookieText += ";path" + path;
}
if(secure){
cookieText += ";secure";
}
}else{
cookieText += ";expires=" + (new Date(0)).toGMTString();
}
document.cookie = cookieText;
},
unset : function(name, subName, path, domain, secure){
var subcookies = this.getAll(name);
if(subcookies){
delete subcookies[subName];
this.setAll(name, subcookies, null, path, domain, secure);
}
},
unsetAll : function(name, path, domain, secure){
this.setAll(name, null, new Date(0), path, domain, secure);
}
}
2.IE用戶數(shù)據(jù)(不太實(shí)用,略之)
3.DOM存儲機(jī)制
①DOM存儲兩個目標(biāo)
□提供一種在cookie之外存儲會話數(shù)據(jù)的途徑。
□提供一種存儲大量可以跨越會話存在的數(shù)據(jù)的機(jī)制。
②支持情況:
□Firefox2支持部分
□IE8+、Safari3.1+、Chrome1.0+、Firefox3.1+全部實(shí)現(xiàn)。
3.1 存儲類型
①Storage類型用來存儲最大限(因?yàn)g覽器而異)的名值對。Storage的實(shí)例和其他對象行為一樣,有下列額外的方法。
□clear():刪除所有值。
□getItem(name):根據(jù)指定的名字name獲取相應(yīng)的值。
□key(index):在指定的數(shù)字位置獲取該位置的名字。
□removeItem(name):刪除由名字name指定的名值對。
□setItem(name, value):為指定的名字name設(shè)置一個對應(yīng)的值。
□可通過屬性訪問值。
3.2 sessionStorage對象
①sessionStorage對象存儲特定于某個會話的數(shù)據(jù),也即數(shù)據(jù)只保存到瀏覽器關(guān)閉。存儲在sessionStorage中的數(shù)據(jù)可以跨越頁面刷新而存在。
②sessionStorage對象綁定于某個服務(wù)器會話,所以文件在本地運(yùn)行時不可用。存儲在sessionStorage中數(shù)據(jù)只能由最初給對象存儲數(shù)據(jù)的頁面訪問到,對多頁面應(yīng)用有限制。
③sessionStorage對象是Storage類型的實(shí)例。
3.3 globalStorage對象
①只在Firefox2中實(shí)現(xiàn)??缭綍挻鎯?shù)據(jù),并且有特定的訪問限制。
//保存數(shù)據(jù)
globalStorage["wrox.com"].name = "Nicholas";
//獲取數(shù)據(jù)
var name = globalStorage["wrox.com"].name;
3.4 localStorage對象
①localStorage上不能指定任何訪問性規(guī)則;規(guī)則事先設(shè)定好了。為了能訪問到同一個localStorage對象,頁面必須來自同一個域名(子域名無效),使用同一種協(xié)議,在同一個端口上。
②數(shù)據(jù)保留到通過JavaScript刪除或者是用戶清除瀏覽器緩存。
用例:
localStorage.setItema("name","Nicholas");
localStorage.book = "Profession JavaScript";
var name = localStorage.getItem("name");
var book = localStorage.book;
③兼容globalStorage:
function getLocalStorage(){
if(typeof localStorage == "object"){
return localStorage;
}else if(typeof globalStorage == "object"){
retrun globalStorage[location,host];
}else{
throw new Error("no localstorage");
}
3.5 StorageItem類型
①Storage對象中所有存儲的每個項(xiàng)目都是StorageItem的實(shí)例
□value屬性:被存儲的值。
□secure屬性:只有腳本使用HTTPS協(xié)議訪問頁面才可設(shè)置。通過https訪問默認(rèn)為true。
3.6 storage事件
對storage對象進(jìn)行修改,都會在文檔上觸發(fā)storage事件。其事件對象event有以下屬性:
□domain:進(jìn)行變更的存儲的域名。
□key:進(jìn)行設(shè)置或者是刪除的鍵名。
□newValue:要將該鍵設(shè)為的值,如果是刪除則為null。
□oldValue:被更改之前的值。
3.7 限制
DOM存儲的限制也和瀏覽器相關(guān)。
1.cookie
①最初是在客戶端用于存儲會話信息的。
1.1 限制
①cookie在性質(zhì)上是綁定在特定的域名下的。當(dāng)設(shè)定了一個cookie后,再給創(chuàng)建它的域名發(fā)送請求時,都會包含這個cookie。
②cookie的限制:
□IE6以及更低版本限制每個域名最多20個cookie。
□IE7和之后版本每個域名最多50個cookie。
□Firefox50個
□Opera50個
□Safari和Chrome無硬性規(guī)定
③cookie尺寸限制:4096字節(jié)(加減1)的長度限制。尺寸限制到一個域下所有的cookie,而非每個cookie單獨(dú)限制。
1.2 cookie的成分
名稱、值、域、路徑、失效時間、安全標(biāo)志。
1.3 JavaScript中的cookie
JavaScript操作cookie是通過BOM的document.cookie屬性。
①當(dāng)用來獲取屬性時,document.cookie返回當(dāng)前頁面可用的所有cookie的字符串,一系列由分號隔開的名-值對。
name1=value;name2=value2;name3=value3
所有名字和值都經(jīng)URL編碼,所以必須使用decodeURIComponent()來解碼。
②用于設(shè)置值時,document.cookie屬性可以設(shè)為一個新cookie字符串。設(shè)置document.cookie并不會覆蓋cookie,除非設(shè)置的cookie名已經(jīng)存在。設(shè)置前必須用encodeURIComponent()編碼。
③沒有刪除cookie的直接方法。需要使用相同的路徑、域和安全選項(xiàng)再次設(shè)置cookie,并將失效時間設(shè)為過去的時間。
□cookie讀取、寫入和山粗功能:
var CookieUtil = {
get : function(name){
var cookieName = encodeURIComponent(name) + "=",
cookieStart = document.cookie.indexOf(cookieName),
cookieValue = null;
if(cookieStart > -1){
var cookieEnd = document.cookie.indexOf(";",cookieStart)
if(cookieEnd == -1){
cookieEnd = document.cookie.length;
}
cookieValue = decodeURIComponent(document.cookie.substring(cookieStart+cookieName.length,cookieEnd));
}
return cookieValue;
},
set : function(name, value, expires, path, domain, secure){
var cookieText = encodeURIComponent(name) + "=" + encodeURIComponent(value);
if(expires instanceof Date){
cookieText += ";expires=" + expires.toGMTString();
}
if(path){
cookieText += "; path=" + path;
}
if(domain){
cookieText += "; domain=" + domian;
}
if(secure){
cookieText += "; secure";
}
document.cookie = cookieText;
},
unset : function(name, path, domain, secure){
this.set(name, "", new Date(0), path, domain, secure);
}
};
1.4 子cookie
①子cookie是存放單個cookie中更小段的數(shù)據(jù)。也就是使用cookie值來存儲多個名稱-值對。
name=name1=value1&name2=value2&name3=value3
□操作子cookie,get、getAll、set、setAll、unset、unsetAll:
var subCookieUtil = {
get : function(name, subName){
var subCookies = this.getAll(name);
if(subCookies){
return subCookies[subName];
}else{
return null;
}
},
getAll : function(name){
var cookieName = encodeURIComponent(name) + "=",
cookieStart = document.cookie.indexOf(cookieName),
cookieValue = null,
result = {};
if(cookieStart > -1){
var cookieEnd = document.cookie.indexOf(";",cookieStart);
if(cookieEnd == -1){
cookieEnd = document.cookie.length;
}
cookieValue = document.cookie.substring(cookieStart + cookieName.length,cookieEnd);
if(cookieValue.length > 0){
var subCookies = cookieValue.split("&");
for(var i=0, len=subCookies.length; i<len; i++){
var parts = subCookies[i].split("=");
result[decodeURIComponent(parts[0])] = decodeURIComponent(parts[1]);
}
return result;
}
}
return null;
},
Set : function(name, subName, value, expires, path, domain, secure){
Var subCookies = this.getAll(name) || {};
Subcookies[subName] = value;
This.setAll(name, subcookies, expires, path, domain, secure);
},
setAll : function(name, subcookies, expires, path, domain, secure){
var cookieText = encodeURIComponent(name) + "=";
var subcookieParts = new Array();
for(var subName in subcookies){
if(subName.length>0 && subcookies.hasOwnProperty(subName)){
subcookieParts.push(encodeURIComponent(subName) + "=" + encodeURIComponent(subcookies[subName]));
}
}
if(cookieParts.length>0){
cookieText += subcookieParts.join("&");
if(expires instanceof Date){
cookieText += ";expires=" + expires.toGMTString();
}
if(path){
cookieText += ";path=" + path;
}
if(domain){
cookieText += ";path" + path;
}
if(secure){
cookieText += ";secure";
}
}else{
cookieText += ";expires=" + (new Date(0)).toGMTString();
}
document.cookie = cookieText;
},
unset : function(name, subName, path, domain, secure){
var subcookies = this.getAll(name);
if(subcookies){
delete subcookies[subName];
this.setAll(name, subcookies, null, path, domain, secure);
}
},
unsetAll : function(name, path, domain, secure){
this.setAll(name, null, new Date(0), path, domain, secure);
}
}
2.IE用戶數(shù)據(jù)(不太實(shí)用,略之)
3.DOM存儲機(jī)制
①DOM存儲兩個目標(biāo)
□提供一種在cookie之外存儲會話數(shù)據(jù)的途徑。
□提供一種存儲大量可以跨越會話存在的數(shù)據(jù)的機(jī)制。
②支持情況:
□Firefox2支持部分
□IE8+、Safari3.1+、Chrome1.0+、Firefox3.1+全部實(shí)現(xiàn)。
3.1 存儲類型
①Storage類型用來存儲最大限(因?yàn)g覽器而異)的名值對。Storage的實(shí)例和其他對象行為一樣,有下列額外的方法。
□clear():刪除所有值。
□getItem(name):根據(jù)指定的名字name獲取相應(yīng)的值。
□key(index):在指定的數(shù)字位置獲取該位置的名字。
□removeItem(name):刪除由名字name指定的名值對。
□setItem(name, value):為指定的名字name設(shè)置一個對應(yīng)的值。
□可通過屬性訪問值。
3.2 sessionStorage對象
①sessionStorage對象存儲特定于某個會話的數(shù)據(jù),也即數(shù)據(jù)只保存到瀏覽器關(guān)閉。存儲在sessionStorage中的數(shù)據(jù)可以跨越頁面刷新而存在。
②sessionStorage對象綁定于某個服務(wù)器會話,所以文件在本地運(yùn)行時不可用。存儲在sessionStorage中數(shù)據(jù)只能由最初給對象存儲數(shù)據(jù)的頁面訪問到,對多頁面應(yīng)用有限制。
③sessionStorage對象是Storage類型的實(shí)例。
3.3 globalStorage對象
①只在Firefox2中實(shí)現(xiàn)??缭綍挻鎯?shù)據(jù),并且有特定的訪問限制。
//保存數(shù)據(jù)
globalStorage["wrox.com"].name = "Nicholas";
//獲取數(shù)據(jù)
var name = globalStorage["wrox.com"].name;
3.4 localStorage對象
①localStorage上不能指定任何訪問性規(guī)則;規(guī)則事先設(shè)定好了。為了能訪問到同一個localStorage對象,頁面必須來自同一個域名(子域名無效),使用同一種協(xié)議,在同一個端口上。
②數(shù)據(jù)保留到通過JavaScript刪除或者是用戶清除瀏覽器緩存。
用例:
localStorage.setItema("name","Nicholas");
localStorage.book = "Profession JavaScript";
var name = localStorage.getItem("name");
var book = localStorage.book;
③兼容globalStorage:
function getLocalStorage(){
if(typeof localStorage == "object"){
return localStorage;
}else if(typeof globalStorage == "object"){
retrun globalStorage[location,host];
}else{
throw new Error("no localstorage");
}
3.5 StorageItem類型
①Storage對象中所有存儲的每個項(xiàng)目都是StorageItem的實(shí)例
□value屬性:被存儲的值。
□secure屬性:只有腳本使用HTTPS協(xié)議訪問頁面才可設(shè)置。通過https訪問默認(rèn)為true。
3.6 storage事件
對storage對象進(jìn)行修改,都會在文檔上觸發(fā)storage事件。其事件對象event有以下屬性:
□domain:進(jìn)行變更的存儲的域名。
□key:進(jìn)行設(shè)置或者是刪除的鍵名。
□newValue:要將該鍵設(shè)為的值,如果是刪除則為null。
□oldValue:被更改之前的值。
3.7 限制
DOM存儲的限制也和瀏覽器相關(guān)。
相關(guān)文章
精解window.setTimeout()&window.setInterval()使用方式與參數(shù)傳遞問題!
精解window.setTimeout()&window.setInterval()使用方式與參數(shù)傳遞問題!...2007-11-11JavaScript es6中var、let以及const三者區(qū)別案例詳解
這篇文章主要介紹了JavaScript es6中var、let以及const三者區(qū)別案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08原創(chuàng)javascript小游戲?qū)崿F(xiàn)代碼
javascript小游戲?qū)崿F(xiàn)代碼,喜歡用javascript實(shí)現(xiàn)游戲效果代碼的朋友可以參考下。2010-08-08js 靜態(tài)動態(tài)成員 and 信息的封裝和隱藏
一下用面向?qū)ο蟮南嚓P(guān)概念來解釋js中的仿面向?qū)ο螅驗(yàn)閖s中不像其他語言,不存在面向?qū)ο笳Z言的相關(guān)特性2011-05-05javascript+xml技術(shù)實(shí)現(xiàn)分頁瀏覽
基于web的技術(shù)中,分頁是一個老的不能再老的,但大家津津樂道的問題,隨著xml技術(shù)的日漸應(yīng)用,把xml應(yīng)用到分頁當(dāng)中,也是一種可能,當(dāng)然網(wǎng)上的教程很多,當(dāng)我都是看得稀里糊涂,索性自己寫一個,與大家分享、指正。2008-07-07javascript實(shí)現(xiàn)動態(tài)顯示顏色塊的報表效果
本文主要介紹了javascript實(shí)現(xiàn)動態(tài)顯示顏色塊的報表效果的相關(guān)知識。具有很好的參考價值。下面跟著小編一起來看下吧2017-04-04echarts設(shè)置圖例顏色和地圖底色的方法實(shí)例
最近項(xiàng)目要使用echarts進(jìn)行數(shù)據(jù)可視化,所以下面這篇文章主要給大家介紹了關(guān)于echarts設(shè)置圖例顏色和地圖底色的相關(guān)資料,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08TypeScript基礎(chǔ)入門教程之三重斜線指令詳解
這篇文章主要給大家介紹了關(guān)于TypeScript基礎(chǔ)入門教程之三重斜線指令的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-10-10