Skip to content

Instantly share code, notes, and snippets.

@sofish
Created September 16, 2011 03:13
Show Gist options
  • Star 19 You must be signed in to star a gist
  • Fork 11 You must be signed in to fork a gist
  • Save sofish/1221115 to your computer and use it in GitHub Desktop.
Save sofish/1221115 to your computer and use it in GitHub Desktop.
Cross-browser TextStorage Solution
/**
* @ NAME: Cross-browser TextStorage
* @ DESC: text storage solution for your pages
* @ COPY: sofish, http://sofish.de
*/
typeof window.localStorage == 'undefined' && ~function () {
var localStorage = window.localStorage = {},
prefix = 'data-userdata',
doc = document,
attrSrc = doc.body,
// save attributeNames to <body>'s `data-userdata` attribute
mark = function (key, isRemove, temp, reg) {
attrSrc.load(prefix);
temp = attrSrc.getAttribute(prefix) || '';
reg = RegExp('\\b' + key + '\\b,?', 'i');
var hasKey = reg.test(temp) ? 1 : 0;
temp = isRemove ? temp.replace(reg, '') : hasKey ? temp : temp === '' ? key : temp.split(',').concat(key).join(',');
alert(temp);
attrSrc.setAttribute(prefix, temp);
attrSrc.save(prefix);
};
// add IE behavior support
attrSrc.addBehavior('#default#userData');
localStorage.getItem = function (key) {
attrSrc.load(key);
return attrSrc.getAttribute(key);
};
localStorage.setItem = function (key, value) {
attrSrc.setAttribute(key, value);
attrSrc.save(key);
mark(key);
};
localStorage.removeItem = function (key) {
attrSrc.removeAttribute(key);
attrSrc.save(key);
mark(key, 1);
};
// clear all attributes on <body> tag that using for textStorage
// and clearing them from the
// 'data-userdata' attribute's value of <body> tag
localStorage.clear = function () {
attrSrc.load(prefix);
var attrs = attrSrc.getAttribute(prefix).split(','),
len = attrs.length;
if (attrs[0] === '') return;
for (var i = 0; i < len; i++) {
attrSrc.removeAttribute(attrs[i]);
attrSrc.save(attrs[i]);
};
attrSrc.setAttribute(prefix, '');
attrSrc.save(prefix);
};
}();
@kapitancho
Copy link

I also use this behavior in general, but the approach is useless because IE userData is per folder. This restricts the url structure a lot. My workaround is to have a single Iframe that contains the userData. This way, I have a shared localStorage. The only drawback is that I have to rely on an iframe load event that will usually fire after the main page load event.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment