8

Mamy dwie strony "/ read" i "/ write". Strona "/ write" Każda sekunda aktualizacje localStorage z aktualnym czasem:localStorage w win8.1 IE11 nie synchronizuje się

setInterval(function(){ 
    var time = (new Date()).getTime(); 
    localStorage.setItem("time", time); 
    console.log("set", time); 
},1000); 

strona "/ czytaj" czyta tę samą Przechowywanie:

setInterval(function(){ 
    var time = localStorage.getItem("time"); 
    console.log("get", time); 
},1000); 

Można by pomyśleć, że "/ czytaj" strona powinna wykazać te same wartości które są zapisywane w localStorage przez inną stronę. Ale w IE11 na Win8.1 jest to zepsute. Strona "/ read" odczytuje jakąś starą wartość z pamięci, a dalej pokaże ci tę samą wartość (jakby używała pamięci podręcznej dla lokalnej pamięci). Jakieś pomysły?

P.S. Obie strony znajdują się w tej samej domenie (na żywo - readwrite)

+0

Działa dobrze w moim przypadku. Sprawdziłem z IE11. W każdej sekundzie drukuje zaktualizowaną wartość. –

+1

IE11 na Win8.1? Pytam, ponieważ w win7 działa dobrze – developer

+1

Mam ten sam problem iw IE9 na Win8.1 również nie działa zgodnie z oczekiwaniami. – tsds

Odpowiedz

2

Nie tyle odpowiedź, ale dalsze dochodzenie. Korzystając z poniższej strony, ten problem można łatwo przetestować poprzez hosting na serwerze WWW i otwarcie go w różnych zakładkach. Następnie kliknij przycisk w zakładce jeden.

Wyniki w przeglądarce Chrome/Firefox/Safari, niezależnie od systemu operacyjnego, są takie same. Pokazują, że localStorage jest współdzielony na stronach pochodzących z tego samego źródła.

Na IE11 na Windows 7, daje również takie same wyniki. enter image description here

Acording do tego co czytałem, to wydaje się być za spec pkt 3 tutaj https://html.spec.whatwg.org/multipage/webstorage.html#the-localstorage-attribute

Ale ...

  • IE 11 na Windows 8.1, zademonstruje oddzielne obszary pamięci lokalnej dla tego samego pochodzenia. enter image description here

  • Microsoft Edge na Windows 10 (10162) ma ten sam problem. enter image description here Fakt, że IE11 pokazuje "poprawne" zachowanie w systemie Windows 7, sugeruje, że system operacyjny jest tym, gdzie leży problem?

+1

Sprawdziłem również problem i niestety, podczas używania metody localStorage.setItem w jednym z dwóch okien pomyślnie aktualizuje plik localstorage (% userprofile% \ AppData \ Local \ Microsoft \ Internet Explorer \ DOMStore \\ [RandomString] \\ [Domena] .xml), metoda localStorage.getItem * nie * konsekwentnie pobiera najnowsze dane z pliku. Działa na 8.1 \ IE11. – KevD

3

Wydaje się, że metoda localStorage.GetItem pod IE11/Windows 8 jest zawodna i może pobierać wcześniejsze wartości. Ale można to obejść, wywołując metodę localStorage.SetItem bezpośrednio przed pobraniem wartości.

udało mi się powtórzyć problemu przy użyciu kodu muttonUp, a następnie złożył następujące zmiany, aby uzyskać dwa okna rozmawiają ze sobą:

<!DOCTYPE html> 
<head> 
    <title>LocalStorage Test</title> 
</head> 
<body> 
<button onclick="setLocalStorageValue()">Set Time</button> 

<script> 
    setInterval(function() { 
     window.localStorage.setItem("unused_key",null); 
     console.log(window.localStorage.getItem("test_key")); 
    }, 1000); 

    function setLocalStorageValue() { 
     console.log("Button clicked - setting time"); 
     window.localStorage.setItem("test_key", new Date().getTime()); 
    } 
</script> 
</body> 
</html> 

Oto wynik: Two IE11 browser instances sharing localStorage

To rozwiązanie jest przydatne w moim scenariuszu, ponieważ w rzadkich odstępach czasowych odczytywam tylko wartości z localStorage i przechowuję tylko niewielkie ilości danych. Ze względu na potencjalny narzut związany ze zwiększoną liczbą wywołań metod setItem, z dużym prawdopodobieństwem rozważyłbym zastosowanie tego rozwiązania, gdy natężenie ruchu do iz localStorage jest większe.

+0

Dobre obejście! Tak więc IE11 musi żądać wartości z podstawowego systemu operacyjnego, a podczas gdy win7 wykonuje nowe wyszukiwanie dla każdego getItem, Win8 i Win10 nie. A może po prostu zmienili zmienione części IE11 między Win7 a Win8 ... Osobiście miałem nadzieję, że naprawili to już teraz. – muttonUp

+0

Dzięki - dobry przykład, z którym pracowałeś :-) Problem jest śledzony, ale (zazwyczaj!) Nie ma śladu żadnej nieuniknionej poprawki: https://developer.microsoft.com/en-us/microsoft-edge/platform/ issues/110656/ – KevD

+0

to nie działa dla mnie, ponieważ mam zdarzenie magazynowania, które chce odczytać lokalną pamięć w innych zakładkach, a jeśli zmienię localStorage podczas obsługi zdarzenia, spowoduje to, że inne zdarzenie zostanie uruchomione i będzie być niekończącą się pętlą: D – behzad

3

Znalazłem obejście tego problemu w Win 10. Jeśli zajmiesz się zdarzeniem window.onstorage w kodzie, localStorage odświeży wszystkie otwarte karty. Coś tak prostego jak to pracował dla mnie:

window.onstorage = function(e){ 
    //Leave this empty 
    //or add code to handle 
    //the event 
}; 

nie testowałem ten kod dokładnie, więc należy to zrobić przed zastosowaniem tej metody w dowolnych aplikacjach produkcyjnych.

Mam nadzieję, że to pomoże!

Powiązane problemy