【发布时间】:2012-06-15 07:49:48
【问题描述】:
我正在构建一个执行大量客户端数据下载和处理的应用程序。通过在驻留在子域上的 iframe 中进行处理,数据处理与主应用程序隔离。正是这个 iframe 下载数据。通过 postMessage 进行通信。
一切都很好,除了它可能会更好。
如果用户打开额外的选项卡/窗口,应用程序当前会重新加载所有数据,甚至可能会重复处理工作,这不是问题,只是它会减慢一切速度并且页面加载时间会更长。
我想做的是让每个顶级选项卡/窗口只与一个处理 iframe 进行通信,如果原始窗口关闭,则可以恢复该 iframe。问题是,这些不是通过 javascript 打开的,而是通过普通浏览器方法打开选项卡中的链接,所以我无法获得对发送消息所需的 iframe 的引用。
我是否可以将 iframe 的窗口引用传递给其他选项卡,以便它们可以通过 postMessage 与之通信?这是否可以通过使用共享工作者以某种方式实现?
我意识到我可以使用共享工作器来完成整个处理任务,但这会有它自己的问题,因为数据来自第三方域,无法从工作器内部访问。
只需要与所有主流浏览器的最新版本兼容。
编辑:我刚刚发现 SharedWorker 尚未在 Firefox 中实现,所以我想这不会起作用。我还有其他方法可以实现吗?
编辑 2:我发现您可以使用:
var win = window.open('', 'my_window_name');
从任何其他窗口捕获对 iframe 的引用。但是,如果 iframe 尚不存在,则它将作为窗口打开。即使立即关闭,它也会导致闪烁并导致“弹出被阻止”消息,使其无法使用。
【问题讨论】:
-
我认为网络工作者不是一个选项,因为它只能在 IE 10 中工作;-)
-
使用html5本地存储,可以吗?
-
@pahnin 这是一个想法。我会做一个实验。
-
@pahnin 我看不到将窗口引用转换为字符串并再次返回的方法。如果使用 SharedWorkers,这也是一个问题。
-
@SystemicPlural 将长期运行过程的结果和/或进度简单地存储在
localStorage中可能更容易(我认为这也是 pahnin 的意思)。然后您可以定期检查其状态,并在完成后显示结果。 window-to-string-reference-to-window 的东西听起来很脆弱和棘手。