Safari запускает StorageEvent в той же вкладке - PullRequest
2 голосов
/ 17 апреля 2020

У меня странная проблема в 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 срабатывать только тогда, когда что-то записано с других вкладок?

...