提问人:Merc 提问时间:1/15/2013 最后编辑:gen_EricMerc 更新时间:1/16/2013 访问量:183
识别发出请求的选项卡
Recognise which tab made the request
问:
这个问题可能没有答案。但是,我想我会试一试。 我写了一个很棒的单页申请。当应用程序启动时,打开的选项卡会向服务器“注册”自身,该服务器将其存储为“活动”选项卡。
如果用户 A 更改了工作区中的 XYZ,则任何用户在该工作区上打开的每个选项卡都会收到 XYZ 已更改的通知。这会触发客户端中的重新加载,这将神奇地更新。目前,我正在通过轮询来做到这一点。但是,当一切正常时,我可以使用 WS 或 Socket.io 之类的东西来使事情变得更快。
问题:每个选项卡都会收到通知。甚至是一开始就煽动它的标签!(因此,已经更新的屏幕会更新)
我不知何故需要服务器知道发出请求的选项卡的选项卡 ID。请记住,用户可能打开了 5 个选项卡:如果他们更改了 XYZ,则所有选项卡都应收到通知,但实际触发通知的选项卡除外!
目前,我正在传递每个 Ajax 请求的工作区 ID(用户可能已登录,并且可以同时访问多个工作区)。
- 解决方案 1:为每个请求追加工作区 ID 和选项卡 ID
- 解决方案 2:仅对每个请求使用选项卡 ID。应用将从 tabID (知道它属于哪个工作区) 中计算出工作区 ID:
- 解决方案 3:?????(我错过了什么?
有什么想法吗?
答:
0赞
pawel
1/16/2013
#1
您可以尝试使用 HTML5 Visibility API,回退到 & 事件,并禁止更新页面(如果页面当前可见/处于活动状态)。window.onfocus
window.onblur
评论
0赞
11684
1/17/2013
当页面处于非活动状态时,您将如何检索错过的更新?当客户端认为页面处于另一种状态而不是在服务器上时,这可能会变得非常丑陋......
2赞
alexwells
1/16/2013
#2
与其让服务器担心向哪些选项卡发送更改通知,不如让启动更改的选项卡忽略通知。
我想到了两种方法:
- 更改内容后,选项卡将在短时间内显示所有通知。(除非在短时间内对多个选项卡进行更改,否则这将正常工作。
- 让选项卡创建一个“更改 ID”,它将更改发送到服务器,并将更改发送到 xyz。广播更改通知包含此 ID,发送选项卡将其识别为已发送的 ID 并忽略它。
评论
0赞
Merc
1/17/2013
只要客户端启动“广播请求”,第二个选项就可以正常工作。但是,客户端可能会启动完全不相关的操作,并且服务器可能希望为所有连接的选项卡触发消息,但首先进行更改的选项卡除外。我想我可以有一个 operationId,我必须记住每个请求都有它。
评论