HTML5 本地存储回退解决方案 [已关闭]

2022-08-30 05:03:39

我正在寻找可以在没有本机支持的浏览器上进行模拟的javascript库和代码。localStorage

基本上,我想使用我的网站来存储数据,并且知道它仍然可以在本身不支持它的浏览器上运行。这意味着库将检测是否存在,如果存在,则使用它。如果它不存在,那么它将通过在命名空间中创建自己的实现来创建某种本地存储的回退方法。localStoragewindow.localStoragewindow.localStorage

到目前为止,我已经找到了这些解决方案:

  1. 简单的会话存储实现。
  2. 使用 cookie 的实现(对这个想法并不感到兴奋)。
  3. Dojo的dojox.storage,但它是它自己的东西,而不是真正的后备方案。

我知道Flash和Silverlight也可以用于本地存储,但是还没有发现将它们用作标准HTML5 localStorage的后备方案。也许Google Gears也有这种能力?

请分享您找到的任何相关库、资源或代码片段!我对纯javascript或基于jquery的解决方案特别感兴趣,但我猜这不太可能。


答案 1

基于纯 JS 的简单 localStorage polyfill:

演示:http://jsfiddle.net/aamir/S4X35/

网页:

<a href='#' onclick="store.set('foo','bar')">set key: foo, with value: bar</a><br/>
<a href='#' onclick="alert(store.get('foo'))">get key: foo</a><br/>
<a href='#' onclick="store.del('foo')">delete key: foo</a>​

JS:

window.store = {
    localStoreSupport: function() {
        try {
            return 'localStorage' in window && window['localStorage'] !== null;
        } catch (e) {
            return false;
        }
    },
    set: function(name,value,days) {
        if (days) {
            var date = new Date();
            date.setTime(date.getTime()+(days*24*60*60*1000));
            var expires = "; expires="+date.toGMTString();
        }
        else {
            var expires = "";
        }
        if( this.localStoreSupport() ) {
            localStorage.setItem(name, value);
        }
        else {
            document.cookie = name+"="+value+expires+"; path=/";
        }
    },
    get: function(name) {
        if( this.localStoreSupport() ) {
            var ret = localStorage.getItem(name);
            //console.log(typeof ret);
            switch (ret) {
              case 'true': 
                  return true;
              case 'false':
                  return false;
              default:
                  return ret;
            }
        }
        else {
            // cookie fallback
            /*
             * after adding a cookie like
             * >> document.cookie = "bar=test; expires=Thu, 14 Jun 2018 13:05:38 GMT; path=/"
             * the value of document.cookie may look like
             * >> "foo=value; bar=test"
             */
            var nameEQ = name + "=";  // what we are looking for
            var ca = document.cookie.split(';');  // split into separate cookies
            for(var i=0;i < ca.length;i++) {
                var c = ca[i];  // the current cookie
                while (c.charAt(0)==' ') c = c.substring(1,c.length);  // remove leading spaces
                if (c.indexOf(nameEQ) == 0) {  // if it is the searched cookie
                    var ret = c.substring(nameEQ.length,c.length);
                    // making "true" and "false" a boolean again.
                    switch (ret) {
                      case 'true':
                          return true;
                      case 'false':
                          return false;
                      default:
                          return ret;
                    }
                }
            }
            return null; // no cookie found
        }
    },
    del: function(name) {
        if( this.localStoreSupport() ) {
            localStorage.removeItem(name);
        }
        else {
            this.set(name,"",-1);
        }
    }
}​

答案 2

我使用 PersistJSgithub 存储库),它可以无缝且透明地处理客户端存储。您可以使用单个 API 并获得对以下后端的支持:

  • 闪存:闪存 8 持久性存储。
  • gears:基于Google Gears的持久存储。
  • 本地存储:HTML5 草稿存储。
  • whatwg_db:HTML5 草稿数据库存储。
  • 全局存储:HTML5 草稿存储(旧规范)。
  • 即:Internet Explorer 用户数据行为。
  • Cookie:基于 Cookie 的持久性存储。

其中任何一个都可以禁用,例如,如果您不想使用 Cookie。有了这个库,你将获得IE 5.5+,Firefox 2.0+,Safari 3.1+和Chrome中的本机客户端存储支持;和插件辅助支持(如果浏览器具有 Flash 或 Gears)。如果您启用Cookie,它将适用于所有内容(但限制为4 kB)。