zoukankan      html  css  js  c++  java
  • H5中的localStorage笔记

    先来介绍一下localStorage和cookie的区别:

    (1)localStorage的存储容量比cookie更大;

    (2)cookie作为http规范的一部分,它的主要作用是与服务器进行交互,使http保持连接状态。也就是你每次请求一个新的页面的时候,cookie都会被发送过去,这样无形中就浪费了宽带。

    (3)cookie保存是能指定可以访问该cookie的范围;localStorage的访问范围就是当前整个网站,不存在访问范围这个概念。且,两者都不支持跨域调用。

    html5中的Web Storage包括了两种存储方式: sessionStorage和localStorage;

    sessionStorage用于本地存储一个会话的数据,当会话结束时,存储的数据也会自动销毁(即当页面关闭的同时也销毁数据),因此,sessionStorage不是一个持久化的本地存储,仅仅是会话级别的存储。

    localStorage用于持久化的本地存储,除非手动删除数据,否则会一直保存。

    下面是一个h5中localStorage的一个小应用:

    <!DOCTYPE html>
    <html>
    <head>
        <title></title>
    </head>
    <body>
    <p>you have viewed this page <span id="count"></span> thimes(s).</p>
    <p><input type="button" value="changeStorage" onClick="changeS()"></input></p>
    <script type="text/javascript">
        var storage = window.localStorage;
        if(!storage.getItem("pageLoadCount")) storage.setItem("pageLoadCount",0);
        storage.pageLoadCount = parseInt(storage.getItem("pageLoadCount")) +1;
        document.getElementById("count").innerHTML = storage.pageLoadCount;
        showStorage();
     // storage事件,在存储事件的处理函数中是不能取消这个存储动作的,存储事件只是浏览器在localStorage数据变化发
     //生后给你的一个通知
        
        if(window.addEventListener) {     // 为了兼容浏览器或者自己写兼容处理函数,或者干脆不用storage事件
            window.addEventListener("storage", handle_storage, false); // 而是调用一个handle_storage()函数来
        }else if(window.attachEvent) {                                 // 递归显示object
            window.attachEvent("onstorage",handle_storage);
        }
    
        function handle_storage(e) {   //
            if(!e) {
                e=window.event;
            }
            showObject(e);
        }                 
    
        function showObject(obj) { //递归显示object
            if(!obj){return;}
            for(var i in obj) {
                if(typeof(obj[i])!="object" || obj[i] == null) {
                    document.write(i + ":" + obj[i] + "<br/>");
                }else {
                    document.write(i + ":object" + "<br/>");
                }
            }
        }
    
        storage.setItem("a",5);
        
        function changeS() { //修改一个键值,测试storage事件
            if(!storage.getItem("b")) {
                storage.setItem("b",0);
            }
            storage.setItem('b',parseInt(storage.getItem('b'))+1);
        }
    
        function showStorage() { //循环显示localStorage里的键值对
            for(var i=0;i<storage.length;i++) {
                //key(i)获得相应的键,再用getItem()方法获得对应的值
                document.write(storage.key(i)+ ":" +storage.getItem(storage.key(i)) + "<br>");
            }
        }
    
    </script>
    </body>
    </html>

    接合网上的一篇文章对这个有我自己的一些很粗浅的看法;

    localStorage本身带有的一些本地方法:

    添加键值对: localStorage.setItem(key,value);

    获取键值对: localStorage.getItem(key);

    删除键值对: localStorage.removeItem(key);

    清除所有键值对: localStorage.clear();

    获取localStorage的属性名称(键名称): localStorage.key(index);

    获取localStorage中保存的键值对的数量: localStorage.length;

    获取localStorage完整键值对的列子:

    localStorage事件

       localStorage的storage事件,在存储事件的处理函数中是不能取消这个存储动作的。

    存储事件只是浏览器在localStorage数据变化发生之后给你的一个通知。注意这里的的条件是数据真的发生了变化。也就是说,如果当前的存储区域是 空的,你再去调用clear()是不会触发事件的。或者你通过setItem()来设置一个与现有值相同的值,事件也是不会触发的。当存储区域发生改变时 就会被触发。

    PS:在firefox和chrome中存储和读取都是正常的, 但是对storage事件的触发似乎有点问题,chrome修改localStorage能触发本页面的storage事件,Firefox 自身页面修改storage后没有触发window的storage事件, 但是同时访问A.html和B.html, 在A页面中进行 setItem能触发B页面中window的storage事件, 同样的在B页面中进行setItem能触发A页面中window的storage事件. 在IE9中, 页面自身的设值能触发当前页面的storage事件,同样当前页面的设值能触发同一”起源”下其他页面window的storage事件,这看起来似乎更 让人想的通些.实例推荐PrimeTechBlog的初试WebStorage之localstorage
      所以建议,为兼容浏览器或者自己写兼容处理函数,或者干脆不用storage事件。

    也正如下面的这一个代码段:

    这里引入showObject()函数

    至于这个递归显示object有什么作用还是没有弄懂,待以后看到相关方面的知识再来补充——————!

  • 相关阅读:
    手把手带你玩转 DialogFragment
    紧张的去京东面试7,没想到可以成功拿下offer
    这个有点强,MySQL常用优化指南及大表优化思路(值得收藏)
    Java程序员两年经验斩获头条 Offer,技术杠杠的
    为什么大家都说 SELECT * 效率低
    Java程序员想要靠外包刷题,结果却大跌眼镜,心态都崩了
    一次请求在SpringMVC核心执行流程
    工作三年经验,一年内我靠这份javaBAT进阶面试题从13K到大厂25K
    用了这么久的数据库连接池,你知道原理吗?
    poj 3295 Tautology(栈)
  • 原文地址:https://www.cnblogs.com/shw13/p/5695039.html
Copyright © 2011-2022 走看看