Javascript:在选项卡之间共享数据

Javascript:在选项卡之间共享数据,javascript,Javascript,在浏览器中打开的选项卡之间共享数据的最佳方式是什么?我能想到的唯一方式是:与服务器进行持续的ajax通信,以报告其他选项卡上的任何用户操作。鉴于这些选项卡在同一站点中打开,您可以考虑构建一个AJAX脚本,该脚本将用户操作报告给服务器并将其与另一个AJAX脚本进行耦合,该脚本读取当前窗口中的报表并反映它们。 < P>一种方式是不让聊天窗口依赖于选项卡。将选项卡作为单独的AJAX组件加载,重新加载时不会影响聊天组件。如果数据较小,您可以使用AJAX(正如其他人所建议的)或Cookie。有关Cooki

在浏览器中打开的选项卡之间共享数据的最佳方式是什么?

我能想到的唯一方式是:与服务器进行持续的ajax通信,以报告其他选项卡上的任何用户操作。

鉴于这些选项卡在同一站点中打开,您可以考虑构建一个AJAX脚本,该脚本将用户操作报告给服务器并将其与另一个AJAX脚本进行耦合,该脚本读取当前窗口中的报表并反映它们。

< P>一种方式是不让聊天窗口依赖于选项卡。将选项卡作为单独的AJAX组件加载,重新加载时不会影响聊天组件。

如果数据较小,您可以使用AJAX(正如其他人所建议的)或Cookie。有关Cookie的乐趣,请参阅。

根据需要,您也可以使用Cookie/会话。但是,这意味着只能在每个选项卡的第一页加载时访问数据


如果您已经打开了两个选项卡,更改其中一个选项卡中的某些内容不会更改另一个选项卡,除非您使用一些AJAX。

如何使用cookie在一个选项卡中存储数据并在另一个选项卡中轮询它?
我还不知道是否在选项卡之间共享cookie,但现在只是一个想法…

如果第一个选项卡自动打开第二个选项卡,您可以执行以下操作:

第一个选项卡:

//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' )

我只是看了一下Facebook聊天是如何做到这一点的,他们将对服务器的请求打开了不到一分钟。如果数据返回到服务器,服务器会将消息发送回每个打开的请求。如果一分钟内没有数据返回,它将重新请求并继续执行此操作(我不确定要多长时间)。

有关更现代的解决方案,请查看

引述:

我坚持使用
localStorage
使用问题中提到的共享本地数据解决方案。就可靠性、效率和浏览器兼容性而言,它似乎是最好的解决方案

localStorage
在所有现代浏览器中都实现

当其他选项卡对
localStorage
进行更改时,
storage
事件将触发。这对于通信目的来说非常方便

参考资料:


另请参阅另一个StackOverflow线程:

在我看来有两个好方法。一个可能更适合你,取决于你需要什么

如果这些都是真的

  • 您不能在服务器端存储信息
  • 您不能发出很多http请求
  • 您只想存储一点点信息[1]
  • 您希望成为纯javascript/客户端
  • 您只需要它在同一浏览器中的选项卡/窗口之间工作
->然后使用cookies(setCookie用于发送,getCookie/setTimeout用于接收)。 这样做的好图书馆是

如果这些都是真的

  • 您想在服务器端存储信息
  • 您希望存储大量信息或将其存储在相关事项中(即表或多维数组[2])
  • 您还需要它跨不同的浏览器(不仅仅是同一浏览器中的选项卡/窗口之间)甚至不同的计算机/用户
->然后使用Comet(长期持有的HTTP请求允许web服务器基本上将数据推送到浏览器)来接收数据。以及发送数据的短POST请求

Etherpad和Facebook聊天目前使用Comet技术


[1] 当使用localStorage时,显然可以存储更多的数据,但由于您需要依赖Cookie,所以还不能依赖于此。除非您的应用程序仅适用于现代浏览器,在这种情况下,这是很好的


[2] 复杂数据也可以存储在cookie中(JSON编码),但这不是很干净(对于没有JSON.stringify/JSON.parse的浏览器,需要回退方法),并且在涉及并发的场景中可能会失败。无法更新JSON cookie值的一个属性。您必须解析它,更改一个属性并覆盖该值。这意味着理论上可以撤消另一次编辑。同样,当使用本地存储时,这不是一个问题

让你自己成为小提琴手[并观看magicSee类似的问题,我在谷歌上搜索了几乎完全相同的问题。不确定为什么它会被关闭,因为它不是一个真正的问题…看,我认为这在用户自己在单独的选项卡中打开页面的情况下不起作用。但是在子窗口仅通过单击父窗口中的按钮打开并设置为全s的情况下不起作用第二个监视器上的屏幕,而家长控制它…应该很有用。不正确,cookie可以像AJAX服务一样轮询。是的,cookie只绑定到域,因此在选项卡之间共享。但是必须连续轮询cookie,您不能监听cookie更改。您的意思是向服务器发出AJAX调用以检查是否为something每隔不到一秒钟就改变一次?不是这样的。如果你需要实时发生事情,这确实需要一直发出大量请求。但是,这可以通过让服务器保留请求更长的时间直到有数据(或超过超时时间)来解决。另请参见[Comet(wikipedia)](还有我的答案。这也是EtherPad和Facebook聊天的工作原理。是的,这种方法被称为“Comet”。从客户端来看,它与简单的AJAX轮询没有什么不同(例如,发出AJAX请求,处理响应并发出另一个请求)。但是,与传统AJAX相比,服务器端是非典型的。服务器在完成任务后不会立即返回。相反,它将保持该任务(例如PHP请求)打开,并执行类似while()的循环,直到出现新信息(或超过超时时间,即50秒)。阅读更多:。这不是真正的推送技术,而是尽可能接近。为什么不使用套接字?这与回答问题不太接近。为什么被接受?问题是如何在浏览器选项卡之间通信;