Использование API Web Storage
API Web Storage предоставляет механизмы, с помощью которых браузеры могут безопасно хранить пары «ключ/значение».
В этой статье представлено пошаговое руководство по использованию этой технологии.
Основные понятия
Объекты хранения — это простые хранилища «ключ-значение», похожие на объекты, но сохраняющиеся при перезагрузке страницы. Ключи и значения всегда являются строками (обратите внимание, что, как и в объектах, целочисленные ключи будут автоматически преобразованы в строки). Вы можете получить доступ к этим значениям как к объекту или с помощью методов Storage.getItem() и Storage.setItem(). Эти три строки устанавливают (одно и то же) значение colorSetting:
localStorage.colorSetting = "#a4509b";
localStorage["colorSetting"] = "#a4509b";
localStorage.setItem("colorSetting", "#a4509b");
Примечание: Рекомендуется использовать API Web Storage (setItem, getItem, removeItem, key, length) для предотвращения проблем, связанных с использованием обычных объектов в качестве хранилищ «ключ-значение».
Два механизма внутри Web Storage таковы:
-
sessionStorageсохраняет отдельный хранилище для каждого заданного источника, доступного на протяжении всего сеанса страницы (пока браузер открыт, включая перезагрузки и восстановление страницы). -
localStorageделает то же самое, но сохраняется даже после закрытия и повторного открытия браузера.
Эти механизмы доступны через свойства Window.sessionStorage и Window.localStorage (точнее, в поддерживающих браузерах объект Window реализует объекты WindowLocalStorage и WindowSessionStorage, членами которых являются свойства localStorage и sessionStorage) — вызов одного из них создаст экземпляр объекта Storage, через который можно устанавливать, получать и удалять данные. Для каждого источника используется другой объект Storage для sessionStorage и localStorage — они работают и управляются раздельно.
Например, первоначальный вызов localStorage для документа вернёт объект Storage; вызов sessionStorage для документа вернёт другой объект Storage. Оба объекта можно изменять аналогичным образом, но независимо.
Обнаружение наличия localStorage
Чтобы использовать localStorage, необходимо сначала проверить, поддерживается ли он в текущем сеансе просмотра.
Проверка доступности
Примечание: Этот API доступен в текущих версиях всех основных браузеров. Проверка доступности необходима только если вам нужно поддерживать очень старые браузеры или в ограниченных случаях, описанных ниже.
Браузеры, поддерживающие localStorage, имеют свойство с именем localStorage в объекте window. Однако просто утверждение о существовании свойства может выбросить исключение. Если объект localStorage существует, нет гарантии, что API localStorage фактически доступен, так как различные браузеры предлагают настройки, которые отключают localStorage. Таким образом, браузер может *поддерживать* localStorage, но не делать его *доступным* для скриптов на странице.
Например, для документа, просматриваемого в режиме приватного просмотра браузера, некоторые браузеры могут вернуть пустой объект localStorage с квотой нуль, что фактически делает его непригодным для использования. И наоборот, мы можем получить законный QuotaExceededError, что означает, что мы использовали всё доступное хранилище, но хранилище *фактически* *доступно*. Наша проверка должна учитывать эти сценарии.
Вот функция, определяющая, поддерживается ли и доступен ли localStorage:
function storageAvailable(type) {
let storage;
try {
storage = window[type];
const x = "__storage_test__";
storage.setItem(x, x);
storage.removeItem(x);
return true;
} catch (e) {
return (
e instanceof DOMException &&
e.name === "QuotaExceededError" &&
// acknowledge QuotaExceededError only if there's something already stored
storage &&
storage.length !== 0
);
}
}
И вот как её использовать:
if (storageAvailable("localStorage")) {
// Yippee! We can use localStorage awesomeness
} else {
// Too bad, no localStorage for us
}
Для проверки sessionStorage вместо этого можно вызвать storageAvailable('sessionStorage').
См. здесь краткую историю обнаружения localStorage.
Пример
Чтобы проиллюстрировать типичное использование веб-хранилища, мы создали пример, условно названный Демонстрация Web Storage. Главная страница предоставляет элементы управления, которые можно использовать для настройки цвета, шрифта и декоративного изображения:
При выборе разных вариантов страница мгновенно обновляется; кроме того, ваши выборы сохраняются в localStorage, поэтому при выходе с страницы и её повторном открытии позже ваши выборы запоминаются.
Мы также предоставили страницу вывода событий — если вы откроете эту страницу в другой вкладке, а затем внесёте изменения в свои выборы на главной странице, вы увидите обновлённую информацию о хранилище при срабатывании события StorageEvent.
Примечание: Помимо просмотра примеров страниц в режиме реального времени по приведенным выше ссылкам, вы также можете просмотреть исходный код.
Проверка заполнения вашего хранилища
Начнём с main.js, где проверяется, был ли объект хранения заполнен (то есть страница ранее была обработана):
if (!localStorage.getItem("bgcolor")) {
populateStorage();
} else {
setStyles();
}
Метод Storage.getItem() используется для получения элемента данных из хранилища; в данном случае мы проверяем, существует ли элемент bgcolor; если нет, мы запускаем populateStorage(), чтобы добавить существующие значения настроек в хранилище. Если там уже есть значения, мы запускаем setStyles(), чтобы обновить стили страницы значениями из хранилища.
Примечание: Также можно использовать Storage.length, чтобы проверить, пуст ли объект хранения.
Получение значений из хранилища
Как указано выше, значения можно извлечь из хранилища с помощью Storage.getItem(). Это принимает ключ элемента данных в качестве аргумента и возвращает значение данных.
Например:
function setStyles() {
const currentColor = localStorage.getItem("bgcolor");
const currentFont = localStorage.getItem("font");
const currentImage = localStorage.getItem("image");
document.getElementById("bgcolor").value = currentColor;
document.getElementById("font").value = currentFont;
document.getElementById("image").value = currentImage;
htmlElem.style.backgroundColor = `#${currentColor}`;
pElem.style.fontFamily = currentFont;
imgElem.setAttribute("src", currentImage);
}
Здесь первые три строки извлекают значения из локального хранилища. Затем мы устанавливаем значения, отображаемые в элементах формы, на эти значения, чтобы они синхронизировались при перезагрузке страницы. Наконец, мы обновляем стили/декоративное изображение на странице, чтобы ваши параметры настройки снова отображались при перезагрузке.
Установка значений в хранилище
Storage.setItem() используется как для создания новых элементов данных, так и (если элемент данных уже существует) для обновления существующих значений. Это принимает два аргумента — ключ элемента данных для создания/модификации и значение для хранения в нём.
function populateStorage() {
localStorage.setItem("bgcolor", document.getElementById("bgcolor").value);
localStorage.setItem("font", document.getElementById("font").value);
localStorage.setItem("image", document.getElementById("image").value);
setStyles();
}
Функция populateStorage() устанавливает три элемента в локальном хранилище — цвет фона, шрифт и путь к изображению. Затем она выполняет функцию setStyles() для обновления стилей страницы и т. д.
Мы также включили обработчик onchange для каждого элемента формы, чтобы данные и стили обновлялись при изменении значения формы:
bgcolorForm.onchange = populateStorage; fontForm.onchange = populateStorage; imageForm.onchange = populateStorage;
Storage поддерживает только хранение и извлечение строк. Если вы хотите сохранить другие типы данных, вам нужно преобразовать их в строки. Для обычных объектов и массивов вы можете использовать JSON.stringify().
const person = { name: "Alex" };
localStorage.setItem("user", person);
console.log(localStorage.getItem("user")); // "[object Object]"; not useful!
localStorage.setItem("user", JSON.stringify(person));
console.log(JSON.parse(localStorage.getItem("user"))); // { name: "Alex" }
Однако нет универсального способа хранения произвольных типов данных. Кроме того, полученный объект является *полной копией* исходного объекта, и изменения в нём не влияют на исходный объект.
Обработка изменений в хранилище с помощью события StorageEvent
Событие StorageEvent срабатывает всякий раз, когда в объекте Storage вносятся изменения (обратите внимание, что это событие не срабатывает при изменении sessionStorage). Это не будет работать на той же странице, которая вносит изменения — это действительно способ для других страниц на домене использовать хранилище для синхронизации внесённых изменений. Страницы на других доменных именах не могут получить доступ к тем же объектам хранилища.
На странице событий (см. events.js) единственный JavaScript-код выглядит следующим образом:
window.addEventListener("storage", (e) => {
document.querySelector(".my-key").textContent = e.key;
document.querySelector(".my-old").textContent = e.oldValue;
document.querySelector(".my-new").textContent = e.newValue;
document.querySelector(".my-url").textContent = e.url;
document.querySelector(".my-storage").textContent = JSON.stringify(
e.storageArea,
);
});
Здесь мы добавляем обработчик события к объекту window, который срабатывает при изменении объекта Storage, связанного с текущим источником. Как вы можете видеть выше, объект события, связанный с этим событием, имеет ряд свойств, содержащих полезную информацию — ключ изменённых данных, старое значение до изменения, новое значение после изменения, URL документа, изменившего хранилище, и сам объект хранилища (который мы сериализовали в строку, чтобы вы могли увидеть его содержимое).
Удаление записей данных
Web Storage также предоставляет несколько простых методов для удаления данных. Мы не используем их в нашей демонстрации, но их очень просто добавить в ваш проект:
-
Storage.removeItem()принимает один аргумент — ключ элемента данных, который нужно удалить, и удаляет его из объекта хранилища для данного домена. -
Storage.clear()не принимает аргументов и очищает весь объект хранилища для данного домена.
Спецификации
| Спецификация |
|---|
| HTML # dom-localstorage-dev |
| HTML # dom-sessionstorage-dev |
Совместимость с браузерами
| Рабочий стол | Мобильный | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на IOS | Samsung Internet | WebView Android | |
Using_the_Web_Storage_API |
4 | 12 | 2 | 10.5 | 4 | 18 | 4 | 11 | 3.2 | 1.0 | ≤37 |
| Рабочий стол | Мобильный | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на IOS | Samsung Internet | WebView Android | |
Using_the_Web_Storage_API |
4 | 12 | 3.5 | 10.5 | 4 | 18 | 4 | 11 | 3.2 | 1.0 | ≤37 |
api.Window.localStorage
Таблицы BCD загружаются только в браузере
api.Window.sessionStorage
Таблицы BCD загружаются только в браузере
См. также
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API/Using_the_Web_Storage_API