Как определить, поддерживает ли браузер локальное хранилище HTML5


85

Следующие предупреждения кода ls existв IE7:

if(window.localStorage) {
    alert('ls exists');
} else {
    alert('ls does not exist');
}

IE7 на самом деле не поддерживает локальное хранилище, но это все равно предупреждает об этом. Возможно, это связано с тем, что я использую IE9 в браузере IE7 и в режимах документов с помощью инструмента разработчика IE9. Или, может быть, это просто неправильный способ проверить, поддерживается ли LS. Какой правильный путь?

Также я не хочу использовать Modernizr, поскольку я использую только несколько функций HTML5, а загрузка большого скрипта не стоит того, чтобы просто обнаружить поддержку этих немногих вещей.


Возможный дубликат проверки HTML 5 localStorage
BuZZ-dEE

Ответы:


100

Вам не обязательно использовать modernizr, но вы можете использовать их метод, чтобы определить, localStorageподдерживается ли

modernizr на github
тест дляlocalStorage

// In FF4, if disabled, window.localStorage should === null.

// Normally, we could not test that directly and need to do a
//   `('localStorage' in window) && ` test first because otherwise Firefox will
//   throw bugzil.la/365772 if cookies are disabled

// Also in iOS5 & Safari Private Browsing mode, attempting to use localStorage.setItem
// will throw the exception:
//   QUOTA_EXCEEDED_ERRROR DOM Exception 22.
// Peculiarly, getItem and removeItem calls do not throw.

// Because we are forced to try/catch this, we'll go aggressive.

// Just FWIW: IE8 Compat mode supports these features completely:
//   www.quirksmode.org/dom/html5.html
// But IE8 doesn't support either with local files

Modernizr.addTest('localstorage', function() {
    var mod = 'modernizr';
    try {
        localStorage.setItem(mod, mod);
        localStorage.removeItem(mod);
        return true;
    } catch(e) {
        return false;
    }
});

обновлен текущим исходным кодом


3
Добавьте var mod = "test";перед блоком try-catch, иначе это всегда будет ошибкой, так как там мод не определен.
Mahn

5
это может привести к сбою, если в локальном хранилище не осталось места.
Патрик

1
Честно говоря, это не лучший тест, потому что что, если локальное хранилище просто заполнено? localStorage может поддерживаться, но только в том состоянии, в котором вы не можете добавлять.
DemiImp

2
Обратите внимание: это вызовет события хранения в других окнах
Марк Свардстрем

2
@Andreas - Да, я знаю. Этот тест изменяет локальное хранилище. Если вы не хотите, чтобы это произошло, и просто хотите проверить наличие поддержки, другие решения могут быть лучшим выбором.
Марк Свардстрем,

45
if(typeof Storage !== "undefined")
  {
  // Yes! localStorage and sessionStorage support!
  // Some code.....
  }
else
  {
  // Sorry! No web storage support..
  }

7
typeof(Storage) !== void(0)это лучшее решение
Petja

2
@petjato так и должно бытьif (Storage !== void(0))
Эндрю

4
typeofне функция, это оператор языка. почему скобка?
r3wt

1
Похоже, это небольшой вариант того, что можно найти на веб-сайте W3Schools . Это тоже не работает.
fujiiface

2
Режим приватного просмотра в Safari не поддерживает запись в localStorage, но в этом случае эта проверка возвращает true. Решение Андреаса справляется с этим случаем.
Deepak Joy

16

Эта функция отлично работает:

function supports_html5_storage(){
    try {
        return 'localStorage' in window && window['localStorage'] !== null;
    } catch(e) {
        return false;
    }
}

Источник: www.diveintohtml5.info


1
Прошло много времени. и я знаю, что это лучший ответ с тех пор, как я прочитал книгу. На мой вопрос, почему мы дважды проверяем одно значение на NULL?
Али Сабери

Я думаю, что первая 'localStorage' in windowпроверяет, существует ли свойство в объекте окна (не «undefined»), а вторая window['localStorage'] !== nullпроверяет, что это свойство не равно NULL.
juanra

1
Разве этого нельзя добиться, просто выполнив нестрогую проверку равенства window ['localStorage'] == null? Это касается как неопределенной, так и нулевой проверки.
Трийнко

Ну, наверное, да. Если вы отметите ´window ['something'] == null´, результат будет "true", даже если он не определен. Тем не менее для ясности я бы выбрал первый метод.
juanra 03

15

Также я не хочу использовать Modernizr, поскольку я использую только несколько функций HTML5, а загрузка большого скрипта не стоит того, чтобы просто обнаружить поддержку этих немногих вещей.

Чтобы уменьшить размер файла Modernizr, настройте файл на http://modernizr.com/download/ в соответствии со своими потребностями. Версия Modernizr только для localStorage имеет размер 1,55 КБ.


3
Привет, добро пожаловать в Stack Overflow! Это действительно больше похоже на комментарий, а не на ответ на исходный вопрос. Я понимаю, что вы пока не можете комментировать, но набрать 50 повторений не сложно и не требует много времени.
Джесси

1
ты справишься - осталось только 9 повторений! хорошо, я проголосовал за, так что теперь у вас 51
Simon_Weaver

Я понимаю, что 1,55 КБ - это ничто, но все равно кажется излишним просто проверить поддержку localStorage.
Тайлер Бискоу

9

Попробуйте window.localStorage!==undefined:

if(window.localStorage!==undefined){
    //Do something
}else{
    alert('Your browser is outdated!');
}

