2012-10-09 9 views
9

Po skardze jednego z naszych użytkowników i uruchomieniu niektórych testów wygląda na to, że Firefox 15 i 16 (i prawdopodobnie starsza wersja) sprawiają, że wyłącza pliki cookie, które również wyłączasz Lokalny magazyn. Nie możesz nawet utworzyć polyfill dla niego, gdy próbujesz uzyskać dostęp do window.localStorage otrzymasz Error: The operation is insecure.Rozwiązanie dla użytkownika Firefox wyłączające obsługę plików cookie, a więc localStorage - polyfill nie jest możliwe

Rzucanie catch próbny pozwoli Ci sprawdzić, czy jest wyłączona, ale nie pozwoli Ci zastąpić zmiennej własnym rozwiązaniem . Poniższy szybkie polyfill nie zadziała, ponieważ FF ignoruje ustawienie zmiennej i rzuci ten sam błąd, gdy próbuje uzyskać do niego dostęp:

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

Jedynym rozwiązaniem wydaje się przesunąć „fake” localStorage do innej zmiennej, ale to byłoby być denerwujące, ponieważ mamy dużo kodu i bibliotekę js, która polega na dostępie do tej zmiennej. Jakieś rozwiązania?

Edytuj: Nie jest optymalne wyskakujące powiadomienie informujące użytkowników, że pliki cookie są wymagane. Jeśli odwiedzający chcą tylko przeglądać witrynę, a nie rejestrować się, to naprawdę nie potrzebują plików cookie. Ale będąc aplikacją backbone.js i przekazywaniem dużej ilości danych, przechowujemy rzeczy w localStorage całkiem sporo.

+3

Jeśli możesz sprawdzić, czy jest wyłączony, po prostu wyślij alert lub coś informującego o tym, że musisz włączyć obsługę plików cookie w swojej witrynie. – MrOBrian

+0

Dziękuję MrObrian, Zrobiłem to i robię zastrzyk z komunikatem, ale byłoby optymalne, aby localStorage działał jako magazyn klucza/wartości, który nie trwał, ponieważ tego właśnie chce użytkownik. –

+0

"ale byłoby optymalne, aby localStorage działało jako magazyn kluczy/wartości, który nie przetrwał" dlaczego nie użyć tylko prostej tablicy js w tym przypadku? –

Odpowiedz

0

Używamy tego jako naszej biblioteki do Magazynu lokalnego.

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

Możesz łatwo dodać kod testowy do stanu awaryjnego w nietrwałej tablicy.

+0

Problem z tym rozwiązaniem polega na tym, że musisz użyć tego, aby ustawić ustawienia "localStorage", a nie prawdziwego użytkownika LocalStorage – DeMeNteD

1

Ponieważ localStorage jest zmienną zarezerwowaną, nie ma innej rozsądnej opcji niż użycie opakowania o innej nazwie. Zawiń własny kod i prawdziwe localStorage pod tą zmienną i zastąp nazwę localStorage nazwą opakowania. Irytujące, ale mniej irytujące niż utrata zmian.

1

Masz dwie opcje:

1) skorzystać z leksykalnego scopingu i jak działają wyszukiwań ... Na przykład, jeśli Twój kod jest uruchomiony w zamknięciu, a następnie wewnątrz tego zamknięcia można uruchomić następujące:

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

Następnie w swoim kodzie wystarczy użyć localStorage zamiast w pełni kwalifikowanego window.localStorage. Zaletą jest właśnie to, w jaki sposób działają zmienne analizy leksykalne, że znajdzie ona bardziej "bardziej" scopowaną wersję niż globalną. PS ... prawdopodobnie powinieneś być uruchomiony w zamknięciu, więc powinno to być możliwe.

2) zmiana nazwy zmiennej, podobnie do odwrotności tego, co ludzie robią, aby usunąć prefiksy dostawcy.

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

Następnie wystarczy zmienić swój kod do korzystania pLocalStorage zamiast localStorage ... jeśli ich przeglądarka je obsługuje, to będzie używać ojczystego, w przeciwnym razie PolyFill.

+0

Nick, aby ponownie rozwiązać problem, który napisałem w oryginalnym pytaniu: "Nie możesz nawet utworzyć polyfill dla niego, gdy tylko próbujesz uzyskać dostęp do window.localStorage masz Błąd: Operacja jest niepewna. " Nie możesz odwoływać się do tej zmiennej bez zgłaszania błędu JS, jeśli wyłączysz pliki cookie. –

+0

Mauvis ... nie udało się uzyskać tego błędu w tekście w wersji na komputery Mac. To powiedziawszy, drugie opcje działałyby z niektórymi modami, by ładnie się bawić z próbnym haczykiem, który miałeś na swoim pytaniu ... try { window.pLocalStorage = window.localStorage; } catch (err) { window.pLocalStorage = { getItem: function (k) { return this.k; }, setItem: function (k, v) { this.k = v; } }; } –

Powiązane problemy