以下是 Aamir Afridi 的答案的整理版本,它将所有代码封装在本地范围内。
我删除了创建全局 ret
变量的引用,也删除了在 BrowserStorage.get()
方法中将存储的 "true" 和 "false" 字符串解析为布尔值的内容,这可能会导致实际上要存储字符串 "true" 或 "false" 时出现问题。
由于本地存储 API 只支持字符串值,因此可以通过将数据编码为 JSON 字符串来存储/检索 JavaScript 变量数据及其适当的数据类型,然后使用 JSON 编码/解码库(如https://github.com/douglascrockford/JSON-js)对其进行解码。
var BrowserStorage = (function() {
var _hasLocalStorageSupport = (function() {
try {
return 'localStorage' in window && window['localStorage'] !== null;
} catch (e) {
return false;
}
})();
var _readCookie = function(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; 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;
};
var _writeCookie = function(name, value, days) {
var expiration = (function() {
if (days) {
var date = new Date();
date.setTime(date.getTime() + (days*24*60*60*1000));
return "; expires=" + date.toGMTString();
}
else {
return "";
}
})();
document.cookie = name + "=" + value + expiration + "; path=/";
};
return {
set: function(name, value, days) {
_hasLocalStorageSupport
? localStorage.setItem(name, value)
: _writeCookie(name, value, days);
},
get: function(name) {
return _hasLocalStorageSupport
? localStorage.getItem(name)
: _readCookie(name);
},
remove: function(name) {
_hasLocalStorageSupport
? localStorage.removeItem(name)
: this.set(name, "", -1);
}
};
})();
window.localStorage
创建polyfill,也会出现Error:The operation is insecure.
的错误。使用try catch可以检查是否已禁用,但不能用自己的解决方案替换变量。 :/ - Mauvis Ledford