Как связать событие с 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
});