zui
Version:
一个基于 Bootstrap 深度定制开源前端实践方案,帮助你快速构建现代跨屏应用。
222 lines (195 loc) • 6.7 kB
JavaScript
/* ========================================================================
* ZUI: storeb.js
* http://zui.sexy
* ========================================================================
* Copyright (c) 2014-2016 cnezsoft.com; Licensed MIT
* ======================================================================== */
(function(window, $) {
'use strict';
var lsName = 'localStorage';
var storage,
dataset,
pageName = 'page_' + window.location.pathname + window.location.search;
/* The Store object */
var Store = function() {
this.slience = true;
try {
if((lsName in window) && window[lsName] && window[lsName].setItem) {
this.enable = true;
storage = window[lsName];
}
} catch(e){}
if(!this.enable) {
dataset = {};
storage = {
getLength: function() {
var length = 0;
$.each(dataset, function() {
length++;
});
return length;
},
key: function(index) {
var key, i = 0;
$.each(dataset, function(k) {
if(i === index) {
key = k;
return false;
}
i++;
});
return key;
},
removeItem: function(key) {
delete dataset[key];
},
getItem: function(key) {
return dataset[key];
},
setItem: function(key, val) {
dataset[key] = val;
},
clear: function() {
dataset = {};
}
};
}
this.storage = storage;
this.page = this.get(pageName, {});
};
/* Save page data */
Store.prototype.pageSave = function() {
if($.isEmptyObject(this.page)) {
this.remove(pageName);
} else {
var forDeletes = [],
i;
for(i in this.page) {
var val = this.page[i];
if(val === null)
forDeletes.push(i);
}
for(i = forDeletes.length - 1; i >= 0; i--) {
delete this.page[forDeletes[i]];
}
this.set(pageName, this.page);
}
};
/* Remove page data item */
Store.prototype.pageRemove = function(key) {
if(typeof this.page[key] != 'undefined') {
this.page[key] = null;
this.pageSave();
}
};
/* Clear page data */
Store.prototype.pageClear = function() {
this.page = {};
this.pageSave();
};
/* Get page data */
Store.prototype.pageGet = function(key, defaultValue) {
var val = this.page[key];
return(defaultValue !== undefined && (val === null || val === undefined)) ? defaultValue : val;
};
/* Set page data */
Store.prototype.pageSet = function(objOrKey, val) {
if($.isPlainObject(objOrKey)) {
$.extend(true, this.page, objOrKey);
} else {
this.page[this.serialize(objOrKey)] = val;
}
this.pageSave();
};
/* Check enable status */
Store.prototype.check = function() {
if(!this.enable) {
if(!this.slience) throw new Error('Browser not support localStorage or enable status been set true.');
}
return this.enable;
};
/* Get length */
Store.prototype.length = function() {
if(this.check()) {
return storage.getLength ? storage.getLength() : storage.length;
}
return 0;
};
/* Remove item with browser localstorage native method */
Store.prototype.removeItem = function(key) {
storage.removeItem(key);
return this;
};
/* Remove item with browser localstorage native method, same as removeItem */
Store.prototype.remove = function(key) {
return this.removeItem(key);
};
/* Get item value with browser localstorage native method, and without deserialize */
Store.prototype.getItem = function(key) {
return storage.getItem(key);
};
/* Get item value and deserialize it, if value is null and defaultValue been given then return defaultValue */
Store.prototype.get = function(key, defaultValue) {
var val = this.deserialize(this.getItem(key));
if(typeof val === 'undefined' || val === null) {
if(typeof defaultValue !== 'undefined') {
return defaultValue;
}
}
return val;
};
/* Get item key by index and deserialize it */
Store.prototype.key = function(index) {
return storage.key(index);
};
/* Set item value with browser localstorage native method, and without serialize filter */
Store.prototype.setItem = function(key, val) {
storage.setItem(key, val);
return this;
};
/* Set item value, serialize it if the given value is not an string */
Store.prototype.set = function(key, val) {
if(val === undefined) return this.remove(key);
this.setItem(key, this.serialize(val));
return this;
};
/* Clear all items with browser localstorage native method */
Store.prototype.clear = function() {
storage.clear();
return this;
};
/* Iterate all items with callback */
Store.prototype.forEach = function(callback) {
var length = this.length();
for(var i = length - 1; i >= 0; i--) {
var key = storage.key(i);
callback(key, this.get(key));
}
return this;
};
/* Get all items and set value in an object. */
Store.prototype.getAll = function() {
var all = {};
this.forEach(function(key, val) {
all[key] = val;
});
return all;
};
/* Serialize value with JSON.stringify */
Store.prototype.serialize = function(value) {
if(typeof value === 'string') return value;
return JSON.stringify(value);
};
/* Deserialize value, with JSON.parse if the given value is not a string */
Store.prototype.deserialize = function(value) {
if(typeof value !== 'string') return undefined;
try {
return JSON.parse(value);
} catch(e) {
return value || undefined;
}
};
$.zui({
store: new Store()
});
}(window, jQuery));