2012-10-09 5 views
9

Nach einer Beschwerde von einem unserer Benutzer und einige Tests läuft Firefox 15 und 16 (und wahrscheinlich ältere Version) machen es so, wenn Sie Cookies deaktivieren Sie auch deaktivieren lokaler Speicher. Sie können nicht einmal einen polyfill dafür schaffen, wie, wenn Sie versuchen, den Zugriff auf window.localStorage Sie Error: The operation is insecure.Lösung für Firefox Benutzer deaktivieren Cookies und damit localStorage - Polyfill nicht möglich

Werfen einen Versuch fangen bekommen Sie sehen lassen prüfen, ob es deaktiviert ist, aber werden Sie die Variable mit Ihrer eigenen Lösung nicht zulassen ersetzen . Die folgende schnelle polyfill wird nicht funktionieren, weil FF ignoriert die variable Einstellung und den gleichen Fehler werfen, wenn sie versuchen, darauf zuzugreifen:

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

Die einzige Lösung, die „fake“ localstorage auf eine andere Variable zu sein scheint zu bewegen, aber dies würde nervig sein, da wir viel Code und eine js-lib haben, die auf den Zugriff auf diese Variable angewiesen sind. Irgendwelche Lösungen?

Bearbeiten: Es ist nicht optimal, nur eine Warnmeldung anzuzeigen, um den Benutzern mitzuteilen, dass Cookies erforderlich sind. Wenn Besucher die Website nur ansehen und sich nicht anmelden möchten, benötigen sie wirklich keine Cookies. Aber als backbone.js Anwendung und Weitergabe von vielen Daten, speichern wir Sachen in localStorage ziemlich viel.

+3

Wenn Sie überprüfen können, ob es deaktiviert ist, öffnen Sie einfach eine Warnung oder etwas, dass sie Cookies für Ihre Website aktivieren müssen. – MrOBrian

+0

Danke MrObrian, ich habe das gemacht und gebe ein div mit der Nachricht ein, aber es wäre optimal für die localStorage, nur als Schlüssel/Wert-Speicher zu arbeiten, der nicht persistiert, da dies der Benutzer wünscht. –

+0

"aber wäre optimal, damit localStorage nur als Schlüssel/Wert-Speicher funktioniert, der nicht persistiert hat" warum nicht einfach ein einfaches js-Array in diesem Fall verwenden? –

Antwort

0

Wir verwenden dies als unsere lib für lokalen Speicher.

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

Sie könnten leicht einen Testcode hinzufügen, um auf ein nicht persistentes Array zurückzugreifen.

+0

Das Problem mit dieser Lösung ist, dass Sie dies verwenden müssen, um Ihre "localStorage" Zeug und nicht die echte localStorage – DeMeNteD

1

Da localStorage eine reservierte Variable ist, haben Sie keine andere vernünftige Option als einen Wrapper mit einem anderen Namen zu verwenden. Wickeln Sie Ihren eigenen Code und das echte localStorage unter dieser Variable und ersetzen Sie localStorage durch den Namen Ihres Wrappers. Ärgerlich, aber weniger ärgerlich als Veränderungen zu verlieren.

1

Sie haben zwei Möglichkeiten:

1) Vorteil von lexikalischen Scoping nehmen und wie Lookups arbeiten ... zum Beispiel, wenn der Code in einem Verschluss läuft, dann innerhalb dieser Schließung können Sie die folgende ausführen:

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

Dann verwenden Sie in Ihrem Code nur localStorage statt der voll qualifizierten window.localStorage. Der Vorteil hier ist nur die Art und Weise, wie lexikalische Variablen-Lookups funktionieren. Sie wird eher Ihre "eng" erweiterte Version als die globale finden. PS ... du solltest wahrscheinlich sowieso in einem Verschluss laufen, damit das möglich sein sollte.

2) nur Variable umbenennen, ähnlich wie die umgekehrte, was Menschen tun, um Vendor-Präfixe zu entfernen.

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

Dann einfach den Code ändern pLocalStorage statt localstorage zu verwenden ... wenn ihr Browser diese Funktion unterstützt, dann wird es die native, da sonst die polyfill verwenden.

+0

Nick, um das Problem, das ich schrieb in der ursprünglichen Frage: "Sie können nicht einmal erstellen ein Polyfill für sie, wenn Sie versuchen, auf window.localStorage zuzugreifen, erhalten Sie Fehler: Die Operation ist unsicher. " Sie können nicht einmal auf diese Variable verweisen, ohne einen JS-Fehler auszulösen, wenn Sie Cookies deaktivieren. –

+0

Mauvis ... konnte diesen Fehler nicht auf der Mac-Version erscheinen lassen. Das sagte die zweiten Optionen würden mit einigen Mods funktionieren, um gut mit dem Versuch zu spielen, den Sie in Ihrer Frage hatten ... versuchen { window.pLocalStorage = window.localStorage; } catch (err) { window.pLocalStorage = { getItem: funktion (k) { return this.k; }, setItem: Funktion (k, v) { this.k = v; } }; } –