2012-10-09 49 views
9

Después de una queja de uno de nuestros usuarios y al ejecutar algunas pruebas, Firefox 15 y 16 (y probablemente versión anterior) lo hacen desactivando las cookies. almacenamiento local. Ni siquiera se puede crear un polyfill para ello como cada vez que intente acceder window.localStorage se obtiene Error: The operation is insecure.Solución para el usuario de Firefox que deshabilita las cookies y localStorage - polyfill no es posible

Lanzar un intento de captura le permitirá comprobar para ver si se trata de personas con discapacidad, pero no va a dejar que se reemplaza la variable con su propia solución . La siguiente polyfill rápida no funcionará porque FF ignora estableciendo la variable y arrojará el mismo error al intentar acceder a ella:

try{ 
     window.localStorage; 
}catch(err){ 
     window.localStorage = { 
       getItem: function(k){ 
        return this.k; 
       }, 
       setItem: function(k,v){ 
        this.k = v; 
       } 
     }; 
} 

La única solución parece ser mover el localStorage "falso" a otra variable, pero esto haría ser molesto ya que tenemos un montón de código y una js lib que se basan en el acceso a esta variable. Alguna solución?

Editar: No es óptimo mostrar una alerta para indicar a los usuarios que se requieren cookies. Si los visitantes solo quieren ver el sitio y no registrarse, entonces realmente no necesitan cookies. Pero al ser una aplicación backbone.js y transmitir muchos datos, almacenamos cosas en localStorage bastante.

+3

Si puede verificar si está deshabilitado, solo muestre una alerta o algo que le indique que debe habilitar las cookies para su sitio. – MrOBrian

+0

Gracias MrObrian, lo hice y estoy inyectando un div con el mensaje, pero sería óptimo para que localStorage simplemente funcione como una tienda de clave/valor que no persistió, ya que eso es lo que quiere el usuario. –

+0

"pero sería óptimo que localStorage simplemente funcionara como un almacén de clave/valor que no persistió" ¿por qué no utilizar simplemente una matriz js simple en este caso? –

Respuesta

0

Usamos esto como nuestra lib para almacenamiento local.

(function (window, $, undefined) { 
    var store = window.store = {}; 

    function deserialize(val) { 
     if (!val) return null; 
     var obj = $.parseJSON(val); 
     return obj; 
    }; 

    function processRequest(loc, key, value) { 
     var obj; 
     // if value is not specified at all assume we are doing a get. 
     if (value === undefined) { 
      // GET 
      obj = loc.getItem(key); 
      return deserialize(value); 
     } else { 
      // SET 
      loc.setItem(key, JSON.stringify(value)); 
     } 
    } 

    store.Local = function(key, value) { 
     return processRequest(window.localStorage, key, value); 
    }; 

    store.Session = function(key, value) { 
     return processRequest(window.sessionStorage, key, value); 
    }; 
} (window, jQuery)); 

Puede agregar fácilmente algunos códigos de prueba para retroceder en una matriz no persistente.

+0

El problema con esta solución es que tendrías que usar esto para configurar tu material "localStorage" y no el localStorage real – DeMeNteD

1

Dado que localStorage es una variable reservada, no tiene otra opción que utilizar una envoltura con un nombre diferente. Envuelva su propio código y el localStorage real bajo esta variable y reemplace localStorage con el nombre de su contenedor. Molesto, pero menos molesto que perder cambios.

1

tiene dos opciones:

1) se aprovechan de ámbito léxico y cómo funcionan las búsquedas ... por ejemplo, si su código se ejecuta en un cierre, a continuación, en el interior que el cierre puede ejecutar el siguiente:

var localStorage = window.localStorage || {... polyfill here...}; 

Luego, dentro de su código solo use localStorage en lugar del window.localStorage totalmente calificado. La ventaja aquí es la forma en que funcionan las búsquedas de variables léxicas, ya que encontrará su versión más detallada en lugar de global. PD ... probablemente deberías estar corriendo en un cierre de todos modos, así que esto debería ser posible.

2) cambio de nombre simplemente variable, similar al inverso de lo que hacen las personas para eliminar los prefijos del proveedor.

window.pLocalStorage = window.localStorage || {... polyfill here...}; 

A continuación, sólo cambiar el código para utilizar en lugar de pLocalStorage localStorage ... si su navegador lo soporta, entonces se usará el nativo, de lo contrario el polyfill.

+0

Nick, para replantear el problema que escribí en la pregunta original: "Ni siquiera puedes crear un polyfill para eso, ya que cada vez que intentas acceder a window.localStorage obtienes un error: la operación es insegura ". Ni siquiera puede hacer referencia a esta variable sin lanzar un error JS si deshabilita las cookies. –

+0

Mauvis ... no se pudo obtener ese error textualmente en la versión de Mac. Dicho esto, las segundas opciones funcionarían con algunos mods para jugar muy bien con el try catch que tenías en tu pregunta ... try { window.pLocalStorage = window.localStorage; } catch (err) { window.pLocalStorage = { getItem: function (k) { return this.k; }, setItem: function (k, v) { this.k = v; } }; } –

Cuestiones relacionadas