JS об'єкт StorageEvent


Загальний опис

StorageEvent — це події, які виникають, коли дані у веб-сховищі (localStorage або sessionStorage) змінюються, і ці зміни стають доступними іншим вкладкам або вікнам браузера. Подія storage спрацьовує тільки у вкладках або вікнах, відмінних від того, де відбулася зміна. Це дозволяє синхронізувати стан програми між кількома вкладками.

Подія storage доступна через window і має кілька властивостей:

  • key — назва зміненої властивості в сховищі.
  • oldValue — попереднє значення цієї властивості.
  • newValue — нове значення властивості.
  • url — URL-адреса сторінки, яка викликала зміну.
  • storageArea — об’єкт localStorage або sessionStorage, що зазнав змін.

Приклад використання

window.addEventListener('storage', (event) => {
    console.log(`Ключ: ${event.key}`);
    console.log(`Старе значення: ${event.oldValue}`);
    console.log(`Нове значення: ${event.newValue}`);
    console.log(`Джерело: ${event.url}`);
});

У цьому прикладі ми слухаємо події storage. Якщо дані в localStorage або sessionStorage змінюються в іншій вкладці, ми отримуємо детальну інформацію про зміни.

Особливість подій storage полягає в тому, що вони не спрацьовують у тій самій вкладці, де було змінено значення. Наприклад, якщо ви використовуєте localStorage.setItem() у першій вкладці, то подія виникне лише в інших відкритих вкладках з тим самим доменом.

Це дуже корисно для створення програм, які мають підтримувати актуальний стан між вкладками, наприклад, синхронізацію кошиків покупок або інструментів редагування.

автор: Bond

Порада

Завжди перевіряйте властивість key в події storage, щоб знати, який саме ключ змінено. Це дозволяє обробляти тільки ті події, які вас цікавлять.

автор: Bond
Порада

Не використовуйте storage для передачі великих обсягів даних між вкладками. Веб-сховище оптимізоване для невеликих значень (наприклад, налаштувань), а подія storage може стати перевантаженою.

автор: Bond
Порада

Користуйтесь JSON.stringify() і JSON.parse() для збереження об’єктів у localStorage. storage не підтримує зберігання складних типів даних, лише строки. Наприклад:

localStorage.setItem('user', JSON.stringify({ name: 'Анна', age: 25 }));
автор: Bond

Синтаксис

window.addEventListener('storage', (event) => {
    // Ваш код
});

методи

Метод Опис
initStorageEvent Ініціалізує подію `storage` вручну, дозволяючи створювати об'єкти подій для тестування чи кастомних сценаріїв. Застарілий метод, використовується рідко.

властивості

Властивість Опис
url Властивість події `storage`, яка містить URL сторінки, де було змінено `localStorage` або `sessionStorage`. Це допомагає визначити джерело змін.
storageArea Вказує, який саме об'єкт сховища (або `localStorage`, або `sessionStorage`) зазнав змін.
oldValue Попереднє значення ключа у сховищі перед його зміною. Якщо ключ був доданий уперше, `oldValue` дорівнює `null`.
newValue Нове значення ключа після зміни. Якщо ключ був видалений, `newValue` дорівнює `null`.
key Ключ, який було змінено в `localStorage` або `sessionStorage`. Якщо всі дані у сховищі були очищені, `key` буде `null`.

Переглядачі

Підтримка: стаціонарні переглядачі
Переглядач Google Chrome Mozilla Firefox Apple Safari Opera Microsoft EDGE Microsoft Internet Explorer
1 13 4 ≤12.1 12 9
Підтримка: мобільні переглядачі
Переглядач Mobile Google Android Mobile Google Chrome Mobile Mozilla Firefox Mobile Apple Safari
3 18 14 3
Підтримка: серверні переглядачі
Переглядач Deno

Приклади

+ запропонувати свій приклад у пісочниці

Цей приклад синхронізує тему (наприклад, світла або темна) між вкладками. Якщо користувач змінює тему в одній вкладці, вона автоматично застосовується до інших.

// Установка теми
function setTheme(theme) {
    document.body.className = theme;
    localStorage.setItem('theme', theme);
}

// Слухач події
window.addEventListener('storage', (event) => {
    if (event.key === 'theme') {
        setTheme(event.newValue);
    }
});

// Ініціалізація
const savedTheme = localStorage.getItem('theme') || 'light';
setTheme(savedTheme);
автор: Bond

Цей приклад оновлює кошик у реальному часі між вкладками. Зміни у кошику в одній вкладці стають видимими в інших.

