У меня странная проблема в Safari (версия 13.1).
Вариант использования: Я синхронизирую данные между различными открытыми вкладками. Это реализуется путем записи в локальное хранилище и прослушивания события «хранилище».
Согласно моему пониманию (и MDN: https://developer.mozilla.org/en-US/docs/Web/API/Window/storage_event), событие хранения должно запускаться, когда что-то записывается в локальное хранилище и выполняются два условия:
- значение элемента изменилось
- это изменение происходит из того же домена, но из другого документа (т. Е. Из другой вкладки / окна)
Другими словами:
- Допустим, у меня есть две открытые вкладки (A и B)
- Обе прослушивают изменения в "хранилище"
- Одна из вкладок (A) записывает что-то в локальную storage
- Only другая вкладка (B) должна получить событие "storage"
Это прекрасно работает в Chrome, Firefox & Opera , Но в Safari он запускается и на той же вкладке.
Этот код будет повторять это (работает на любом сайте в консоли):
window.addEventListener('storage', event => console.log(event));
window.localStorage.setItem('foo', 'bar');
- В Chrome / Firefox / Opera ничего не будет зарегистрировано (ожидаемое поведение)
- В Safari событие хранилища будет зарегистрировано в том же окне
Кроме того, само событие, похоже, не имеет достаточной информации, чтобы определить, какая вкладка его активировала. Я размышляю над тем, чтобы написать еще один помощник с уникальным ключом для каждой открытой вкладки, записать его в локальное хранилище и прослушать изменения в нем. Но прежде чем сделать это, я хотел посмотреть, что я что-то упускаю. Я знаю, что есть некоторые библиотеки для сообщения других вкладок, но я не хочу вводить выделенную библиотеку для чего-то такого же базового c, как это.
Вопрос: Я что-то упустил? Есть ли способ позволить событию хранилища в Safari срабатывать только тогда, когда что-то записано с других вкладок?