2012-10-09 11 views
9

Dopo un reclamo da parte di uno dei nostri utenti ed eseguendo alcuni test, appare Firefox 15 e 16 (e probabilmente versione precedente) rendono così se disabiliti i cookie anche disabiliti memoria locale. Non è possibile anche creare un polyfill per esso, come ogni volta che si tenta di accedere window.localStorage si ottiene Error: The operation is insecure.Soluzione per i cookie di disabilitazione utente di Firefox e quindi localStorage - polyfill non possibile

Lanciare un tentativo di cattura vi permetterà di controllare per vedere se è disabile, ma non ti consente di sostituire la variabile con la propria soluzione . Il seguente polyfill rapido non funzionerà perché FF ignora l'impostazione della variabile e getterà lo stesso errore quando si tenta di accedervi:

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

L'unica soluzione sembra essere spostare il localStorage "falso" a un'altra variabile, ma questo sarebbe essere fastidioso dato che abbiamo un sacco di codice e una js lib che si basa sull'accesso a questa variabile. Qualche soluzione?

Modifica: Non è ottimale semplicemente far apparire un avviso per informare gli utenti che sono necessari i cookie. Se i visitatori vogliono solo visualizzare il sito e non registrarsi, non hanno davvero bisogno di cookies. Ma essendo un'applicazione backbone.js e girando un sacco di dati, noi immagazziniamo cose in localStorage un bel po '.

+3

Se è possibile verificare se è disabilitato, basta far scattare un avviso o qualcosa dicendo che devono abilitare i cookie per il proprio sito. – MrOBrian

+0

Grazie MrObrian, l'ho fatto e sto iniettando un div con il messaggio, ma sarebbe ottimale per il localStorage semplicemente funzionare come un archivio di chiavi/valori che non persisteva, poiché è ciò che l'utente desidera. –

+0

"ma sarebbe ottimale per il localStorage semplicemente funzionare come un archivio di chiavi/valori che non persisteva" perché non utilizzare semplicemente un semplice array js in questo caso? –

risposta

0

Lo usiamo come librerie per la memorizzazione locale.

(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)); 

Si potrebbe facilmente aggiungere un codice di prova per il fallback su un array non persistente.

+0

Il problema con questa soluzione è che dovresti usarlo per ottenere il set di "localStorage" e non il vero localStorage – DeMeNteD

1

Poiché localStorage è una variabile riservata, non hai altra opzione valida rispetto all'utilizzo di un wrapper con un nome diverso. Avvolgi il tuo codice e il localStorage reale sotto questa variabile e sostituisci localStorage con il nome del tuo wrapper. Fastidioso, ma meno fastidioso di perdere i cambiamenti.

1

si hanno due opzioni:

1) usufruire di scoping lessicale e come funzionano le ricerche ... per esempio, se il codice è in esecuzione in una chiusura, poi dentro che la chiusura è possibile eseguire il seguente:

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

Poi all'interno del codice basta usare localStorage al posto del window.localStorage completo. Il vantaggio qui è il modo in cui funzionano le ricerche di variabili lessicali che troverà la tua versione più "strettamente" dell'ambito piuttosto che globale. PS ... probabilmente dovresti essere comunque in esecuzione in una chiusura, quindi dovrebbe essere possibile.

2) solo ridenominazione variabile, simile all'inverso di ciò che le persone fanno per rimuovere i prefissi dei fornitori.

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

Poi basta modificare il codice per utilizzare al posto di pLocalStorage localStorage ... se il loro browser lo supporta, quindi userà il nativo, altrimenti la polyfill.

+0

Nick, per riaffermare il problema che ho scritto nella domanda originale: "Non puoi nemmeno creare un polyfill come quando si tenta di accedere a window.localStorage si ottiene Errore: l'operazione non è sicura. " Non puoi nemmeno fare riferimento a questa variabile senza generare un errore JS se disabiliti i cookie. –

+0

Mauvis ... non è riuscito a ottenere che l'errore si verifichi testualmente sulla versione Mac. Detto questo, le seconde opzioni potrebbero funzionare con alcune mod per giocare bene con il trucco che hai avuto nella tua domanda ... try { window.pLocalStorage = window.localStorage; } catch (err) { window.pLocalStorage = { getItem: function (k) { return this.k; }, setItem: function (k, v) { this.k = v; } }; } –

Problemi correlati