本地存储

web在数据在本地存储有以下三种:
1.cookie;
2.Web Storage,来自HTML5;
3.IE的userData,不建议使用。

1 cookie

原理
用户浏览器第一次向服务器请求(Request)时,服务器会放回Set-Cookie:XXX;
浏览器会记下XXX,当浏览器再次请求服务器时,就会带上Cookie:XXX。
注意事项
1.根据域名判别;
2.cookie名称不区分大小写。
3.其值是一个字符串,多个值使用“;”分隔。
限制
数量限制(可使用“子cookie技术”解决该问题):
1.IE6及更低版本每个域最多20个cookie;
2.IE7及更高版本每个域最多50个cookie;
3.Firefox每个域最多50个cookie;
4.Opera每个域最多30个cookie;
5.Webkit内核(Safari & Chrome)没有对cookie数量做明确限制,但是如果cookie太大以至于超过了HTTP头部的大小限制时,服务器将无法正确处理。
尺寸限制:大多数浏览器都将cookie的尺寸限制在4096B左右。
基本操作
1.在浏览器上通过document.cookie属性的存取来操作cookie。
2.在谷歌浏览器的控制台中输入document.cookie后回车,可以看到此页面下可用的完整cookie内容。
3.document.cookie并不仅仅是一个普通的字符串,其有一个奇怪的特性——赋值时,不会覆盖原有的cookie,而是将新的cookie添加到后面(key重复时除外)。
  1. document.cookie="uid=123" //设置一个值
简化cookie操作
由于document.cookie只能获取到完整的字符串,为了方便操作cookie,一般封装两个函数——getCookie、setCookie。
  1. //获取cookie
  2. function getCookie(name) {
  3. var cookieName = encodeURIComponent(name) + "=",
  4. cookieStart = document.cookie.indexOf(cookieName),
  5. cookieValue = null,
  6. cookieEnd;
  7. if (cookieStart > -1) {
  8. cookieEnd = document.cookie.indexOf(";", cookieStart);
  9. if (cookieEnd == -1) {
  10. cookieEnd = document.cookie.length;
  11. }
  12. cookieValue = decodeURIComponent(document.cookie.substring(cookieStart + cookieName.length, cookieEnd));
  13. }
  14. return cookieValue;
  15. }
  16. //设置cookie
  17. function setCookie(name, value, opt_expiress, opt_path, opt_domain, opt_secure) {
  18. var cookieText = encodeURIComponent(name) + "=" + encodeURIComponent(value);
  19. if(opt_expiress instanceof Date){
  20. //cookie的过期时间只支持GMT格式
  21. cookieText += ";expires=" + opt_expiress.toGMTString();
  22. }
  23. if(opt_path){
  24. //path表示cookie起作用的路径,比如/path1 下设置的cookie,path2的页面则无法访问
  25. cookieText += ";path=" + opt_path;
  26. }
  27. if(opt_domain){
  28. //只能设置子域,而不能跨域
  29. cookieText += ";domain=" + opt_domain;
  30. }
  31. if(opt_secure){
  32. //安全标志,指定该标志后只有在 使用SSL连接时才会发送 cookie(即发送到https://开头的域)
  33. cookieText += ";secure";
  34. }
  35. document.cookie = cookieText;
  36. }
如果要删除一个cookie,只需要将key的值设置为空字符串,并将它的过期时间设置为过去的时间即可。
  1. //删除cookie
  2. function unsetCookie(name,path,domain,secure) {
  3. setCookie(name, "",new Date(0),path,domain,secure);e
  4. }

Web Storage

    Web Storage的使用非常方便,速度更快,也更安全,只会存储在浏览器中而不会随HTTP请求发送到服务器。它可以轻松的存储大量数据而丝毫不会影响网站的性能。PS:Storage和Cookie类似,都是通过域名区判别,即同域名的localStorage是一样的。
    Storage在浏览器中被实现为一个类型,但开发者是不被允许实例化Storage对象的,浏览器已经内置有两个已经实例化好的对象:
