Проверьте, доступен ли 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. Так есть ли способ проверить, если человек его выключил полностью?

обновление: Это вторая функция, которую я пробовал, и я до сих пор не получаю ответа (предупреждение).

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

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, что означает только то, что мы использовали все доступное пространство для хранения, но хранение на самом деле скачать. Наша функция обнаружения должна учитывать эти сценарии счет.

посмотреть здесь Краткая история функции обнаружения 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{
          }