【问题标题】:Storage events not firing in iOS SafariiOS Safari 中未触发的存储事件
【发布时间】:2020-11-11 10:21:02
【问题描述】:
我在 iOS Safari 中有两个选项卡,都打开到同一个页面。两个选项卡都有一个窗口对象上的存储事件的事件侦听器,并且都在客户端单击/点击/类型时写入本地存储。
在 Internet Explorer 中,未与之交互的选项卡接收存储事件,但不是 Safari(在 Firefox 和 Chromium 浏览器上,我为此使用广播通道 API)。另外,这段代码之前在 Safari 上测试过(恐怕我不记得是哪个版本了)并且它有效。
我确保页面上没有抛出任何 JavaScript 错误,并且我没有在隐私浏览模式下进行测试。谁能想到为什么存储事件会简单地停止触发?
【问题讨论】:
标签:
javascript
local-storage
mobile-safari
【解决方案1】:
一开始我以为这是Tracking Prevention的一部分(对于试图通信的第三方页面上的同一页面的页面和iframe仍然是这种情况),但现在我认为这实际上是一个@ 987654322@.
如果您需要在 Safari 中进行交叉表通信,请使用 Service Worker。我首选的交叉表设置,按首选回退到最不首选回退的顺序排列:
- 如果支持,请使用BroadcastChannel,因为这实际上是他们设计的用例。 Safari 或 IE 不支持。
- 使用 Service Worker 的消息事件。这是目前在 Safari 中唯一有效的方法,但定期唤醒 Service Worker 并不是很好。请注意,Service Worker 不能在 Firefox 隐私浏览模式下工作,因此 Firefox 支持 BroadcastChannel 是件好事。
- 使用存储事件。这是 Internet Explorer 中唯一可用的跨表通信方法,但如果您不需要支持 IE(幸运的是),请不要退缩到这一步。请注意,这在 Safari 无痕浏览模式下不起作用(设置 localStorage 项目会引发错误)。另请注意,有一个 IE 的 localStorage 错误,表示存储事件的 newValue 属性实际上是 oldValue,因此您需要在将 localStorage 设置为触发两次后删除它,第二次具有正确的值。
另请注意,以上任何一项都不允许您在 Safari 中的第一方和第三方上下文之间进行通信。