Как связать событие с sessionStorage?

Я могу успешно связать событие для изменения localStorage (используя jquery):

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

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

Если я использую sessionStorage, событие НЕ запускается:

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

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

Почему это?

Ответ 1

Именно так я и думал. Из spec (выделено мной):

Когда методы setItem(), removeItem() и clear() вызываются на Storage объект x, связанный с областью хранения сеанса, если методы сделали что-то, затем в каждом объекте Document, чье окно object sessionStorage attribute Объект хранения связан с в той же области хранения , кроме x, необходимо запустить событие хранения

Я думаю, что это означает, что событие будет запущено в любом другом документе, совместно использующем объект хранения сеанса, но не в документе, который вызвал событие.

Обновление

Вот еще один очень похожий вопрос, который, похоже, согласен с тем, что я упомянул выше (ответ цитирует тот же абзац из спецификации).

Ответ 2

sessionStorage изолирован для каждой вкладки, поэтому они не могут общаться. События для sessionStorage запускаются только между кадрами на той же вкладке.

EDIT:

Я сделал следующий пример:

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

На странице примера есть две кнопки, которые запускают локальное и изменение хранилища сеанса.

Он также включает iframe в другой код, который прослушивает изменения событий хранения:

http://codepen.io/surdu/pen/GNYNrW?editors=1010 (вы должны оставить его открытым на другой вкладке.)

Вы заметите, что когда вы нажимаете кнопку "Write local", как в iframe, так и в открытой вкладке событие захватывается, но когда вы нажимаете "Session write", только встроенный iframe захватывает событие.

Ответ 3

Этот вопрос, кажется, получает довольно много просмотров, поэтому я просто опубликую это как дополнительную информацию.

Если вы хотите отвечать исключительно на обновления объекта sessionStorage, вы можете просто игнорировать события, вызванные localStorage:

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

Я ненавижу jQuery, поэтому опубликую собственную версию:

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