Soluciones de reserva de almacenamiento local HTML5 [cerrado]


Estoy buscando bibliotecas javascript y código que puedan simular localStorage en navegadores que no tienen soporte nativo.

Básicamente, me gustaría codificar mi sitio usando localStorage para almacenar datos y saber que seguirá funcionando en navegadores que no lo soportan de forma nativa. Esto significaría que una biblioteca detectaría si existe window.localStorage y la usaría si lo hace. Si no existe, entonces crearía algún tipo de método alternativo de almacenamiento local, creando su propia implementación en el window.localStorage espacio de nombres.

Hasta ahora, he encontrado estas soluciones:

  1. Simple sessionStorage implementación.
  2. Una implementación que utiliza cookies (no me entusiasma esta idea).
  3. Dojo's dojox.almacenamiento, pero es lo propio, no es realmente una alternativa.

Entiendo que Flash y Silverlight también se pueden usar para el almacenamiento local, pero no he encontrado nada sobre usarlos como alternativa para el almacenamiento local HTML5 estándar. Tal vez Google Gears tiene esta capacidad también?

Por favor, comparta cualquier biblioteca relacionada, recursos o fragmentos de código que haya encontrado. Estaría especialmente interesado en soluciones basadas en javascript puro o jquery, pero supongo que es poco probable.

Author: Tauren, 2011-01-14

9 answers

Uso PersistJS (github repository ), que maneja el almacenamiento del lado del cliente sin problemas y de forma transparente a su código. Utiliza una sola API y obtiene soporte para los siguientes backends:

  • flash: almacenamiento persistente Flash 8.
  • gears: Almacenamiento persistente basado en Google Gears.
  • localstorage: almacenamiento de borradores HTML5.
  • whatwg_db: HTML5 draft database storage.
  • globalstorage: almacenamiento de borrador HTML5 (especificaciones antiguas).
  • ie: Internet Comportamientos de datos de usuario del explorador.
  • cookie: Almacenamiento persistente basado en cookies.

Cualquiera de ellos puede desactivarse, por ejemplo, si no desea utilizar cookies. Con esta biblioteca, obtendrá soporte de almacenamiento nativo del lado del cliente en IE 5.5+, Firefox 2.0+, Safari 3.1+ y Chrome; y soporte asistido por complementos si el navegador tiene Flash o Gears. Si habilita las cookies, funcionará en todo (pero se limitará a 4 kB).

 54
Author: josh3736,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-11 13:18:07

Puro basado en JS simple localStorage polyfill:

Demo: http://jsfiddle.net/aamir/S4X35 /

HTML:

<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);
        }
    }
}​
 55
Author: Aamir Afridi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-13 14:38:19

¿Has visto la página polyfill en el wiki de Modernizr?

Https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-browser-Polyfills

Busque la sección webstorage en esa página y verá 10 soluciones potenciales (a partir de julio de 2011).

¡Buena suerte! Mark

 19
Author: Mark Lummus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-09 22:56:40

Personalmente prefiero amplificar.js . Ha funcionado muy bien para mí en el pasado y lo recomendé para todas las necesidades de almacenamiento local.

Es compatible con IE 5+, Firefox 2+, Safari 4+, Chrome, Opera 10.5+, iPhone 2+, Android 2 + y proporciona una API consistente para manejar el almacenamiento entre navegadores

 10
Author: raidfive,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-15 20:14:29

A continuación se muestra una versión ordenada de la respuesta de Aamir Afridi que mantiene todo su código encapsulado dentro del ámbito local.

He eliminado las referencias que crean una variable ret global y también eliminé el análisis de las cadenas "true" y "false" almacenadas en valores booleanos dentro del método BrowserStorage.get(), lo que podría causar problemas si uno está tratando de almacenar las cadenas "true" o "false".

Dado que la API de almacenamiento local solo admite valores de cadena, todavía se puede almacenar / recuperar Datos variables de JavaScript junto con sus tipos de datos apropiados codificando dichos datos en una cadena JSON, que luego se puede decodificar utilizando una biblioteca de codificación/decodificación JSON como https://github.com/douglascrockford/JSON-js

var BrowserStorage = (function() {
    /**
     * Whether the current browser supports local storage as a way of storing data
     * @var {Boolean}
     */
    var _hasLocalStorageSupport = (function() {
        try {
            return 'localStorage' in window && window['localStorage'] !== null;
        } catch (e) {
            return false;
        }
    })();

    /**
     * @param {String} name The name of the property to read from this document's cookies
     * @return {?String} The specified cookie property's value (or null if it has not been set)
     */
    var _readCookie = function(name) {
        var nameEQ = name + "=";
        var ca = document.cookie.split(';');
        for (var i = 0; i < ca.length; i++) {
            var c = ca[i];
            while (c.charAt(0) == ' ') c = c.substring(1, c.length);
            if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
        }

        return null;
    };

    /**
     * @param {String} name The name of the property to set by writing to a cookie
     * @param {String} value The value to use when setting the specified property
     * @param {int} [days] The number of days until the storage of this item expires
     */
    var _writeCookie = function(name, value, days) {
        var expiration = (function() {
            if (days) {
                var date = new Date();
                date.setTime(date.getTime() + (days*24*60*60*1000));
                return "; expires=" + date.toGMTString();
            }
            else {
                return "";
            }
        })();

        document.cookie = name + "=" + value + expiration + "; path=/";
    };

    return {
        /**
         * @param {String} name The name of the property to set
         * @param {String} value The value to use when setting the specified property
         * @param {int} [days] The number of days until the storage of this item expires (if storage of the provided item must fallback to using cookies)
         */
        set: function(name, value, days) {
            _hasLocalStorageSupport
                ? localStorage.setItem(name, value)
                : _writeCookie(name, value, days);
        },

        /**
         * @param {String} name The name of the value to retrieve
         * @return {?String} The value of the 
         */
        get: function(name) {
            return _hasLocalStorageSupport
                ? localStorage.getItem(name) 
                : _readCookie(name);
        },

        /**
         * @param {String} name The name of the value to delete/remove from storage
         */
        remove: function(name) {
            _hasLocalStorageSupport
                ? localStorage.removeItem(name)
                : this.set(name, "", -1);
        }
    };
})();
 10
Author: Steven,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-23 20:59:56

Conservar.js utiliza userData e IE y localStorage en otros navegadores.

  • No intente hacer nada demasiado complejo

  • No se necesitan cookies, flash ni jQuery.

  • API limpia.

  • 5 kb compressed

Https://github.com/marcuswestin/store.js

 3
Author: Mikko Ohtamaa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-16 22:28:23

La página MDN para el almacenamiento DOM ofrece varias soluciones alternativas que utilizan cookies.

 1
Author: alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-11 00:48:56

Silla de césped parece ser una buena alternativa también

Una silla de césped es algo así como un sofá, excepto más pequeño y exterior. perfecto para aplicaciones móviles html5 que necesitan un peso ligero, adaptable, simple y solución de persistencia elegante.

  • colecciones. una instancia de lawnchair es realmente solo una serie de objetos.
  • persistencia adaptativa. el almacén subyacente se abstrae detrás de una interfaz consistente.
  • comportamiento de colección conectable. a veces necesitamos ayudantes de recolección, pero no siempre.
 1
Author: j0k,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-11 13:21:24

Existe realstorage, que usa Engranajes como alternativa.

 0
Author: Gaurav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-14 17:59:24