-
-
Save ksafranski/4718380 to your computer and use it in GitHub Desktop.
/** | |
* Simple localStorage with Cookie Fallback | |
* v.1.0.0 | |
* | |
* USAGE: | |
* ---------------------------------------- | |
* Set New / Modify: | |
* store('my_key', 'some_value'); | |
* | |
* Retrieve: | |
* store('my_key'); | |
* | |
* Delete / Remove: | |
* store('my_key', null); | |
*/ | |
var store = function store(key, value) { | |
var lsSupport = false; | |
// Check for native support | |
if (localStorage) { | |
lsSupport = true; | |
} | |
// If value is detected, set new or modify store | |
if (typeof value !== "undefined" && value !== null) { | |
// Convert object values to JSON | |
if ( typeof value === 'object' ) { | |
value = JSON.stringify(value); | |
} | |
// Set the store | |
if (lsSupport) { // Native support | |
localStorage.setItem(key, value); | |
} else { // Use Cookie | |
createCookie(key, value, 30); | |
} | |
} | |
// No value supplied, return value | |
if (typeof value === "undefined") { | |
// Get value | |
if (lsSupport) { // Native support | |
data = localStorage.getItem(key); | |
} else { // Use cookie | |
data = readCookie(key); | |
} | |
// Try to parse JSON... | |
try { | |
data = JSON.parse(data); | |
} | |
catch(e) { | |
data = data; | |
} | |
return data; | |
} | |
// Null specified, remove store | |
if (value === null) { | |
if (lsSupport) { // Native support | |
localStorage.removeItem(key); | |
} else { // Use cookie | |
createCookie(key, '', -1); | |
} | |
} | |
/** | |
* Creates new cookie or removes cookie with negative expiration | |
* @param key The key or identifier for the store | |
* @param value Contents of the store | |
* @param exp Expiration - creation defaults to 30 days | |
*/ | |
function createCookie(key, value, exp) { | |
var date = new Date(); | |
date.setTime(date.getTime() + (exp * 24 * 60 * 60 * 1000)); | |
var expires = "; expires=" + date.toGMTString(); | |
document.cookie = key + "=" + value + expires + "; path=/"; | |
} | |
/** | |
* Returns contents of cookie | |
* @param key The key or identifier for the store | |
*/ | |
function readCookie(key) { | |
var nameEQ = key + "="; | |
var ca = document.cookie.split(';'); | |
for (var i = 0, max = ca.length; i < max; i++) { | |
var c = ca[i]; | |
while (c.charAt(0) === ' ') c = c.substring(1, c.length); | |
if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length); | |
} | |
return null; | |
} | |
}; |
Great Gist!
I would only add a config var. Not really important.
var config = {'cookies': {'expirationDays': 30}};
And the use it, instead of '30' hardcoded:
createCookie(key, value, config.cookies.expirationDays);
Need to initialize the 'data' variable inside the second if:
if (typeof value === "undefined") {
var data = null;
Otherwise throws an error that data isn't defined...
Nice gist, thank you !
Great, thanks! 👍
Yet, in my opinion @NewWorldOrderly is right about checking support, as I just have had issue with that.
Update to @NewWorldOrderly's edit--I ran into a problem where (on FF, local) localStorage.removeItem()
would not fire (presumably because it was not completed). Adding a slight delay works:
setTimeout(function(){ storage.removeItem(x); }, 400);
Hello,
I am volunteering for a non-profit organization and trying to find some code snippet to provide localstorage service.
This gist is a good fit, just wonder if I can use your code (copy and paste it to our project files)?
Thanks!
Wesley
Awesome! Thanks!
setTimeout(function(){ storage.removeItem(x); }, 400);
This looks weird. localStorage
methods are all sync. No need to wrap them in timeouts.
I would replace your IF statement
with
This will allow this to work in Private Browsing mode on iOS Safari