2012-04-21 13 views
11

mogę skutecznie powiązać zdarzenie o zmianę localStorage (jQuery):Jak powiązać zdarzenie z sessionStorage?

$(window).bind('storage', function(e) 
{ 
    alert('change'); 
}); 

localStorage.setItem('someItem', 'someValue'); 

Jeśli używam sessionStorage, zdarzenie nie będzie ogień:

$(window).bind('storage', function(e) 
{ 
    alert('change'); 
}); 

sessionStorage.setItem('someItem', 'someValue'); 

Dlaczego tak jest?

+0

Którą przeglądarkę (y)? –

+0

Testuję to w Chrome. Musi działać w Chrome, FF i IE9 +. Należy również wspomnieć, że potrzebuję zdarzenia do uruchomienia w innej karcie/oknie (tej samej przeglądarki). – Tesco

+1

Nie widzę, aby to wydarzenie zostało w ogóle uruchomione w Chrome, używając 'localStorage'. –

Odpowiedz

10

Tak właśnie powinienem myśleć. Z spec (podkreślenie dodane):

Kiedy setItem(), removeItem() i clear() metody są wywoływane na Storage obiektu x, który jest związany z miejscem do przechowywania sesji, jeśli metody zrobił coś, to w każdym celem dokumentu, którego okna obiekt bagażu obiektu sessionStorage atrybutu jest związane z tym samym obszarze składowania, inne niż x, wydarzenie składowania musi być zwolniony

I myśl co oznacza, że ​​zdarzenie zostanie wywołane w innym dokumencie współużytkującym obiekt pamięci sesji, ale nie dokument, który spowodował zdarzenie.

Aktualizacja

Oto kolejny very similar question co wydaje się zgodzić z tym, co już wspomniano powyżej (odpowiedź cytuje ten sam ustęp z spec).

+0

Chcę, aby zdarzenie zostało wywołane w innej karcie/oknie ("inne niż x"). Czy sessionStorage stosuje się tylko do bieżącego okna/karty? – Tesco

+0

Nie, dotyczy to sesji. Zdarzenie * powinno * odpalać w innych kartach/oknach, ale nie * należy * uruchamiać w tym samym dokumencie. –

+0

czy można wymusić wydarzenie w tym samym oknie? – user3281466

12

Urządzenie sessionStorage jest izolowane dla każdej karty, więc nie może się komunikować. Zdarzenia dla sessionStorage są wyzwalane tylko pomiędzy ramkami na tej samej karcie.

EDIT:

Zrobiłem następujący przykład:

http://codepen.io/surdu/pen/QGZGLO?editors=1010

Strona przykład ma dwa przyciski, które wywołują lokalne i zmiany przechowywania sesji.

osadza również iframe do innego codepen który nasłuchuje zdarzeń przechowywania zmian: (. Należy zachować tę otwarty na innej karcie)

http://codepen.io/surdu/pen/GNYNrW?editors=1010

Można zauważyć, że po naciśnięciu Przycisk "Zapisz lokalny", zarówno w elemencie iframe, jak i otwartej karcie jest przechwytywany, ale po naciśnięciu "Zapis sesji" tylko osadzony element iframe przechwytuje zdarzenie.

+2

to jest złe .. –

+0

@TraianTatic Zaktualizowałem odpowiedź na przykładzie. Czy możesz nam pomóc zrozumieć, dlaczego odpowiedź jest błędna? Dzięki! –

+0

Zgadzam się z @NicolaeSurdu. Musiałem śledzić aktualizacje nieruchomości za pośrednictwem StorageEvent na wielu kartach i sessionStorage nie działało. Kiedy przełączyłem się na użycie instancji localStorage, StorageEvent został uruchomiony zgodnie z oczekiwaniami. Właściwości przechowywane przez localStorage są trwałe, więc musisz ręcznie usunąć je z pamięci, gdy skończysz z nich korzystać. –

2

To pytanie wydaje się uzyskiwać dość dużo wyświetleń, więc po prostu opublikuję to jako dodatkowe informacje.

W przypadku, gdy chcesz odpowiedzieć wyłącznie do aktualizacji na obiekcie sessionStorage, można po prostu zignorować zdarzeń spowodowanych przez localStorage:

$(window).on('storage',function(e){ 
    if(e.originalEvent.storageArea===sessionStorage){ 
    alert('change'); 
    } 
    // else, event is caused by an update to localStorage, ignore it 
}); 

Nienawidzę jQuery, więc umieścić rodzimą wersję, a także:

window.addEventListener('storage',function(e){ 
    if(e.storageArea===sessionStorage){ 
    alert('change'); 
    } 
    // else, event is caused by an update to localStorage, ignore it 
}); 
Powiązane problemy