Проверьте, доступен ли localStorage

Я знаю, что было много вопросов о проверке localStorage но что, если кто-то вручную ее отключит в браузере? Вот код, который я использую для проверки:

localStorage.setItem('mod', 'mod');
if (localStorage.getItem('mod') != null){
    alert ("yes");
    localStorage.removeItem('mod');
}else{
    alert ("no");
}

простая функция, и она работает. Но если я войду в настройки Chrome и выберу опцию "Не сохранять данные" (я точно не помню, как она называется), при попытке запустить эту функцию я не получу ничего, кроме Uncaught Error: SecurityError: DOM Exception 18. Так есть ли способ проверить, выключен ли человек полностью?

UPDATE: это вторая функция, которую я пробовал, и я все еще не получаю ответа (alert).

try {
 localStorage.setItem("name", "Hello World!");
} catch (e) {
 if (e == QUOTA_EXCEEDED_ERR) {
     alert('Quota exceeded!');
}
}

8 ответов


использовать modernizrподход (возможно, вы захотите изменить имя моей функции на что-то лучшее):

function lsTest(){
    var test = 'test';
    try {
        localStorage.setItem(test, test);
        localStorage.removeItem(test);
        return true;
    } catch(e) {
        return false;
    }
}

if(lsTest() === true){
    // available
}else{
    // unavailable
}

это не так лаконично, как другие методы, но это потому, что он предназначен для максимальной совместимости.

исходный источник: https://github.com/Modernizr/Modernizr/blob/master/feature-detects/storage/localstorage.js

пример: http://jsfiddle.net/6sm54/2/


Я бы проверил, что localStorage определяется до любого действия, которое зависит от него:

if (typeof localStorage !== 'undefined') {
    var x = localStorage.getItem('mod');
} else {
    // localStorage not defined
}

обновление:

Если вам нужно проверить, что функция есть, и что он тоже не отключена, вы должны использовать более безопасный подход. Чтобы быть в полной безопасности:

if (typeof localStorage !== 'undefined') {
    try {
        localStorage.setItem('feature_test', 'yes');
        if (localStorage.getItem('feature_test') === 'yes') {
            localStorage.removeItem('feature_test');
            // localStorage is enabled
        } else {
            // localStorage is disabled
        }
    } catch(e) {
        // localStorage is disabled
    }
} else {
    // localStorage is not available
}

функции-обнаружение локального хранилища сложно. Тебе нужно действительно дотянуться до него. Причина этого в том, что Safari решила предложить функциональный localStorage объект в частном режиме,но с его quotum установлен в ноль. Это означает, что, хотя все простые функции обнаружения будут проходить, любые вызовы localStorage.setItem выдаст исключение.

сетевая запись разработчика Mozilla в API веб-хранилища имеет выделенный раздел о функции обнаружения локальных хранение. Вот метод, рекомендованный на этой странице:

function storageAvailable(type) {
    try {
        var storage = window[type],
            x = '__storage_test__';
        storage.setItem(x, x);
        storage.removeItem(x);
        return true;
    }
    catch(e) {
        return false;
    }
}

и вот как вы его используете:

if (storageAvailable('localStorage')) {
    // Yippee! We can use localStorage awesomeness
}
else {
    // Too bad, no localStorage for us
}

если вы используете NPM, вы можете захватить хранилище-в наличии используя

npm install -S storage-available

затем используйте функцию так:

if (require('storage-available')('localStorage')) {
    // Yippee! We can use localStorage awesomeness
}

отказ от ответственности: и раздел документации по MDN, и пакет NPM были разработаны мной.


С помощью этой функции вы можете проверить, доступен ли localstorage или нет, и вы держите под контролем возможные исключения.

function isLocalStorageAvailable() {

    try {
        var valueToStore = 'test';
        var mykey = 'key';
        localStorage.setItem(mykey, valueToStore);
        var recoveredValue = localStorage.getItem(mykey);
        localStorage.removeItem(mykey);

        return recoveredValue === valueToStore;
    } catch(e) {
        return false;
    }
}

MDN обновлено функция обнаружения хранилища. В 2018 году, это более надежный:

function storageAvailable() {
    try {
        var storage = window['localStorage'],
            x = '__storage_test__';
        storage.setItem(x, x);
        storage.removeItem(x);
        return true;
    }
    catch(e) {
        return e instanceof DOMException && (
            // everything except Firefox
            e.code === 22 ||
            // Firefox
            e.code === 1014 ||
            // test name field too, because code might not be present
            // everything except Firefox
            e.name === 'QuotaExceededError' ||
            // Firefox
            e.name === 'NS_ERROR_DOM_QUOTA_REACHED') &&
            // acknowledge QuotaExceededError only if there's something already stored
            storage.length !== 0;
    }
}

браузеры, поддерживающие localStorage, будут иметь свойство объекта window с именем localStorage. Однако по разным причинам простое утверждение о существовании свойства может вызывать исключения. Если он существует, это все еще не гарантирует, что localStorage действительно доступен, поскольку различные браузеры предлагают настройки, отключающие localStorage. Таким образом, браузер может поддержка localStorage, но не сделать это скачать скриптов на странице. Одним из примеров этого является Safari, который в режиме частного просмотра дает нам пустой объект localStorage с нулевой квотой, что делает его непригодным для использования. Однако мы все равно можем получить законный QuotaExceededError, что означает только то, что мы использовали все доступное пространство для хранения, но хранилище на самом деле скачать. Наша функция detect должна учитывать эти сценарии счет.

посмотреть здесь Краткая история функции обнаружения localStorage.


вот простая проверка:

if(typeof localStorage === 'undefined'){


изменение ответа Джо для добавления геттера упрощает его использование. С нижеприведенным вы просто говорите:if(ls)...

Object.defineProperty(this, "ls", {
  get: function () { 
    var test = 'test';
    try {
      localStorage.setItem(test, test);
      localStorage.removeItem(test);
      return true;
    } catch(e) {
      return false;
    }
  }
});

используйте это, чтобы проверить localStorage установлен или нет. Это поможет вам получить статус Localstorage.

    if( window.localStorage.fullName !== undefined){

           //action
   }else{
          }