1.sessionStorage——存储的数据,只在单个页面的会话期间有效,类似一个页面的全局变量。
2.localStorage——存储的数据,会被持久化到客户端,而且永远不会过期(cookie可以设置过期时间),并且其容量也不像cookie那样受限制;只能存储字符串,如果试图存储其他类型的数据,将会被强制转换成字符串

    基本使用

  1. <script type="text/javascript">
  2. window.onload=function () {
  3. if(window.localStorage){//检测浏览器是否支持localStorage
  4. //存储几个键值对
  5. localStorage['book'] = 'H5 开发';
  6. localStorage.setItem('author','yexd');
  7. localStorage.setItem('2016','year');
  8. //读取
  9. console.info(localStorage.getItem('book')); //H5 开发
  10. console.info(localStorage.author); //yexd
  11. console.info(localStorage['2016']); //year
  12. //删除
  13. delete localStorage['author'];
  14. console.info("删除author后:" + localStorage['author']); //删除author后:undefined
  15. localStorage.removeItem('2016');
  16. console.info("删除2016后:" + localStorage['2016']); //删除2016后:undefined
  17. localStorage.clear();//删除所有的key
  18. }
  19. }
  20. </script>

存储json

    如果Storage要存储JSON对象,则可以先使用window.JSON对象提供的stringify和parse方法对JSON数据进行序列化和反序列化。
  1. //存储JSON
  2. var jsonAuthor = {
  3. 'name':'filod lin'
  4. }
  5. localStorage['jsonAuthor'] = jsonAuthor ;
  6. console.info(localStorage['jsonAuthor']); //[Object,Object]
  7. localStorage['jsonAuthor'] = JSON.stringify(jsonAuthor);
  8. console.log(JSON.parse(localStorage['jsonAuthor']).name); //filod lin

属性与方法

    由于localStorage与SessionStorage都是Storage的实例,它们共享Storage接口提供的一组方法和属性:
1.setItem(key,value),设置一个key;
2.getItem(key),获取一个key对应的name;
3.removeItem(key),移除一个key;
4.length,Storage对象中item的数量,类似数组length属性;
5.key(n),用于访问第n个key的名称;
6.clear(),清除当前域下的所有localStorage内容。

事件-不建议使用

    对Storage对象进行的所有修改都会触发文档上的Storage事件。但这个事件的触发有些特殊:
1.本页面的修改不会触发事件,需要别的页面修改,才会触发Storage事件,如下面的代码在A页面,A页面修改了Storage的值,但不会触发function的执行,而是B页面(同一个域)修改了Storage的值,才会触发A页面的function。
2.修改必须是数据发生变化,即存储区的数据为空,执行clear是不会触发事件;修改的值与原本的值相同也同理。
该事件对象有如下属性:
1.domain:发生变化的域名。
2.key:发生修改的键。
3.oldValue:修改前的值。
4.newValue:修改后的值(如果是删除一个键,则为null)。
  1. <script type="text/javascript">
  2. window.onload=function () {
  3. if(window.localStorage){//检测浏览器是否支持localStorage
  4. window.addEventListener("storage",function (e) {
  5. //尚无浏览器完整实现这些事件
  6. console.log("监听Storage事件,Storage的值被改变时触发。 key=" + e.key + " ;原值 "
  7. + e.oldValue + " ;新值=" + e.newValue +";URL=" + e.url);
  8. });
  9. }
  10. }
  11. </script>

该事件不建议使用的原因:
1.sessionStorage和localStorage都会触发此事件,但无法区分是谁触发的;
2.有兼容问题。

小例子-计数器

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>访问计数器</title>
  6. </head>
  7. <body>
  8. 本次访问已经查看过该页面<span id="count1"></span><br/>
  9. 历史上你已经查看过该页面<span id="count2"></span><br/>
  10. <button id="btn">清零</button>
  11. <script type="text/javascript">
  12. function updateCounter() {
  13. document.getElementById("count1").innerHTML = sessionStorage.pageLoadCount || 0;
  14. document.getElementById("count2").innerHTML = localStorage.pageLoadCount || 0;
  15. }
  16. //第一次进入页面时,将两个计数都设置为0
  17. if(sessionStorage.getItem("pageLoadCount") == null){
  18. sessionStorage.setItem("pageLoadCount",0);
  19. }
  20. if(localStorage.getItem("pageLoadCount") == null){
  21. localStorage.setItem("pageLoadCount",0);
  22. }
  23. //每次加载页面,把存储的数据取出后增1
  24. sessionStorage.pageLoadCount = parseInt(sessionStorage.getItem("pageLoadCount")) + 1;
  25. localStorage.pageLoadCount = parseInt(localStorage.getItem("pageLoadCount")) + 1;
  26. updateCounter();
  27. document.getElementById("btn").onclick = function () {
  28. localStorage.clear();
  29. sessionStorage.clear();
  30. updateCounter();
  31. }
  32. </script>
  33. </body>
  34. </html>














posted @ 2016-06-28 10:57  SeatonYexd  阅读(170)  评论(0编辑  收藏  举报