// Додавання товару до кошика
function addToCart(item) {
    const cart = JSON.parse(localStorage.getItem('cart') || '[]');
    cart.push(item);
    localStorage.setItem('cart', JSON.stringify(cart));
}

// Слухач події
window.addEventListener('storage', (event) => {
    if (event.key === 'cart') {
        console.log('Оновлений кошик:', JSON.parse(event.newValue));
    }
});

// Ініціалізація
addToCart({ id: 1, name: 'Товар 1' });
автор: Bond

Цей приклад демонструє синхронізацію тексту між кількома вкладками за допомогою StorageEvent. Користувач може вводити текст у поле форми, і зміни миттєво відображатимуться в інших вкладках браузера. Це може бути корисно для створення інструментів спільного редагування або реального часу синхронізації.

автор: Bond

Коментарі

Коментарів ще немає — будьте першим!

Відповідь для

Як форматувати текст?
Пишемо Виходить
**важливо**
*акцент*
~~застаріле~~
Виділення в тексті. Те саме роблять кнопки панелі, що спливає над виділеним.
## Як працює каскад
### Порядок оголошень
Заголовки всередині тексту. Найбільший не потрібен — він у сторінки вже є.
[[css/property/color]] Посилання на сторінку довідника. Наберіть [[ — поле саме підкаже шляхи, а хибний підкреслить хвилею.
[MDN](https://developer.mozilla.org) Посилання на чужий сайт.
![Схема каскаду](https://site.com/схема.png) Картинка. Опис обов'язковий: його читають пошуковик і незрячі.
Задайте `display: grid` контейнеру Код усередині речення.
```css
.card { display: grid }
```
Код блоком. Мова після трьох лапок вмикає підсвітку.
- Походження
1. Походження
Перелік: маркований і нумерований.
- [ ] дописати приклади
- [x] перевірити в Firefox
Перелік завдань із галочками. Пробіл у порожніх дужках обов'язковий.
> Порядок важить лише за рівної ваги. Цитата на всю ширину абзацу.
Специфічність
: вага селектора; більша перемагає
Список означень: термін, а під ним пояснення з відступом. Пробіл після двокрапки обов'язковий.
Каскад має три критерії[^1]
[^1]: Походження, специфічність, порядок.
Виноска: номер у тексті, примітка внизу сторінки. Без згадки [^1] у тексті примітка не з'явиться.
Відповідь: ||сорок два|| Ховає те, що між рисками: читач бачить на цьому місці розмиту пляму, а решта речення лишається звичайною. Клац — і текст відкрито.
|| Показати рішення
Задайте контейнеру `display: grid`.
||
Ховає цілі абзаци. На сторінці видно лише підпис із першого рядка («Показати рішення»), решта розгортається клацанням по ньому. Закривні риски — окремим рядком.
Порожній рядок Новий абзац. Щоб перенести рядок усередині абзацу, поставте \ в його кінці.

Увійдіть — коментар з'явиться одразу, без капчі й очікування перевірки.

Пропозиція правки

Ваша версія — : після перевірки замінить чинну. Нова порада чи нотатка — з'явиться на сторінці після перевірки.

Як форматувати текст?
Пишемо Виходить
**важливо**
*акцент*
~~застаріле~~
Виділення в тексті. Те саме роблять кнопки панелі, що спливає над виділеним.
## Як працює каскад
### Порядок оголошень
Заголовки всередині тексту. Найбільший не потрібен — він у сторінки вже є.
[[css/property/color]] Посилання на сторінку довідника. Наберіть [[ — поле саме підкаже шляхи, а хибний підкреслить хвилею.
[MDN](https://developer.mozilla.org) Посилання на чужий сайт.
![Схема каскаду](https://site.com/схема.png) Картинка. Опис обов'язковий: його читають пошуковик і незрячі.
Задайте `display: grid` контейнеру Код усередині речення.
```css
.card { display: grid }
```
Код блоком. Мова після трьох лапок вмикає підсвітку.
- Походження
1. Походження
Перелік: маркований і нумерований.
- [ ] дописати приклади
- [x] перевірити в Firefox
Перелік завдань із галочками. Пробіл у порожніх дужках обов'язковий.
> Порядок важить лише за рівної ваги. Цитата на всю ширину абзацу.
Специфічність
: вага селектора; більша перемагає
Список означень: термін, а під ним пояснення з відступом. Пробіл після двокрапки обов'язковий.
Каскад має три критерії[^1]
[^1]: Походження, специфічність, порядок.
Виноска: номер у тексті, примітка внизу сторінки. Без згадки [^1] у тексті примітка не з'явиться.
Відповідь: ||сорок два|| Ховає те, що між рисками: читач бачить на цьому місці розмиту пляму, а решта речення лишається звичайною. Клац — і текст відкрито.
|| Показати рішення
Задайте контейнеру `display: grid`.
||
Ховає цілі абзаци. На сторінці видно лише підпис із першого рядка («Показати рішення»), решта розгортається клацанням по ньому. Закривні риски — окремим рядком.
Порожній рядок Новий абзац. Щоб перенести рядок усередині абзацу, поставте \ в його кінці.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія секції «»: після перевірки замінить чинну.

Як форматувати текст?
Пишемо Виходить
**важливо**
*акцент*
~~застаріле~~
Виділення в тексті. Те саме роблять кнопки панелі, що спливає над виділеним.
## Як працює каскад
### Порядок оголошень
Заголовки всередині тексту. Найбільший не потрібен — він у сторінки вже є.
[[css/property/color]] Посилання на сторінку довідника. Наберіть [[ — поле саме підкаже шляхи, а хибний підкреслить хвилею.
[MDN](https://developer.mozilla.org) Посилання на чужий сайт.
![Схема каскаду](https://site.com/схема.png) Картинка. Опис обов'язковий: його читають пошуковик і незрячі.
Задайте `display: grid` контейнеру Код усередині речення.
```css
.card { display: grid }
```
Код блоком. Мова після трьох лапок вмикає підсвітку.
- Походження
1. Походження
Перелік: маркований і нумерований.
- [ ] дописати приклади
- [x] перевірити в Firefox
Перелік завдань із галочками. Пробіл у порожніх дужках обов'язковий.
> Порядок важить лише за рівної ваги. Цитата на всю ширину абзацу.
Специфічність
: вага селектора; більша перемагає
Список означень: термін, а під ним пояснення з відступом. Пробіл після двокрапки обов'язковий.
Каскад має три критерії[^1]
[^1]: Походження, специфічність, порядок.
Виноска: номер у тексті, примітка внизу сторінки. Без згадки [^1] у тексті примітка не з'явиться.
Відповідь: ||сорок два|| Ховає те, що між рисками: читач бачить на цьому місці розмиту пляму, а решта речення лишається звичайною. Клац — і текст відкрито.
|| Показати рішення
Задайте контейнеру `display: grid`.
||
Ховає цілі абзаци. На сторінці видно лише підпис із першого рядка («Показати рішення»), решта розгортається клацанням по ньому. Закривні риски — окремим рядком.
Порожній рядок Новий абзац. Щоб перенести рядок усередині абзацу, поставте \ в його кінці.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія опису «»: після перевірки замінить чинну.

Як форматувати текст?
Пишемо Виходить
**важливо**
*акцент*
~~застаріле~~
Виділення в тексті. Те саме роблять кнопки панелі, що спливає над виділеним.
## Як працює каскад
### Порядок оголошень
Заголовки всередині тексту. Найбільший не потрібен — він у сторінки вже є.
[[css/property/color]] Посилання на сторінку довідника. Наберіть [[ — поле саме підкаже шляхи, а хибний підкреслить хвилею.
[MDN](https://developer.mozilla.org) Посилання на чужий сайт.
![Схема каскаду](https://site.com/схема.png) Картинка. Опис обов'язковий: його читають пошуковик і незрячі.
Задайте `display: grid` контейнеру Код усередині речення.
```css
.card { display: grid }
```
Код блоком. Мова після трьох лапок вмикає підсвітку.
- Походження
1. Походження
Перелік: маркований і нумерований.
- [ ] дописати приклади
- [x] перевірити в Firefox
Перелік завдань із галочками. Пробіл у порожніх дужках обов'язковий.
> Порядок важить лише за рівної ваги. Цитата на всю ширину абзацу.
Специфічність
: вага селектора; більша перемагає
Список означень: термін, а під ним пояснення з відступом. Пробіл після двокрапки обов'язковий.
Каскад має три критерії[^1]
[^1]: Походження, специфічність, порядок.
Виноска: номер у тексті, примітка внизу сторінки. Без згадки [^1] у тексті примітка не з'явиться.
Відповідь: ||сорок два|| Ховає те, що між рисками: читач бачить на цьому місці розмиту пляму, а решта речення лишається звичайною. Клац — і текст відкрито.
|| Показати рішення
Задайте контейнеру `display: grid`.
||
Ховає цілі абзаци. На сторінці видно лише підпис із першого рядка («Показати рішення»), решта розгортається клацанням по ньому. Закривні риски — окремим рядком.
Порожній рядок Новий абзац. Щоб перенести рядок усередині абзацу, поставте \ в його кінці.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Зворотний зв'язок
Вхід