识别发出请求的选项卡

Recognise which tab made the request

提问人:Merc 提问时间:1/15/2013 最后编辑:gen_EricMerc 更新时间:1/16/2013 访问量:183

问:

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

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

问题:每个选项卡都会收到通知。甚至是一开始就煽动它的标签!(因此,已经更新的屏幕会更新)

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

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

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

有什么想法吗?

JavaScript 阿贾克斯

评论

2赞 Brett Gregson 1/15/2013
我认为解决方案 1 或解决方案 2 没有问题。对于解决方案 1,ajax 请求将是花费最多时间的事情,发送一个额外的值不会有太大区别。解决方案 2 也很好,您只需解释服务器上发送的数据。就个人而言,我会选择解决方案 2。我还将确保您保护您的 ajax 请求(可能是加密的选项卡 ID 和密钥),并在发送请求后在服务器端进行比较
0赞 Merc 1/15/2013
解决方案 2 的问题在于,从“过期”选项卡发出的 Ajax 调用将失败,因为该选项卡不再处于活动状态。这有“有趣”的副作用(请参阅:暂停您的 PC,再次打开它,提交该表单......不,行不通)。至少在解决方案 1 中,调用确实可以工作(尽管程序会收到更改通知......

答:

0赞 pawel 1/16/2013 #1

您可以尝试使用 HTML5 Visibility API,回退到 & 事件,并禁止更新页面(如果页面当前可见/处于活动状态)。window.onfocuswindow.onblur

评论

0赞 11684 1/17/2013
当页面处于非活动状态时,您将如何检索错过的更新?当客户端认为页面处于另一种状态而不是在服务器上时,这可能会变得非常丑陋......
2赞 alexwells 1/16/2013 #2

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

我想到了两种方法:

  • 更改内容后,选项卡将在短时间内显示所有通知。(除非在短时间内对多个选项卡进行更改,否则这将正常工作。
  • 让选项卡创建一个“更改 ID”,它将更改发送到服务器,并将更改发送到 xyz。广播更改通知包含此 ID,发送选项卡将其识别为已发送的 ID 并忽略它。

评论

0赞 Merc 1/17/2013
只要客户端启动“广播请求”,第二个选项就可以正常工作。但是,客户端可能会启动完全不相关的操作,并且服务器可能希望为所有连接的选项卡触发消息,但首先进行更改的选项卡除外。我想我可以有一个 operationId,我必须记住每个请求都有它。