ggu*_*erg 8 javascript html5 dom
我有一个HTML5离线应用程序(即没有服务器端组件/代码).
它基本上有两个窗口(父和子).但是,在某些情况下,我需要以编程方式刷新父窗口.发生这种情况时,它会丢失对子节点的引用,并且子节点对window.opener的引用不再有效.所以我的想法是我将序列化子窗口并将其存储在localStorage中.然后当父进行刷新时,它可以从localStorage中获取窗口引用并仍然与子进程交互.
问题是这不起作用(根据我之前的问题Stringify DOMWindow对象).我无法像任何其他对象一样序列化DOM窗口.
那么我怎样才能让我新刷新的窗口获取对其前任孩子的引用?
编辑:强调它是一个离线应用程序的事实.没有服务器端组件.
我还要补充一点,我需要刷新父级的原因是检查应用程序更新(缓存清单中的更改).由于父是加载的应用程序中的第一个页面,它基本上管理缓存(事实上,在Safari中,如果在任何缓存过程中关闭此窗口,则整个浏览器崩溃).所以"父"本质上是"用户加载的第一页". 这意味着我不能在框架中拥有"父",因为最顶层的窗口将管理缓存,并且需要刷新才能查找更新.实际上,似乎我可以使用frame方法,因为刷新应用程序中的任何页面都会触发更新检查.虽然很麻烦.
小智 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();
}
Run Code Online (Sandbox Code Playgroud)
请注意,您必须具有固定的子窗口名称才能使此技巧有效.
示例URL:http: //josephj.com/lab/2011/window-open-reconnect/demo.html
请参阅此处: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
Run Code Online (Sandbox Code Playgroud)
(updateready每次下载新版本时都会触发)
| 归档时间: |
|
| 查看次数: |
6897 次 |
| 最近记录: |