【问题标题】:determine whether Web Storage is supported or not确定是否支持 Web Storage
【发布时间】:2012-01-07 07:21:42
【问题描述】:

我需要验证 Web Storage API 是否受支持且可用(它可能由于安全问题而被禁用)。

所以,我认为检查是否定义了 sessionStorage 或 localStorage 类型就足够了:

if (typeof sessionStorage != 'undefined')
{
    alert('sessionStorage available');
}
else
{
    alert('sessionStorage not available');
}

但是,我想知道该类型是否存在,但无论如何我都无法使用 Web Storage API。

备注: 我知道如果禁用 cookie 并访问 sessionStorage 或 localStorage,Firefox 会引发安全错误。

【问题讨论】:

    标签: javascript local-storage web-storage session-storage


    【解决方案1】:

    为什么不使用Modernizr 库来检测是否支持本地存储?浏览器之间的任何差异都会为您处理,然后您可以使用如下代码:

    if (Modernizr.localstorage) {
        // browser supports local storage
    } else {
        // browser doesn't support local storage
    }
    

    【讨论】:

    • 嗯,这不适用于 Firefox 和禁用的 Cookie。我已经对其进行了测试,但仍然出现安全错误。
    • @SaschaHoll - 你遇到了什么错误?哪个版本的火狐?它在 Firefox 8.0 中对我来说很好用。
    • 此处版本相同。您需要禁用 cookie。如果你这样做是行不通的(见我的最新回答)。
    • 我已经尝试过启用 cookie(Modernizr.localstorage 为 true)和禁用 cookie(Modernizr.localstorage 为 false) - 屏幕或控制台输出中没有错误。
    • 哼,这很奇怪。那么,您是否已取消选中“接受来自站点的 cookie”?如果我这样做,Modernizr.localstorage 为真,并引发安全错误。
    【解决方案2】:

    我认为你的原始代码走在正确的轨道上,没必要把它弄得太花哨。

    在代码中使用 KISS principle 且没有其他依赖项:

    var storageEnabled = function() {
        try {
            sessionStorage.setItem('test-key','test-value');
            if (sessionStorage.getItem('test-key') == 'test-value'){
                return true;
            }
        } catch (e) {};
        return false;
    };
    
    alert(storageEnabled() ? 'sessionStorage available' : 'sessionStorage not available');
    

    【讨论】:

      【解决方案3】:
      try{
          ssSupport = Object.prototype.toString.call( sessionStorage ) === "[object Storage]";
      }
      catch(e){
          ssSupport = false;
      }
      

      【讨论】:

        【解决方案4】:

        所以,因为 Modernizr.localstorageModernizr.sessionstorage 将返回 true 而 Firefox 可能与禁用的 Cookie 一起使用(这将导致安全错误)或任何其他专有(意外)行为可能发生:我已经编写了自己的webStorageEnabled 功能似乎很好用。

        function cookiesEnabled()
        {
            // generate a cookie to probe cookie access
            document.cookie = '__cookieprobe=0;path=/';
            return document.cookie.indexOf('__cookieprobe') != -1;
        }
        
        function webStorageEnabled()
        {
            if (typeof webStorageEnabled.value == 'undefined')
            {
                try
                {
                    localStorage.setItem('__webstorageprobe', '');
                    localStorage.removeItem('__webstorageprobe');
                    webStorageEnabled.value = true;
                }
                catch (e) {
                    webStorageEnabled.value = false;
                }
            }
        
            return webStorageEnabled.value;
        }
        
        
        // conditional
        
        var storage = new function()
        {
            if (webStorageEnabled())
            {
                return {
                    local:   localStorage,
                    session: sessionStorage
                };
            }
            else
            {
                return {
                    local: cookiesEnabled() ? function()
                    {
                        // use cookies here
                    }() : null,
        
                    session: function()
                    {
                        var data = {};
        
                        return {
                            clear: function () {
                                data = {};
                            },
        
                            getItem: function(key) {
                                return data[key] || null;
                            },
        
                            key: function(i)
                            {
                                var index = 0;
                                for (var value in data)
                                {
                                    if (index == i)
                                        return value;
                                    ++index;
                                }
                            },
        
                            removeItem: function(key) {
                                delete data[key];
                            },
        
                            setItem: function(key, value) {
                                data[key] = value + '';
                            }
                        };
                    }()
                };
            }
        }
        

        希望这对某人也有用。

        【讨论】:

          【解决方案5】:

          我的版本(因为在 IE 8 更多的 Intranet 站点上运行的 IE 9 已损坏)。

          if (typeof (Storage) != "undefined" && !!sessionStorage.getItem) {
          
          }
          

          添加 setObject 以允许存储对象的更长版本:

          var sstorage;
          
          if (typeof (Storage) != "undefined" && !!sessionStorage.getItem) {
              Storage.prototype.setObject = function (key, value) {
                  this.setItem(key, JSON.stringify(value));
              };
          
              Storage.prototype.getObject = function (key) {
                  return JSON.parse(this.getItem(key));
              };
              if (typeof sessionStorage.setObject == "function") {
                  sstorage = sessionStorage;
              }
              else {
                  setupOldBrowser();
              }
          }
          else {
              setupOldBrowser();
          }
          
          
          function setupOldBrowser() {
              sstorage = {};
              sstorage.setObject = function (key, value) {
                  this[key] = JSON.stringify(value);
              };
              sstorage.getObject = function (key) {
                  if (typeof this[key] == 'string') {
                      return JSON.parse(this[key]);
                  }
                  else {
                      return null;
                  }
              };
          
              sstorage.removeItem = function (key) {
                  delete this[key];
              };
          }
          

          【讨论】:

            【解决方案6】:

            以下是我使用会话存储的方法(如果可用),如果不可用,请使用 cookie..

            var setCookie; 
            var getCookie;
            
            var sessionStorageSupported = 'sessionStorage' in window 
                                               && window['sessionStorage'] !== null;
            
            if (sessionStorageSupported) {
                setCookie = function (cookieName, value) {
                    window.sessionStorage.setItem(cookieName, value);
                    return value; //you can introduce try-catch here if required
                };
                getCookie = function (cookieName) {
                    return window.sessionStorage.getItem(cookieName);
                };
            }
            else {
                setCookie = function (cookieName, value) {
                    $.cookie(cookieName, value);
                    return value; // null if key not present
                };
                getCookie = function(cookieName) {
                    console.log("using cookies");
                    return $.cookie(cookieName);
                };
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-08-06
              • 2018-02-01
              • 1970-01-01
              • 2012-08-10
              • 2021-08-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多