Last active
February 6, 2019 04:51
-
-
Save fazlurr/46f4d6cab814f1de9d3a0a89d7f179a1 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Fake localStorage implementation. | |
// Mimics localStorage, including events. | |
// It will work just like localStorage, except for the persistant storage part. | |
var fakeLocalStorage = function() { | |
var fakeLocalStorage = {}; | |
var storage; | |
// If Storage exists we modify it to write to our fakeLocalStorage object instead. | |
// If Storage does not exist we create an empty object. | |
if (window.Storage && window.localStorage) { | |
storage = window.Storage.prototype; | |
} else { | |
// We don't bother implementing a fake Storage object | |
window.localStorage = {}; | |
storage = window.localStorage; | |
} | |
// For older IE | |
if (!window.location.origin) { | |
window.location.origin = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ':' + window.location.port: ''); | |
} | |
var dispatchStorageEvent = function(key, newValue) { | |
var oldValue = (key == null) ? null : storage.getItem(key); // `==` to match both null and undefined | |
var url = location.href.substr(location.origin.length); | |
var storageEvent = document.createEvent('StorageEvent'); // For IE, http://stackoverflow.com/a/25514935/1214183 | |
storageEvent.initStorageEvent('storage', false, false, key, oldValue, newValue, url, null); | |
window.dispatchEvent(storageEvent); | |
}; | |
storage.key = function(i) { | |
var key = Object.keys(fakeLocalStorage)[i]; | |
return typeof key === 'string' ? key : null; | |
}; | |
storage.getItem = function(key) { | |
return typeof fakeLocalStorage[key] === 'string' ? fakeLocalStorage[key] : null; | |
}; | |
storage.setItem = function(key, value) { | |
dispatchStorageEvent(key, value); | |
fakeLocalStorage[key] = String(value); | |
}; | |
storage.removeItem = function(key) { | |
dispatchStorageEvent(key, null); | |
delete fakeLocalStorage[key]; | |
}; | |
storage.clear = function() { | |
dispatchStorageEvent(null, null); | |
fakeLocalStorage = {}; | |
}; | |
}; | |
// Example of how to use it | |
if (typeof window.localStorage === 'object') { | |
// Safari will throw a fit if we try to use localStorage.setItem in private browsing mode. | |
try { | |
localStorage.setItem('localStorageTest', 1); | |
localStorage.removeItem('localStorageTest'); | |
} catch (e) { | |
fakeLocalStorage(); | |
} | |
} else { | |
// Use fake localStorage for any browser that does not support it. | |
fakeLocalStorage(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment