localstorage 本地存储

来源:互联网 发布:850网络捕鱼游戏作弊器 编辑:程序博客网 时间:2024/05/14 02:12
define(function() {      var win = window,          doc = document,            decode = function(s) {              // 参考jquery cookie的实现: https://github.com/carhartl/jquery-cookie/blob/master/jquery.cookie.js              if (s.indexOf('"') === 0) {                  s = s.slice(1, - 1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');              }              try {                  return decodeURIComponent(s);              } catch (e) {                  return null;              }          },          encode = encodeURIComponent,            isSupportLocalStorage = (function() {              try {                  var support = 'localStorage' in win && win['localStorage'] !== null,                      test = {                          k: 'test key',                          v: 'test value'                      };                  if (support) {                      localStorage.setItem(test.k, test.v);                      support = test.v === localStorage.getItem(test.k);                  }                  return support;              } catch (e) {                  return false;              }          }()),            stringify = function(v) {              if (!_.isString(v)) {                  v = JSON.stringify(v);              }              return encode(v);          },            validateCookieName = function(name) {              if (!_.isString(name) || name === '') {                  throw new TypeError('Cookie name must be a non-empty string!');              }          },            // TODO: 不支持localStorage时换用cookie存储          // 现在在某些浏览器下可能存在cookie数量的限制          // 之后可能的优化是使用subcookie的方式: https://developer.yahoo.com/yui/cookie/#subcookies          s = isSupportLocalStorage ? localStorage : {              setItem: function(k, v, days) {                  validateCookieName(k);                    // 默认cookie中的结果缓存7天                  days = days || 7;                  var expires = new Date();                  expires.setDate(expires.getDate() + days);                    v = _m.utils.evaluate(v);                  if (_.isArray(v)) {                      v = v[0];                      expires = new Date(parseInt(v[1], 10));                  }                    k = stringify(k);                  v = stringify(v);                    // 高端浏览器中一般合并字符用+比用join('')更高效                  // 参考: http://photo.weibo.com/2785671884/wbphotos/large/photo_id/3453950944633013?refer=weibofeedv5                  doc.cookie = k + '=' + v + '; expires=' + expires.toGMTString();              },                getItem: function(k) {                  validateCookieName(k);                    k = stringify(k) + '=';                    var v = null,                      cookie = doc.cookie,                      start = cookie.indexOf(k);                    if (start > -1) {                      var end = cookie.indexOf(';', start);                      if (end === -1) {                          end = cookie.length;                      }                      v = decode(cookie.substring(start + k.length, end));                  }                    return v;              },                removeItem: function(k) {                  this.setItem(k, '', - 1);              }          },            prefix = '_BM:';        return {          isSupportLocalStorage: isSupportLocalStorage,            set: function(k, v, expires) {              if (_.isNumber(expires)) {                  expires = +new Date() + expires;              }              s.setItem(prefix + k, JSON.stringify({                  value: v,                  expires: expires              }));          },            get: function(k) {              var v = JSON.parse(s.getItem(prefix + k)),                  expires;                if (!v) {                  return;              }                expires = parseInt(v.expires, 10);              v = v.value;                if (expires) {                  if (+new Date() < expires) {                      return v;                  }                  this.remove(k);              }                return v;          },            remove: function(k, v) {              if (v) {                  try {                      this.set(k, _.difference(this.get(k), v));                  } catch (e) {}              } else {                  s.removeItem(prefix + k);              }          },            add: function(k, v, options) {              var h = this.get(k),                    defaults = {                      type: 'set',                      limit: 10                  },                  opts = _.extend(defaults, options),                    type = opts.type,                  expires = opts.expires,                  limit = opts.limit;                // TODO: 有潜在的bug, 比如之前存储的是array类型              if (!_.isArray(h)) {                  h = _.isUndefined(h) && [] || [h];              }                if (type === 'set' && _.indexOf(h, v) !== -1) {                  return;              }                if (_.isNumber(limit) && limit > 0) {                  h = _.first(h, limit - 1);              }                h.unshift(v);                this.set(k, h, expires);          }      };  });     

0 0
原创粉丝点击