-
-
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