Вы также можете использовать typeof window.localStorage!=="undefined", но в приведенном выше заявлении это уже сделано


2
Safari может иметь localStorage, но выдает ошибку, если в частном режиме (QuotaExceededError), поэтому tr / catch - лучший вариант. ИМХО
Endless

1
Хм, я этого не знал. Но эта ошибка возникает только при попытке что-то написать, верно?
Данило Валенте

1
На самом деле простая проверка атрибута window.localStorage (как показано в этом примере) вызовет ошибку, если Safari настроен на блокировку файлов cookie и данных веб-сайта. В частности:SecurityError: DOM Exception 18: An attempt was made to break through the security policy of the user agent.
Аароний

Режим приватного просмотра в Safari не поддерживает запись в localStorage, но в этом случае эта проверка возвращает true. Решение Андреаса справляется с этим случаем.
Deepak Joy

7

Я не видел этого в ответах, но я думаю, что хорошо знать, что вы можете легко использовать ванильный JS или jQuery для таких простых тестов, и, хотя Modernizr очень помогает, есть чистые решения и без него.

Если вы используете jQuery , вы можете:

var _supportsLocalStorage = !!window.localStorage
    && $.isFunction(localStorage.getItem)
    && $.isFunction(localStorage.setItem)
    && $.isFunction(localStorage.removeItem);

Или с чистым ванильным JavaScript :

var _supportsLocalStorage = !!window.localStorage
    && typeof localStorage.getItem === 'function'
    && typeof localStorage.setItem === 'function'
    && typeof localStorage.removeItem === 'function';

Затем вы просто выполните IF, чтобы проверить поддержку:

if (_supportsLocalStorage) {
    console.log('ls is supported');
    alert('ls is supported');
}

Таким образом, вся идея заключается в том, что всякий раз, когда вам нужны функции JavaScript, вы должны сначала протестировать родительский объект, а затем методы, которые использует ваш код.


3

Попробуйте поймать:

    try{
       localStorage.setItem("name",name.value);
       localStorage.setItem("post",post.value);
       }
    catch(e){
       alert(e.message);    
       }



1

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

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

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

function script(){
  if(ls){
    alert('Yes');
  } else {
    alert('No');
  }
}
<button onclick="script()">Local Storage Support?</button>


0

Я знаю, что немного опаздываю на вечеринку, но у меня есть несколько полезных функций, которые я приготовил и поместил в файл с именем manage_storage.js. Я надеюсь, что они так же полезны для вас, как и мне.

Помните: функция, которую вы ищете (которая отвечает на этот вопрос), есть isLclStorageAllowed.

Итак, без лишних слов, вот мой код:

/* Conditional Function checks a web browser for 'session storage' support. [BEGIN] */

if (typeof isSessStorageAllowed !== 'function')
    {
        function isSessStorageAllowed()
            {
                if (!!window.sessionStorage && typeof sessionStorage.getItem === 'function' && typeof sessionStorage.setItem === 'function' && typeof sessionStorage.removeItem === 'function')
                    {
                        try
                            {
                                var cur_dt = new Date();
                                var cur_tm = cur_dt.getTime();
                                var ss_test_itm_key = 'ss_test_itm_' + String(cur_tm);
                                var ss_test_val = 'ss_test_val_' + String(cur_tm);

                                sessionStorage.setItem(ss_test_itm_key, String(ss_test_val));

                                if (sessionStorage.getItem(ss_test_itm_key) == String(ss_test_val))
                                    {
                                        return true;
                                    }
                                else
                                    {
                                        return false;
                                    };

                                sessionStorage.removeItem(ss_test_itm_key);
                            }
                        catch (exception)
                            {
                                return false;
                            };
                    }
                else
                    {
                        return false;
                    };
            };
    };

/* Conditional Function checks a web browser for 'session storage' support. [END] */

/* Conditional Function checks a web browser for 'local storage' support. [BEGIN] */

if (typeof isLclStorageAllowed !== 'function')
    {
        function isLclStorageAllowed()
            {
                if (!!window.localStorage && typeof localStorage.getItem === 'function' && typeof localStorage.setItem === 'function' && typeof localStorage.removeItem === 'function')
                    {
                        try
                            {
                                var cur_dt = new Date();
                                var cur_tm = cur_dt.getTime();
                                var ls_test_itm_key = 'ls_test_itm_' + String(cur_tm);
                                var ls_test_val = 'ls_test_val_' + String(cur_tm);

                                localStorage.setItem(ls_test_itm_key, String(ls_test_val));

                                if (localStorage.getItem(ls_test_itm_key) == String(ls_test_val))
                                    {
                                        return true;
                                    }
                                else
                                    {
                                        return false;
                                    };

                                localStorage.removeItem(ls_test_itm_key);
                            }
                        catch (exception)
                            {
                                return false;
                            };
                    }
                else
                    {
                        return false;
                    };
            };
    };

/* Conditional Function checks a web browser for 'local storage' support. [END] */

/* Conditional Function checks a web browser for 'web storage' support. [BEGIN] */

/* Prerequisites: 'isSessStorageAllowed()', 'isLclStorageAllowed()' */

if (typeof isWebStorageAllowed !== 'function')
    {
        function isWebStorageAllowed()
            {
                if (isSessStorageAllowed() === true && isLclStorageAllowed() === true)
                    {
                        return true;
                    }
                else
                    {
                        return false;
                    };
            };
    };

/* Conditional Function checks a web browser for 'web storage' support. [END] */
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.