localStorage:
localStorage储存的数据是永久性的,除非自己刻意删除。
localStorage的作用域受限制,如果用firefox访问,下次用另一个浏览器再次访问的时候,是无法获取上次的数据。
非同源文档无法共享数据。同源主要是通过主机名、协议、端口来确定。
使用:
// 以userName储存一个张三
localStorage.setItem('userName','张三');
localStorage.getItem('userName'); // 拿到张三
localStorage.removeItem('userName'); // 删除userName的数据
localStorage.clear(); // 删除全部数据
其他浏览器不可用的时候依然可以依赖其他储存机制:
var memory = window.localStorage || (window.UserDataStorage && new UserDataStorage()) ||
new cookieStorage();
var userName = memory.getItem('userName'); // 在对应的机制中查询数据。
sessionStorage:
sessionStroage储存有效期,窗口或标签页关闭了,数据就被删除了。
非同源文档无法共享数据。
如果同源的文档渲染在不同的浏览器中,那么他们互相之间拥有的数据是各自的,无法共享。
使用:
sessionStorage.setItem('userName','张三'); // 储存数据
sessionStorage.getItem('userName'); // 获取数据
sessionStorage.removeItem('userName'); //删除单个
sessionStorage.clear(); // 删除全部
cookie
cookie默认有效期很短,一旦用户关闭浏览器,数据就丢失了。它的作用域并不是局限在浏览器单个窗口,而是整个浏览器的进程。如果想要延长有效期,可以通过max-age属性,要明确告诉浏览器有效期为多张,单位为毫秒。一旦设置了有效期,浏览器会将数据储存在一个文件中,直到通过了指定的有效期才会删除。
由于cookie的名/值是不允许包含分号,逗号,空白符,因此在储存前要使用核心的全局函数encodeURIComponent()对值进行编码。读取的时候也要decodeURIComponent()进行解码。
不允许浏览器保存超过300个cookie,每个web服务器保存的cookie数不能超过20个。
每个cookie保存的数据不能超过4kb。
现代浏览器已经允许cookie总数超过300个,但部分浏览器还是4kb。
使用:
// document.lastModified 返回文档被修改的最后日期与时间
document.cookie = 'version='+encodeURIComponent(document.lastModified);
//保存cookie且设置有效期:
function setcookie(name,value,daysToLive){
var cookie = name+"="+encodeURIComponent(value); //编码,进行转义分号等等。
if(typeof daysToLive ==="number"){ //如果是一个数字
cookie +=";max-age= "+(daysToLive*60*60*24); // 设置max-age属性时间
document.cookie = cookie; // 最后编码且设置好的进行保存到cookie。
}
}
读取cookie:
function getcookie(){
var cookie = {};
var all = doucment.cookie; // 获取所有的cookie值
if(all===" "){
return cookie;
}
var list = all.split("; ") // 分离出名/值
for(var i = 0; i<list.length; i++){
var cookie = list[i];
var p = cookie.indexOf("="); //找到第一个=号
var name = cookie.substring(0,p); // 拿到cookie名
var value = cookie.substring(p+1); // 获取cookie对应的值
value = documentURIComponent(value); 对其值进行解码
cookie[name] = value; // 将名/值对储存到对象中。
}
return cookie;
}
利用userData持久化数据。
var memory = document.createElement('div');
memory.id = "memory";
memory.style.display = 'none';
memory.style.behavior = "url('#default#userData')"; // 附加userData行为
document.body.appendChild(memory);
赋予了userDta行为,该元素就拥有了load()和save()方法。load用于载入数据,载入数据后可以使用getAttribute()查询数据,setAttribute()设置属性。然后调用sava()方法可以储存新的数据。
通过userData储存的数据,除非手动删除,否则永不失效。可以设置expires属性来指定它的过期时间。
userData允许储存的数据量比cookie大,但是比localStorage与sessionStorage小。
memory.load('myStoredData'); // 根据指定名,载入对应的数据
var name = memory.getAttribute('userName'); // 获取其中数据片段
if(!name){ //如果无指定的片段
name = prompt('What is your name?');
memory.setAttibute('userName',name);
memory.save('myStoredData'); // 保存
}
var now = (new Date()).getTime();
var expires = now + 100*24*60*60*1000; // 距离当前时间100天,换成了毫秒数
expires = new Date(expires).toUTCString(); // 转换成字符串
memory.expires = expires; // 通过expries属性设置userData过期时间
实现基于IE的userData部分储存API:
function UserDataStorage(maxage){
var memory = document.createElement('div');
memory.style.display = 'none';
memory.style.behavior = "url('#default#userData')";
document.body.appendChild(memory);
if(maxage){
var now = new Date().getTime(); // 当前时间
var expires = now + maxage*1000; // 当前时间加上有效期
memory.expires = new Data(expires).toUTCString(); // 转为字符串
}
memory.load('UserDataStorage'); // 根据指定名,载入对应的数据
this.getItem = function(key){
return memory.getAttribute(key) || null;
};
this.setItem = function(key,value){
memory.setAttribute(key,value); // 设置属性的来保存数据
memory.save('UserDataStorage'); // 保存数据改变后的状态
}
this.removeItem = function(key){
memory.removeAttribute(key); // 删除储存的数据
memory.save("UserDataStroage"); // 保存数据改变后的状态
}
}