6

这个问题大概没有答案。但是,我想我会试一试。我写了一个很棒的单页应用程序。当应用程序启动时,打开的选项卡将自己“注册”到服务器,服务器存储为“活动”选项卡。

如果用户 A 在工作区中更改 XYZ,则任何用户在该工作区上打开的每个选项卡都会收到 XYZ 已更改的通知。这会触发客户端重新加载,这将神奇地更新。目前,我正在通过投票来做到这一点。但是,当一切正常时,我可以使用 WS 或 Socket.io 之类的东西来使事情变得更快。

问题:每个选项卡都会收到通知。甚至是最初煽动它的标签!(结果,一个已经更新的屏幕得到更新)

我不知何故需要服务器知道发出请求的选项卡的选项卡 ID。请记住,用户可能打开了 5 个选项卡:如果他们更改 XYZ,所有选项卡都应该收到通知,除了实际触发它的选项卡!

目前,我正在为每个 Ajax 请求传递工作区 ID(用户可能已登录,并且可以同时访问多个工作区)。

  • 解决方案 1:为每个请求附加工作区 ID和选项卡 ID
  • 解决方案 2:仅对每个请求使用选项卡 ID。该应用程序将从 tabID 中计算出工作区 ID(它知道它属于哪个工作区)
  • 解决方案3:??????(我错过了什么?)

有任何想法吗?

4

2 回答 2

2

与其让服务器担心向您发送更改通知的选项卡,不如让启动更改的选项卡忽略通知。

想到了两种方法:

  • 更改内容后,选项卡将在短时间内忽略所有通知。(除非在短时间内发生多个选项卡上的更改,否则这将正常工作。)
  • 让选项卡创建一个“更改 ID”,将其与 xyz 的更改一起发送到服务器。广播更改通知包含此 ID,发送选项卡将其识别为它发送的 ID,并忽略它。
于 2013-01-16T15:53:02.103 回答
0

您可以尝试使用HTML5 Visibility API回退到window.onfocus&window.onblur事件,并在页面当前可见/活动时禁止更新页面。

于 2013-01-15T19:09:01.330 回答