【问题标题】:How to detect if browser supports HTML5 Local Storage如何检测浏览器是否支持 HTML5 本地存储
【发布时间】:2012-06-28 04:31:08
【问题描述】:

以下代码在 IE7 中提醒ls exist

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

IE7 并不真正支持本地存储,但这仍然提醒它支持。也许这是因为我在 IE7 浏览器和文档模式下使用 IE9 使用 IE9 开发人员工具。或者也许这只是测试是否支持 LS 的错误方法。什么是正确的方法?

另外,我不想使用 Modernizr,因为我只使用了一些 HTML5 功能,并且加载一个大型脚本并不值得仅仅为了检测对这些东西的支持。

【问题讨论】:

标签: javascript html


【解决方案1】:

试试window.localStorage!==undefined:

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

你也可以使用typeof window.localStorage!=="undefined",但是上面的语句已经可以了

【讨论】:

  • Safari 可能有 localStorage,但如果在私有模式下(QuotaExceededError)会抛出错误,所以 tr/catch 是最好的选择,恕我直言
  • 嗯,我不知道。但它只会在尝试写东西时抛出那个错误,对吧?
  • 实际上,当 Safari 设置为阻止 cookie 和网站数据时,仅检查 window.localStorage 属性(如本例所示)将引发错误。具体来说:SecurityError: DOM Exception 18: An attempt was made to break through the security policy of the user agent.
  • Safari 中的隐私浏览模式不支持写入 localStorage,但该检查在这种情况下返回 true。 Andreas 的解决方案处理了这种情况。
【解决方案2】:
if(typeof Storage !== "undefined")
  {
  // Yes! localStorage and sessionStorage support!
  // Some code.....
  }
else
  {
  // Sorry! No web storage support..
  }

【讨论】:

  • typeof(Storage) !== void(0) 是更好的解决方案
  • @petjato 实际上应该是if (Storage !== void(0))
  • typeof 不是函数,它是语言运算符。为什么是括号?
  • 这似乎与 W3Schools website 上的内容略有不同。它似乎也不起作用。
  • Safari 中的隐私浏览模式不支持写入 localStorage,但该检查在这种情况下返回 true。 Andreas 的解决方案处理了这种情况。
【解决方案3】:

试试:

if(typeof window.localStorage != 'undefined') {
}

【讨论】:

    【解决方案4】:

    您不必使用modernizr,但您可以使用他们的方法来检测是否支持localStorage

    modernizr at github
    test for 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;
        }
    });
    

    已更新为当前源代码

    【讨论】:

    • 在 try-catch 块之前添加var mod = "test";,否则这将始终失败,因为 mod 在那里未定义。
    • 如果本地存储中没有剩余空间,这可能会失败。
    • 老实说,这不是最好的测试,因为如果本地存储已满怎么办?可以支持localStorage,但只是处于无法添加的状态。
    • 注意,这会在其他窗口触发存储事件
    • @Andreas - 是的,我知道。此测试修改本地存储。如果您不希望这种情况发生并且只想测试支持,其他解决方案可能是更好的选择。
    【解决方案5】:

    我也不想使用 Modernizr,因为我只使用了一些 HTML5 功能和加载大型脚本并不值得仅仅为了检测 支持这几件事。

    要减小 Modernizr 文件大小,请在 http://modernizr.com/download/ 自定义文件以满足您的需求。 Modernizr 的本地存储版本只有 1.55KB。

    【讨论】:

    • 嗨,欢迎来到 Stack Overflow!这听起来更像是comment,而不是原始问题的答案。我知道你还不能发表评论,但达到 50 rep 并不难,也不费时。
    • 你可以做到 - 只剩下 9 个代表了!好的,我投了赞成票,所以现在你有 51 个
    • 我意识到 1.55kb 不算什么,但仅仅检查 localStorage 支持似乎还是有点矫枉过正。
    【解决方案6】:

    试试 catch 就可以了:

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

    【讨论】:

      【解决方案7】:
      if (window.localStorage){
      
         alert('localStorage is supported');
         window.localStorage.setItem("whatever", "string value");
      
      }
      

      【讨论】:

      • 这里的最佳答案突飞猛进
      【解决方案8】:

      这个功能很好用:

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

      来源:www.diveintohtml5.info

      【讨论】:

      • 很久了。我知道,这是我读完这本书以来最好的答案。我的问题是为什么我们要检查一件事两次是否为 NULL ?
      • 我认为第一个'localStorage' in window 检查该属性是否存在于窗口对象中(不是“未定义”),第二个window['localStorage'] !== null 检查该属性是否为NULL。
      • 不能通过简单地对 window['localStorage'] == null 进行非严格相等检查来实现吗?这涵盖了 undefined 和 null 检查。
      • 好吧,我想是的。如果你检查'window['something'] == null',结果是“真”,即使它没有定义。尽管如此,为了清楚起见,我会选择第一种方法。
      【解决方案9】:

      我没有在答案中看到它,但我认为很高兴知道您可以轻松地使用 vanilla 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 功能时,您将首先测试父对象,然后测试您的代码使用的方法。

      【讨论】:

        【解决方案10】:

        修改 Andrea 的答案以添加 getter 使其更易于使用。用下面你简单地说: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>

        【讨论】:

          【解决方案11】:

          我知道我参加聚会有点晚了,但我编写了一些有用的函数并将其放入名为“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] */
          

          【讨论】:

            猜你喜欢
            • 2020-01-04
            • 2014-10-30
            • 2017-08-06
            • 1970-01-01
            • 2013-06-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多