2010-11-02 55 views
8

我有一个HTML5离线应用程序(即没有服务器端组件/代码)。刷新后检索子窗口参考

它基本上有两个窗口(父母和孩子)。但是,在某些情况下,我需要以编程方式刷新父窗口。发生这种情况时,它会失去对孩子的引用,并且孩子对window.opener的引用不再有效。所以我的想法是,我会序列化子窗口并将其存储在localStorage中。然后,当父母刷新它可以从localStorage拿起窗口引用,并仍然与孩子交互。

问题是,这不起作用(根据我以前的问题Stringify DOMWindow object)。我不能像任何其他对象一样序列化DOM窗口。

那么,我怎样才能让我最近刷新的窗口获得对其前任孩子的参考?

编辑:强调它是一个离线应用程序的事实。没有服务器端组件。

我还应该补充一点,我需要刷新父项的原因是检查应用程序更新(缓存清单中的更改)。由于父页是加载的应用程序的第一页,它基本上管理缓存(事实上,如果在整个浏览器崩溃的任何缓存过程中此窗口关闭,则在Safari中放在旁边)。所以“父母”本质上是“用户加载的第一页”。 这意味着我不能在框架中拥有“父”,因为最顶层的窗口会管理缓存,并且需要刷新才能查找更新。 实际上,我似乎可以使用框架方法,因为刷新应用程序中的任何页面都会触发更新检查。虽然麻烦。

回答

1

在这里看到:http://www.w3.org/TR/html5/offline.html#dom-appcache-update

applicationCache.addEventListener("updateready", function() { 
    applicationCache.swapCache(); 
    //now reload the body html 
}, false); 
setInterval(60000, applicationCache.update);//check for updates every minute 

(每一个新版本已被下载时间updateready火灾)

+1

这不是我正在寻找的更新事件(我已经有了一个侦听器),而是您的片段的applicationCache.update部分。谢谢。 – ggutenberg 2010-11-03 14:46:39

0

听起来像一个非常复杂的解决方案。你为什么不把父窗口的内容放在一个不可见的iframe中(即没有边框),只刷新一帧?

这将允许您将引用保存到顶部文档中的框架和子窗口,其中两者都可以访问它。

0

你能打电话给你的开瓶器,告诉它重新加载并重新打开弹出页面的东西?

例如

//in popup 
window.opener.doReload('popup_page_name.html'); 
window.close(); 

//in opener 
function doReload(popupURL){ 
    setSomeFormField(popupURL); 
    someForm.submit(); 
} 

然后在您的服务器端代码中,如果您有弹出式设置,请添加代码以重新启动它。

+0

没有服务器端代码。这是一个HTML5离线应用程序。 100%的客户端。另外,这种情况下的弹出窗口是“主”应用程序。因此,在任何时候关闭它都会让用户非常不安。 – ggutenberg 2010-11-02 17:38:45

+0

我很困惑......如果弹出窗口是“主”应用程序,为什么会有一个启动窗口启动它? – scunliffe 2010-11-02 17:58:09

+0

因为我的客户希望主应用程序“看起来不像浏览器”,所以它被启动器打开时没有工具栏,地址栏,状态栏等。另外,这种方式启动程序管理更新/下载进程酒吧等,而用户可以在一个单独的窗口中自由地使用主应用程序。 – ggutenberg 2010-11-02 18:04:09

12

你可以简单地通过下面的技巧获得子窗口的参考。

newWin = window.open("", "child_window_name", "width=..."); 
if (newWin.location.href === "about:blank") { 
    newWin = window.open("a.html", "child_window_name", "width=..."); 
} else { 
    // We've already obtained the reference. 
    // However, IE and FireFox won't put focus on an already opened window. 
    // So we have to do that explicitly: 
    newWin.focus(); 
} 

注意,你必须有一个固定的子窗口名称,以使这一招作品。

例URL: http://josephj.com/lab/2011/window-open-reconnect/demo.html

+0

哇完美,正是我所需要的,它适用于所有浏览器。非常感谢。我不知道'about:blank'。 David Flanagan在他的书“JavaScript - 权威指南”一书的第354页(第6版)中谈到了这个URL。尽管如此,IE和FireFox并不想把重点放在已经打开的窗口上。通过在else子句中添加'newWin.focus()'来解决这个问题。 – 2013-12-14 17:30:17

+0

谢谢!这段代码解决了我的问题!我的情况是,当通过window.open()产生一个包含长时间运行的Javascript的子窗口时,立即关闭该子窗口会导致父窗口在IE上意外刷新。 – Barney 2015-01-13 10:12:14

+0

是的,很酷!但是,重新加载父级后,子窗口会重新加载...或者它不应该? (不能与示例 - 链接不工作) – basil 2016-06-02 06:47:35