Объекты веб-хранилища localStorage и sessionStorage

Подробнее об объекте Storage https://developer.mozilla.org

Объекты веб-хранилища localStorage и sessionStorage имеют объем 2 Мб+ (зависит от браузера) и позволяют хранить пары ключ-значение в браузере, при этом данные, которые в них записаны, сохраняются:

  • течение сеанса, до закрытия браузера - при хранении в sessionStorage ;
  • даже после перезапуска браузера - при хранении в localStorage (удаляются с помощью JavaScript). 

Ключи и значения всегда имеют тип string (так же как и объекты, целочисленные ключи автоматически будут преобразованы в строки).

Поэтому для хранения объектов можно использовать JSON, например:

Также возможно привести к строке весь объект хранилища, например для отладки:

Отличие объектов веб-хранилищ от куки:

  • объекты веб-хранилища не отправляются на сервер при каждом запросе, что позволяет хранить больше данных;
  • сервер не может манипулировать объектами хранилища через HTTP-заголовки;
  • хранилище привязано к источнику (домен/протокол/порт): разные протоколы или поддомены определяют разные объекты хранилища, и они не могут получить доступ к данным друг друга.

Методы объектов хранилища localStorage и sessionStorage:

  • localStorage.setItem(key, value) – сохранить пару ключ/значение;
  • localStorage.getItem(key) – получить данные по ключу key;
  • localStorage.removeItem(key) – удалить данные с ключом key;
  • localStorage.key(n) – получить именование n-ного ключа в Storage;
  • localStorage.clear() – удалить всё.

Пример:

Когда обновляются данные в localStorage или sessionStorage, генерируется событие storage.

Хранилище localStorage

Основные особенности localStorage:

  1. Этот объект один на все вкладки и окна в рамках источника (один и тот же домен/протокол/порт).
  2. Данные не имеют срока давности, по которому истекают и удаляются.
  3. Данные cохраняются после перезапуска браузера и операционной системы.
  4. Этот объект доступен всем окнам из одного источника (данные, установленные в одном окне, становятся видимыми в другом).
Замечание по доступу к данным как в обычном объекте

Можно получать и записывать данные как в обычный объект, без использования методов localStorage.setItem(key, value), localStorage.getItem(key):

Однако, обычно этот подход не рекомендуется по следующим причинам:

  1. Если ключ генерируется пользователем, то он может быть каким угодно, включая именование встроенных свойств или методов localStorage, например, length или toString ). В этом случае методы getItem() и setItem() отработают нормально, а вот чтение (запись) данных как свойство обычного объекта не пройдут (выдаст ошибку).
  2. При обращении к несуществующему свойству с помощью метода getItem() получим значение null, а если обратиться как к свойству обычного объекта - получим undefined (что при дальнейшей обработке при приведении типов может выдать ошибку).

[свернуть]

Перебор ключей localStorage

Хранилище sessionStorage

Объект sessionStorage используется гораздо реже, чем localStorage по причинам, указанным ниже.

Свойства и методы такие же, как и у localStorage

Основные особенности sessionStorage:

  1. sessionStorage существует только в рамках текущей вкладки браузера.
  2. Другая вкладка браузера с той же страницей будет иметь другое хранилище.
  3. Данные продолжают существовать после перезагрузки страницы, но не после закрытия (открытия) вкладки.

Событие storage

Подробнее https://developer.mozilla.org

С примерами https://itchief.ru/javascript/localstorage#event

Когда обновляются данные в localStorage или sessionStorage, генерируется событие storage со следующими свойствами (только для чтения):

  • key – ключ, который обновился (null, если вызван метод clear());
  • oldValue – старое значение (null, если ключ добавлен впервые);
  • newValue – новое значение (null, если ключ был удалён);
  • url – url документа, где произошло обновление key;
  • storageArea – объект localStorage или sessionStorage, где произошло обновление key.

Событие storage генерируется на всех вкладках, принадлежащих этому источнику, кроме той, которая вызвала эти изменения в Storage.

Пример

Отсюда...

Представьте, что у вас есть два окна с одним и тем же сайтом. Хранилище localStorage разделяется между ними. Вы можете открыть эту страницу в двух окнах браузера, чтобы проверить приведённый ниже код.

Теперь, если оба окна слушают window.onstorage, то каждое из них будет реагировать на обновления, произошедшие в другом окне.

Обратите внимание, что событие также содержит: event.url – url-адрес документа, в котором данные обновились.

Также event.storageArea содержит объект хранилища – событие одно и то же для sessionStorage и localStorage, поэтому event.storageArea ссылается на то хранилище, которое было изменено. Мы можем захотеть что-то записать в ответ на изменения.

Это позволяет разным окнам одного источника обмениваться сообщениями.

[свернуть]

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.