определить, поддерживается ли веб-хранилище или нет - PullRequest
1 голос
/ 27 ноября 2011

Мне нужно убедиться, что API веб-хранилища поддерживается и доступен (он может быть отключен из-за проблем безопасности).

Итак, я подумал, что будет достаточно проверить, определен ли тип sessionStorage или localStorage:

if (typeof sessionStorage != 'undefined')
{
    alert('sessionStorage available');
}
else
{
    alert('sessionStorage not available');
}

Однако мне было интересно, возможно ли, что тип существует, но я все равно не смог бы использовать API веб-хранилища.

Примечания: Я знаю, что Firefox выдаст ошибку безопасности, если куки отключены, а доступ к sessionStorage или localStorage.

Ответы [ 6 ]

5 голосов
/ 27 ноября 2011

Почему бы вам не использовать библиотеку Modernizr , чтобы определить, поддерживается ли локальное хранилище или нет? Любые различия между браузерами позаботятся о вас, тогда вы можете просто использовать код, подобный этому:

if (Modernizr.localstorage) {
    // browser supports local storage
} else {
    // browser doesn't support local storage
}
3 голосов
/ 28 ноября 2011

Я думаю, что вы на правильном пути со своим исходным кодом, нет необходимости делать это слишком причудливым.

Использование принципа KISS без дополнительных зависимостей в вашем коде:

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');
1 голос
/ 27 ноября 2011
try{
    ssSupport = Object.prototype.toString.call( sessionStorage ) === "[object Storage]";
}
catch(e){
    ssSupport = false;
}
0 голосов
/ 24 июля 2012

Вот что я делаю, чтобы использовать хранилище сеансов, если оно доступно, если нет, использовать куки ..

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);
    };
}
0 голосов
/ 15 марта 2012

Моя версия (потому что IE 9, работающий в 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];
    };
}
0 голосов
/ 27 ноября 2011

Итак, потому что Modernizr.localstorage соответственно Modernizr.sessionstorage вернет true, в то время как Firefox может использоваться с отключенными Cookies (что приведет к ошибке безопасности), или может произойти любое другое запатентованное (неожиданное) поведение: я написал свой собственный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 + '';
                    }
                };
            }()
        };
    }
}

Надеюсь, это будет полезно и для кого-то.

...