所在位置:杂记 >> javascript >> 本地存储之 cookie userData localStorage
本地存储之 cookie userData localStorage
发表于 七年前(2011-11-14 17:39:39) | 阅读 (3173) | 评论 (0)
(function(win) {
   var pyzy_NET = { //基础方法 
       type: function(obj) { //@obj 要取得原型名称的对象
           return Object.prototype.toString.call(obj).slice(8, -1);
       },
       each: function(obj, fun, filterFun, isArray) { //@obj 要遍历的对象;@fun 处理方法,与下一Fun指针、参数相同;@checkFun 筛选方法,this指针指向匹配到的属性值,默认首参数为属性名;@isArray 是否以数组的形式遍历 默认为false
           var k, v, l, r = [], f = function(o) { r.push(o) };
           if (fun) f = (function(F, U) { return function(o, k, v) { F(U.call(o, k, v)) } })(f, fun); //如果有指定处理方法,则将匹配值处理后再追加到返回列表
           if (filterFun) f = (function(F, C) { return function(o, k, v) { C.call(o, k, v) && F(o, k, v) } })(f, filterFun); //如果有指定筛选方法,则执行筛选后再处理并追加到返回列表
           if (isArray) for (l = obj.length, k = 0; k < l; k++) { f(v = obj[k], k, v); }
           else for (k in obj) { f(v = obj[k], k, v); }
           return r;
       },
       /*用于实现gset,并判断args如果为对象则批量set:
       * @obj 操作主体【可以不指定,不指定时候getFun、setFun中不能使用this指针进行操作】
       * @getFun get处理方法this指针为obj,参数按args动态确定 【可以不指定】
       * @setFun set方法,参数同get 【可以不指定;但不能与getFun同时不指定】
       * @args gset时候对应参数集,可以由外部传入处理过的数组形式参数集,也可不指定(默认值:gset.caller.arguments),如果传入的参数集子项是Function格式则自动执行  */


       gset: function(obj, getFun, setFun, args) {
           if (getFun == null && setFun == null) return;
           var a = arguments, t = a[4] || this, gs = a.callee, aL = (args = (args == null ? gs.caller.arguments : args)).length, args0 = args[0];
          //如果类似 W(dom).attr({a:1,b:2}) 传入Object参数则批量set,并忽略其他参数
           if (args0 && t.type(args0) === 'Object') { t.each(args0, function(attrName, attrVal) { return gs(obj, null, setFun, [attrName, attrVal], t) }); return obj }
          //如果类似 W(dom).attr(['a','b']) 传入Array参数则批量get,并忽略其他参数
           if (args0 && t.type(args0) === 'Array') { return T.each(args0, function(k, attrName) { return gs(obj, getFun, null, [attrName], t) }, null, 1); }
           return (setFun && aL == setFun.length ? setFun : (getFun ? getFun : setFun || function() { })).apply(obj, t.each(args, function(k, NameOrVal) { return t.type(NameOrVal) === 'Function' ? NameOrVal.call(obj) : NameOrVal }, null, 1));
       }
   };

   /*{{sta ****** 本地存储(如果要考虑兼容问题,可直接使用综合方法 T.storage) *****************/


   /** cookie操作[webkit本地文件不支持cookie存储]
   * @key 必须
   * @val 非必须[若不传入则get key对应的val,传入则set key对应值]
   */


   pyzy_NET.cookie = (function(_doc) {
       var _ckAttr = function(name, _a) {
           return (_a = cK[name]()) ? [' ;', name, name == 'secure' ? '' : ['=', name == 'expires' ? (function(d) { d.setTime(d.getTime() + _a); return d.toGMTString() })(new Date()) : _a].join('')].join('') : '';
       },
       cK = function(key, val) {
           return key ? pyzy_NET.gset(cK, function(key) {
               return cK.has(key) ? unescape(RegExp.$1) : null;
           }, function(key, val) {
               _doc.cookie = [key, '=', escape(val), _ckAttr('domain'), _ckAttr('path'), _ckAttr('expires'), _ckAttr('secure')].join('');
               return cK;
           }) : _doc.cookie;
       };
       cK.type = 'cookie';
       cK.set = function(key, val) { return cK(key, val) }; //设置指定key本地存储的值
       cK.get = function(key, defVal) { return cK(key) || defVal }; //获取指定key本地存储的值
      //删除指定key对应信息[key可以为空,当key为空时清除所有记录],一次删除多个key可用数组形式传入
       cK.del = function(key) {
           key ? pyzy_NET.gset(cK, function(key) { var oE = cK._secure; cK.secure(-1).set(key, '').secure(oE) }) : cK.del(cK.keys());
           return cK;
       };
       cK.has = function(key) { return new RegExp("(?:^| )" + key + "=([^;]*)(?:;|$)").test(_doc.cookie) };
       cK.keys = function() { return _doc.cookie.match(/((?:^|\s)[^\s;=]*)/g).join('').split(' ') };
       cK.domain = function(domainVal) { return pyzy_NET.gset(cK, function() { return this._domain }, function(val) { this._domain = val; return this }) }; //域名设置
       cK.path = function(pathVal) { return pyzy_NET.gset(cK, function() { return this._path }, function(val) { this._path = val; return this }) }; //路径设置
      //有效时间设置,参数格式为毫秒数
       cK.expires = function(expiresMillisecondVal) { return pyzy_NET.gset(cK, function() { return this._expires || (365 * 24 * 60 * 60 * 1000) }, function(val) { pyzy_NET.type(val) == 'Number' && (this._expires = val); return this }) };
       cK.secure = function(TF) { return pyzy_NET.gset(cK, function() { return this._secure }, function(val) { this._secure = val; return this }) }; //是否加密
       return cK;
   })(document);

   /** userData 操作,浏览器不支持则pyzy_NET.userData==null
   * @key 必须
   * @val 非必须[若不传入则get key对应的val,传入则set key对应值]
   */


   pyzy_NET.userData = (function(_dEl, _ks) {
       if (!_dEl.addBehavior) return null;
       _dEl.addBehavior("#default#userData");
       var _addKey = function(key) { var keys = _delKey(key); return keys + (keys == '' ? '' : ',') + key },
       _delKey = function(key) { return uD.get(_ks, '').replace(new RegExp("(^|,)" + key + "(,|$)", 'g'), function($1, $2, $3) { return $2 == ',' && $3 == ',' ? ',' : '' }) }, //同时记下key用于循环遍历等
       uD = function(key, val) {
           return key ? pyzy_NET.gset(arguments.callee, function(key) {
               _dEl.load(uD.fileName());
               return _dEl.getAttribute(key)
           }, function(key, val) {
               _dEl.load(uD.fileName());
               _dEl.setAttribute(_ks, _addKey(key)); //同时记下key用于循环遍历等
               _dEl.setAttribute(key, val);
               _dEl.save(uD.fileName());
               return uD;
           }) : pyzy_NET.each(uD.keys(), function(i, k) { return k + '=' + uD(k) }, null, 1);
       };
       uD.type = 'userData';
       uD.set = function(key, val) { return uD(key, val) }; //设置指定key本地存储的值
       uD.get = function(key, defVal) { return uD(key) || defVal }; //获取指定key本地存储的值
       uD.del = function(key) { //删除指定key对应信息[key可以为数组或空,当key为空时清除所有记录],一次删除多个key可用数组形式传入
           key ? pyzy_NET.gset(uD, function(key) {
               uD(_ks, _delKey(key)); //删除主键记录
               _dEl.load(uD.fileName());
               _dEl.removeAttribute(key);
               _dEl.save(uD.fileName());
           }) : uD.del(uD.keys());
           return uD;
       };
       uD.has = function(key) { return !!uD(key) };
       uD.keys = function() { return uD.get(_ks, '').split(',') };
       uD.fileName = function(name) { return pyzy_NET.gset(uD, function() { return this._fileName || 'pyzy_net_js_def' }, function(name) { this._fileName = name; return this }) }; //缓存文件名称
      //有效时间设置,参数格式为毫秒数【userData中改设置用于控制过期自动删除貌似无效.....】
       uD.expires = function(expiresMillisecondVal) { return pyzy_NET.gset(uD, function() { return _dEl.expires }, function(val) { (pyzy_NET.type(val) == 'Number') && (function(d) { d.setTime(d.getTime() + val); _dEl.expires = d.toUTCString() })(new Date()); return this }) };
       return uD;
   })(document.documentElement, '_keys');

   /** localStorage 操作,浏览器不支持则pyzy_NET.storage==null
   * @key 必须
   * @val 非必须[若不传入则get key对应的val,传入则set key对应值]
   */


   pyzy_NET.localStorage = (function(_core) {
       if (!_core) return null;
       var lS = function(key, val) {
           return key ? pyzy_NET.gset(lS, function(key) {
               return _core.getItem(key);
           }, function(key, val) {
               _core.setItem(key, val);
               return lS;
           }) : pyzy_NET.each(_core, function(k, v) { return k + '=' + v }).jion('; ');
       };
       lS.type = 'localStorage';
      //设置指定key本地存储的值
       lS.set = function(key, val) { return lS(key, val) };
      //获取指定key本地存储的值[不指定key则取所有]
       lS.get = function(key, defVal) { return lS(key) || defVal };
      //删除指定key对应信息[key可以为数组或空,当key为空时清除所有记录]
       lS.del = function(key) { key ? pyzy_NET.gset(lS, function(key) { _core.removeItem(key) }) : _core.clear(); return lS };
       lS.has = function(key) { return !!_core.getItem(key) };
       lS.keys = function() { return pyzy_NET.each(_core, function(k) { return k }) };
       return lS;
   })(window.localStorage);

   /** 本地存储渐进实现方法,从下面的localStorage、userData、cookie三者中自动选取当前环境兼容对象 */

   pyzy_NET.storage = pyzy_NET.localStorage || pyzy_NET.userData || pyzy_NET.cookie;

   /*}}end ****** 本地存储 *****************/


   win.pyzy_NET = pyzy_NET;
   win.storage = pyzy_NET.storage;
})(window);
杂记评论(0):
称谓(必填):  网站(选填):
上一篇:域名解析不稳定“无法解析”解决方法  下一篇:浏览器历史管理(无刷新变更地址栏内容及相关事件处理)location.hash及history.pushState的应用     <<返回杂记列表