iOS Safari 中未触发存储事件

Storage events not firing in iOS Safari

我在 iOS Safari 中有两个选项卡,它们都打开同一个页面。这两个选项卡都有 window 对象上存储事件的事件侦听器,并且都在客户端 clicks/taps/types.

时写入本地存储

在 Internet Explorer 中,未与之交互的选项卡会接收存储事件,但 Safari 不会(在 Firefox 和 Chromium 浏览器上,我改为使用广播频道 API)。另外,这段代码之前在Safari上测试过(恐怕记不清是哪个版本了),是可以运行的。

我确定页面上没有 JavaScript 错误,并且我没有在隐私浏览模式下进行测试。谁能想到为什么存储事件会简单地停止触发?

起初我以为这是Tracking Prevention (which is still the case for a page and an iframe of the same page on a third-party page trying to communicate), but now I think this is actually a Safari bug的一部分。

如果您需要在 Safari 中进行交叉表通信,请使用 Service Worker。我首选的交叉表设置,按照首选回退到最不喜欢的回退的顺序:

  1. 如果支持,请使用 BroadcastChannel,因为这确实是 它们设计的用例。 Safari 或 IE 不支持。
  2. 使用 Service Worker 的消息事件。这是目前在 Safari 中唯一有效的方法,但定期唤醒 Service Worker 并不是很好。请注意,Service Worker 在 Firefox 隐私浏览模式下不工作,因此 Firefox 支持 BroadcastChannel 是件好事。
  3. 使用存储事件。这是 Internet Explorer 中唯一可用的交叉选项卡通信方法,但如果您不需要支持 IE(幸运的你),那么不要退缩到这种地步。请注意,这在 Safari 隐私浏览模式下不起作用(设置 localStorage 项目会引发错误)。另请注意,存在一个 IE localStorage 错误,这意味着存储事件的 newValue 属性 实际上是 oldValue,因此您需要在将 localStorage 值设置为触发它两次并在第二次具有正确值时删除它。

另请注意,上述 none 可让您在 Safari 中的第一方和第三方上下文之间进行通信。