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

IT技术 javascript
2021-03-06 00:45:04

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

6个回答

如需更现代的解决方案,请查看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

还有其他几种在选项卡之间共享数据的方法:您也可以使用postMessageBroadcastChannel
2021-04-24 00:45:04
您将遇到 Edge 等浏览器的问题,这些浏览器在私有模式下不会在选项卡之间共享本地存储。
2021-04-27 00:45:04
对于存储在localStorage 与 sessionStorage 中的密钥范围
2021-05-03 00:45:04

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

第一个标签:

//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' )
我认为这不适用于用户自己在单独的选项卡中打开页面的情况。
2021-04-15 00:45:04
但是在子窗口仅通过单击父级中的按钮打开并在父级控制时在第二台显示器上全屏显示的情况下......应该很有魅力。
2021-04-24 00:45:04

另请参阅另一个 StackOverflow 线程:浏览器选项卡/窗口之间的 Javascript 通信

在我看来,有两种很好的方法。根据您的需要,一种可能更适合您。

如果其中任何一个是真的...

  • 你不能存储信息服务器端,
  • 你不能发出很多 http 请求,
  • 您只想存储一点信息[1],
  • 你想成为纯 javascript / 客户端,
  • 您只需要它在同一浏览器中的选项卡/窗口之间工作。

-> 然后使用 cookie(setCookie 用于发送,getCookie/setTimeout 用于接收)。这样做的一个很好的图书馆是http://theprivateland.com/bncconnector/index.htm

如果其中任何一个是真的...

  • 您要存储信息服务器端
  • 您想存储大量信息或将其存储在相关事物中(即表格或多维数组[2])
  • 您还需要它跨不同的浏览器(不仅仅是在同一浏览器中的选项卡/窗口之间)甚至不同的计算机/用户。

-> 然后使用 Comet(长期持有的 HTTP 请求允许 Web 服务器基本上将数据推送到浏览器)接收数据。以及发送数据的短 POST 请求。

Etherpad 和 Facebook Chat 目前使用 Comet 技术。


[1] 当使用 localStorage 时,显然可以存储更多数据,但是由于您会回退到 cookie,因此还不能依赖于此。除非您的应用程序仅适用于现代浏览器,否则这很好。

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

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

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

是的 cookie 仅绑定到域,因此在选项卡之间共享。但是必须不断轮询cookie,不能监听cookie的变化。
2021-05-02 00:45:04