在浏览器中打开标签页之间共享数据的最佳方法是什么?
答案 0 :(得分:31)
要获得更现代化的解决方案,请查看https://stackoverflow.com/a/12514384/270274
引用:
我坚持使用
localStorage
在问题中提到的共享本地数据解决方案。它似乎是可靠性,效率和浏览器兼容性方面的最佳解决方案。
localStorage
已在所有现代浏览器中实施。其他标签对
storage
进行更改时会触发localStorage
事件。这对于沟通来说非常方便。参考:
http://dev.w3.org/html5/webstorage/
http://dev.w3.org/html5/webstorage/#the-storage-event
答案 1 :(得分:11)
如果第一个标签自动打开第二个标签,您可以执行以下操作:
第一个标签:
//open the first tab
var child_window = window.open( ...params... );
第二个标签:
// get reference to first tab
var parent_window = window.opener;
然后,您可以调用函数并在标签之间执行各种操作:
// copy var from child window
var var_from_child = child_window.some_var;
// call function in child window
child_window.do_something( 'with', 'these', 'params' )
// copy var from parent window
var var_from_parent = parent_window.some_var;
// call function in child window
parent_window.do_something( 'with', 'these', 'params' )
答案 2 :(得分:4)
另请参阅另一个StackOverflow线程:Javascript communication between browser tabs/windows。
在我看来,有两种好的方法。根据你的需要,你可能会更适合你。
如果其中任何一个:你
- >使用cookies(setCookie用于发送,getCookie / setTimeout用于接收)。 这样做的好库是http://theprivateland.com/bncconnector/index.htm
如果其中任何一个:你
- >使用Comet(长期持有的HTTP请求允许Web服务器基本上将数据推送到浏览器)来接收数据。短POST请求发送数据。
Etherpad和Facebook Chat也使用Comet技术。
[1]当使用localStorage时,显然可以存储更多数据,但由于你在cookie上有所回头,所以还不能依赖它。除非您的应用程序仅适用于现代浏览器,否则这样就可以了。
[2]复杂的数据也可以存储在cookie中(JSON编码),但这不是很干净(并且需要没有JSON.stringify / JSON.parse的浏览器的回退方法),并且在涉及并发的情况下可能会失败。无法更新JSON cookie值的一个属性。您必须解析它,更改一个属性并覆盖该值。这意味着理论上可以撤消另一个编辑。同样,当使用localStorage时,这不是一个问题。
答案 3 :(得分:2)
我能想到的唯一方法:与服务器进行持续的ajax通信,以报告其他选项卡上的任何用户操作。
答案 4 :(得分:2)
如何使用cookie在一个选项卡中存储数据并在另一个选项卡中进行轮询? 我还不知道如果在标签之间共享一个cookie,但现在只是一个想法......
答案 5 :(得分:2)
我刚刚看了一下Facebook Chat是如何做到这一点的,他们向服务器保持开放请求的时间少于一分钟。如果数据返回到服务器,则服务器然后将消息发送回每个打开的请求。如果一分钟内没有数据回来,它会重新请求并继续执行此操作(多长时间,我不确定)。
答案 6 :(得分:1)
鉴于这些选项卡是打开的,其中包含相同的站点,您可以考虑构建一个ajax脚本,将用户操作报告给服务器,并将其与另一个读取该报告并在当前窗口中反映它们的ajax脚本耦合。
答案 7 :(得分:1)
如果数据很小,你可以使用AJAX(正如其他人所建议的那样)或cookie。有关Cookie的乐趣,请参阅http://www.quirksmode.org/js/cookies.html。
答案 8 :(得分:0)
执行此操作的一种方法是不要让聊天窗口依赖于选项卡。将选项卡作为单独的AJAX组件加载,重新加载时不会影响聊天组件。
答案 9 :(得分:0)
根据要求,您还可以使用Cookie /会话。但是,这意味着只能在每个选项卡的第一页加载时访问数据。
如果你已经打开了两个标签,那么除非你使用一些AJAX,否则在一个标签中更改内容不会改变另一个标签。