2013-05-07 4 views
43

Я знаю, что было много вопросов о проверке 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!'); 
} 
} 
+1

Исключить? – PeeHaa

+0

все еще не дает никакого способа увидеть, работает ли он или нет ... – user2025469

+5

Uhhhhmmm. Если он выдает исключение, вы * знаете *, он не работает – PeeHaa

ответ

79

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

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/

+1

Hey Joe, я получаю эту ошибку при запуске вашей функции (LS включен или выключен) «Uncaught SyntaxError: Illegal return statement» – user2025469

+1

@ user2025469 Этот код предназначен для использования в качестве функции. – Kiruse

+1

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

9

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

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

UPDATE:

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

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 
} 
+1

В данных обстоятельствах это всего лишь функция, которая предотвратит ошибку других браузеров ... поэтому на самом деле это не отвечает на вопрос. Если отключено, 'localStorage' все еще определено в' window'. – Kiruse

+0

Вы по-прежнему получаете ошибку DOM ... Я просто не могу поверить, что нет способа проверить, полностью ли она отключена ... – user2025469

+1

Это небезопасный подход для Chrome и Opera ... скорее всего, не Safari, потому что 'localStorage' полностью недоступен, и будет выбрано исключение. – Shikkediel

-2

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

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

      //action 
    }else{ 
      } 
+4

Вам не нужно ждать, пока документ будет загружен для доступа к localStorage (поэтому '$()' бессмысленно). Что еще более важно, этот код выдает ошибку, если localStorage недоступен. – 1j01

+0

На самом деле, Mozilla docs заявляет, что «localStorage» является синхронным по своей природе, поэтому он может блокировать рендеринг основного документа.Поэтому ожидание его готовности было бы хорошим подходом. – Shikkediel

+0

Что они подразумевают, говоря, что 'localStorage' является синхронным, так это то, что' localStorage.getItem ('someKey') 'фактически немедленно возвращает элемент. Он не принимает функцию обратного вызова или возвращает 'Promise', он сразу возвращает данные. Контрастируйте это, например, 'var result = fetch ('https://example.com/data.json')' ..., который возвращает 'Promise', что делает его асинхронным. Вам нужно будет вызвать метод 'then' для получения данных (произойдет только во время следующего тика):' result.then (function (data) {/ * только здесь мы получаем данные * /}) ' –

-1

Изменение ответа Джо на добавление геттера упрощает его использование. С ниже вы просто сказать: 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; 
    } 
    } 
}); 
+0

Почему downvote? Он работает, и набирать 'ls' лучше, чем набирать' lsTest() === true'. ...? –

+0

Не работает. Вы назначаете объект 'ls' ... как таковой' if (ls) 'всегда будет оцениваться как' true'. Просто проверьте его, изменив метод 'get', чтобы прочитать' get: function() {return false} ', и вы увидите. Кроме того, ввод 'ls' не лучше ... Этот тест будет не слишком часто в вашем коде (если вы напишете его по-умному), так зачем загрязнять (глобальную) область с очень короткой переменной? –

+0

ваше право. Я собираюсь это исправить ... Спасибо! –

-1

Вот простой проверка:

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

+2

Тип 'localStorage' возвращает' object', даже если он отключен в Firefox или IE. В Chrome и Opera 'typeof' выдает исключение и разбивает весь скрипт, когда пользователь отключил его ... – Shikkediel

+1

отличный комментарий @Shikkediel за это – Brady

+0

И в Safari в режиме частного просмотра вы получаете рабочий объект localStorage который имеет квоту нуля и, таким образом, выдает исключение всякий раз, когда вы пытаетесь написать ему. Именно поэтому локальная функция обнаружения памяти теперь всегда пытается написать элемент. –

2

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

Сетевая запись разработчика Mozilla в API веб-хранилища имеет dedicated section on feature detecting local storage.Вот метод рекомендуется на этой странице:

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 
} 

Если вы используете НПМ, вы можете захватить storage-available используя

npm install -S storage-available 

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

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

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

0

С помощью этой функции вы можете проверить, доступен ли 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; 
    } 
} 
Смежные вопросы