zoukankan      html  css  js  c++  java
  • 基于'sessionStorage'与'userData'的类session存储

    Storage.js:

     注意:此版本实现的存储在符合Web存储标准(ie8及ie8以上的版本与其他主流浏览器)的情况下与session的周期一致,但在页面不关闭的情况下没有过期时间,ie7及以下版本则默认是永久保存,但可以通过预留的方法setMaxAge(Number age)来设置有效期,设置0的话在关闭或刷新页面时会清除缓存。

    (function initStorageClass(win){
        var inherit=function(o){
            if(o===null || o ===undefined) throw TypeError();
            if(Object.create) return Object.create(o);
            var t = typeof o;
            if(t!=='object'&&t!=='function') throw TypeError();
            function f(){}
            f.prototype=o;
            return new f();
        };
        var extend=function(a,b){
            for ( var key in b) { a[key]=b[key]; }
            return a;
        };
        var defineSubclass=function(superclass,constructor,methods,statics){
            constructor.prototype=inherit(superclass.prototype);
            constructor.prototype.constructor=constructor;
            if(methods) extend(constructor.prototype,methods);
            if(statics) extend(constructor,statics);
            return constructor;
        };
        Function.prototype.extend=function(constructor,methods,statics){
            return defineSubclass(this,constructor,methods,statics);
        };
        // 创建一个抽象类
        var AbstractStorage=function AbstractStorage(){
            throw new Error('Can\'t create abstract class instance');
        };
        // 添加抽象类的实例方法(已实现)
        extend(AbstractStorage.prototype,{
            setItem:function(k,v){
                k=encodeURIComponent(k);
                v=encodeURIComponent(v);
                this.storage.setItem(k,v);
                return this;
            },
            getItem:function(k){
                k=encodeURIComponent(k);
                return decodeURIComponent(this.storage.getItem(k));
            },
            removeItem:function(k){
                k=encodeURIComponent(k);
                this.storage.removeItem(k);
                return this;
            },
            setMaxAge:function(age){ // 为IE的userData版本预留了设置有效期的方法
                if(isNaN(age)) throw new TypeError('userData\' max-age must be a number,but '+age+' is not a number');
                if(this.model&&this.model==='userData') {
                    var now=new Date().getTime();
                    var expires=now+age*1000;
                    this.storage.expires=new Date(expires).toUTCString();
                } else {
                    throw new Error('sessionStorage did\'t support set max-age。');
                }
                return this;
            }
        });
        var Storage=null;
        if(win.Storage) {// 实现了Web存储标准的浏览器
            Storage=AbstractStorage.extend(
                function WebStorage(){
                    // IE中实现了Web存储标准的版本,在本地目录下无法使用sessonStorage
                    if(!win.sessionStorage) {
                        throw new Error('local web is can\'t save sessionStorage');
                    }
                    this.model='sessionStorage';
                    // 默认使用sessionStorage,也可以自己传入,model自行修改
                    this.storage=win.sessionStorage;
                }
            );
        } else if(win.navigator.appVersion&&win.navigator.appVersion.indexOf('MSIE')>=0){
            // 不支持web存储标准的IE浏览器(IE11的核心版本已和Netscape统一,IE8以上的支持web存储标准)
            Storage=(AbstractStorage.extend(
                function IEStorage(maxAge){
                    this.model='userData';
                    this.maxAge=maxAge;
                    this.storage=(function initUserData(t){
                        var memory = document.createElement('div');
                        memory.style.display='none';
                        //附加userData行为
                        memory.style.behavior='url("#default#userData")';
                        document.appendChild(memory);
                        if(t.maxAge) {// 设置userData有效期,默认永久,单位毫秒
                            var now=new Date().getTime();
                            var expires=now+t.maxAge*1000;
                            memory.expires=new Date(expires).toUTCString();
                        }
                        memory.load('UserDataStorage'); //载入存储的
                        extend(memory,{
                            setItem:function(k,v){
                                this.setAttribute(k,v);
                                this.save('UserDataStorage');
                                return this;
                            },
                            getItem:function(k){
                                return this.getAttribute(k)||null;
                            },
                            removeItem:function(k){
                                this.removeAttribute(k);
                                this.save('UserDataStorage');
                                return this;
                            }
                        });
                        return memory;
                    }(this));
                }
            ));
        }
        win.IStorage=Storage;
        win.memory=new Storage()||null;// 创建一个实例对象,可以在脚本中直接引用
    }(window));

    index.html(简单测试):

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    <script type="text/javascript" src="Storage.js"></script>
    <script type="text/javascript">
        window.onload=function(){
            memory.setItem('test','success');
            alert(memory.getItem('test'));
        };
    </script>
    </head>
    <body>
    
    </body>
    </html>

    在HTML页面中引用Storage.js文件,可以在宿主环境中直接使用已经生成的实例memory(window.memory)。也可以自己创建一个新实例new IStorage()

    memory.setItem('test','success');   // add
    alert(memory.getItem('test'));      // select     
    memory.removeItem('test');          // delete

    适用实现了Web存储标准的浏览器(Storage)与IE浏览器(userData),userData的生命周期请自行根据项目进行设置。

  • 相关阅读:
    python3 -- 堆(heapq)
    二叉堆的实现(最大堆)
    解决layui layer.load() Ajax提交时,只在结束闪一下
    两个for循环嵌套,写成一个列表生成式
    time模块,计算当前时间和时间差
    私有化&property
    面向对象魔术方法之__str__()方法
    面向对象魔术方法-__del__()方法
    面向对象之魔术方法__init__()和__new__()
    Django的自定义标签
  • 原文地址:https://www.cnblogs.com/gabin/p/3723892.html
Copyright © 2011-2022 走看看