iOS Safari 中未触发存储事件

问题描述 投票:0回答:1

我在 iOS Safari 中有两个选项卡,它们都打开到同一页面。两个选项卡都有一个针对窗口对象上的存储事件的事件侦听器,并且当客户端单击/点击/类型时都会写入本地存储。

在 Internet Explorer 中,未交互的选项卡会接收存储事件,但 Safari 不会(在 Firefox 和 Chromium 浏览器上,我改为使用广播通道 API 来实现此目的)。另外,这段代码之前在 Safari 上测试过(恐怕我不记得是哪个版本)并且它有效。

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

javascript local-storage mobile-safari
1个回答
0
投票

起初我以为这是跟踪预防的一部分(对于试图通信的第三方页面上的页面和同一页面的 iframe 仍然是这种情况),但现在我认为这实际上是 Safari错误

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

  1. 如果支持,请使用BroadcastChannel,因为这实际上是它们设计的用例。
  2. 使用 Service Worker 的消息事件。比 BroadcastChannel 的支持稍好一些,但定期唤醒 Service Worker 并不是很好。请注意,Service Workers 无法在 Firefox 隐私浏览模式下工作,因此 Firefox 支持 BroadcastChannel 是一件好事。
  3. 使用存储事件。这是 Internet Explorer 中唯一可用的跨选项卡通信方法,但如果您不需要支持 IE(幸运的是),那么请不要退到这一步。请注意,这在 Safari 隐私浏览模式下不起作用(设置 localStorage 项目会引发错误)。另请注意,IE localStorage 存在一个 bug,这意味着存储事件的 newValue 属性实际上是 oldValue,因此您需要在设置 localStorage 值后将其删除,以触发它两次,并且第二次具有正确的值。
另请注意,以上内容都不会让您在 Safari 中的第一方和第三方上下文之间进行通信。

© www.soinside.com 2019 - 2024. All rights reserved.