我需要验证Web Storage API是否受支持且可用(由于安全问题,可能会将其禁用)。
所以,我认为检查是否定义了sessionStorage或localStorage类型就足够了:
if (typeof sessionStorage != 'undefined')
{
alert('sessionStorage available');
}
else
{
alert('sessionStorage not available');
}
但是,我想知道该类型是否可能存在,但无论如何我都无法使用Web Storage API。
说明: 我知道如果禁用cookie并访问sessionStorage或localStorage,Firefox将抛出安全错误。
答案 0 :(得分:5)
为什么不使用Modernizr库来检测是否支持本地存储?将为您处理浏览器之间的任何差异,然后您可以使用以下代码:
if (Modernizr.localstorage) {
// browser supports local storage
} else {
// browser doesn't support local storage
}
答案 1 :(得分:3)
我认为你的原始代码正确,你不需要太过花哨。
使用代码中没有其他依赖项的KISS principle:
var storageEnabled = function() {
try {
sessionStorage.setItem('test-key','test-value');
if (sessionStorage.getItem('test-key') == 'test-value'){
return true;
}
} catch (e) {};
return false;
};
alert(storageEnabled() ? 'sessionStorage available' : 'sessionStorage not available');
答案 2 :(得分:1)
try{
ssSupport = Object.prototype.toString.call( sessionStorage ) === "[object Storage]";
}
catch(e){
ssSupport = false;
}
答案 3 :(得分:0)
因此,因为Modernizr.localstorage
分别Modernizr.sessionstorage
将返回true,而Firefox可能会与禁用的Cookie一起使用(这将导致安全错误)或任何其他专有(意外)行为可能会发生:我'写了我自己的webStorageEnabled
函数,它似乎运行得很好。
function cookiesEnabled()
{
// generate a cookie to probe cookie access
document.cookie = '__cookieprobe=0;path=/';
return document.cookie.indexOf('__cookieprobe') != -1;
}
function webStorageEnabled()
{
if (typeof webStorageEnabled.value == 'undefined')
{
try
{
localStorage.setItem('__webstorageprobe', '');
localStorage.removeItem('__webstorageprobe');
webStorageEnabled.value = true;
}
catch (e) {
webStorageEnabled.value = false;
}
}
return webStorageEnabled.value;
}
// conditional
var storage = new function()
{
if (webStorageEnabled())
{
return {
local: localStorage,
session: sessionStorage
};
}
else
{
return {
local: cookiesEnabled() ? function()
{
// use cookies here
}() : null,
session: function()
{
var data = {};
return {
clear: function () {
data = {};
},
getItem: function(key) {
return data[key] || null;
},
key: function(i)
{
var index = 0;
for (var value in data)
{
if (index == i)
return value;
++index;
}
},
removeItem: function(key) {
delete data[key];
},
setItem: function(key, value) {
data[key] = value + '';
}
};
}()
};
}
}
希望这对某些人也有用。
答案 4 :(得分:0)
我的版本(因为IE 9在Intranet网站上的IE 8中运行更多)。
if (typeof (Storage) != "undefined" && !!sessionStorage.getItem) {
}
添加setObject以允许存储对象的较长版本:
var sstorage;
if (typeof (Storage) != "undefined" && !!sessionStorage.getItem) {
Storage.prototype.setObject = function (key, value) {
this.setItem(key, JSON.stringify(value));
};
Storage.prototype.getObject = function (key) {
return JSON.parse(this.getItem(key));
};
if (typeof sessionStorage.setObject == "function") {
sstorage = sessionStorage;
}
else {
setupOldBrowser();
}
}
else {
setupOldBrowser();
}
function setupOldBrowser() {
sstorage = {};
sstorage.setObject = function (key, value) {
this[key] = JSON.stringify(value);
};
sstorage.getObject = function (key) {
if (typeof this[key] == 'string') {
return JSON.parse(this[key]);
}
else {
return null;
}
};
sstorage.removeItem = function (key) {
delete this[key];
};
}
答案 5 :(得分:0)
以下是我使用会话存储的情况,如果不可用,请使用cookies ..
var setCookie;
var getCookie;
var sessionStorageSupported = 'sessionStorage' in window
&& window['sessionStorage'] !== null;
if (sessionStorageSupported) {
setCookie = function (cookieName, value) {
window.sessionStorage.setItem(cookieName, value);
return value; //you can introduce try-catch here if required
};
getCookie = function (cookieName) {
return window.sessionStorage.getItem(cookieName);
};
}
else {
setCookie = function (cookieName, value) {
$.cookie(cookieName, value);
return value; // null if key not present
};
getCookie = function(cookieName) {
console.log("using cookies");
return $.cookie(cookieName);
};
}