3

我的 javascript 代码通过以下方式打开了一些窗口:

var win = window.open();

我将 win 引用与所有其他打开的窗口一起存储在一个数组中。
一切正常,直到开瓶器被刷新。

所以我想要实现的是在加载“主”窗口时取回对打开窗口的所有引用。

为了实现这一点,我必须:
1. 保留卸载时的所有引用 2. 取回加载时的引用 3. 使用新的开启器更新引用

是否可以?如果是这样怎么办?

4

3 回答 3

4

这听起来很复杂(阅读:有问题)。

您要问的问题从很久以前就一直是一个问题,并且可以追溯到原始 HTTP 协议。

简短的回答是否定的,这实际上是不可能的。当您刷新父级时,对子级的所有引用都将丢失。实际上,这很现实……父母“焕然一新”……孩子们得到了父母留下的所有资源……对不起,题外话了。Web 是无状态的,因此一旦页面被刷新、重新加载、关闭、打开或附加了任何其他动词,该页面就会被视为一个文档。


这在 chrome/FireFox 中运行良好,但在 IE 中不起作用。

像下面这样的东西会起作用,但为了重新建立孩子/父母之间的关系,必须从孩子身上完成。下面的脚本/标记将给出一个示例。所以我不会使用它,但它只是作为一个例子。

脚步:

  • 打开孩子
  • 前往儿童
  • 刷新父级
  • **父 -> 子关系丢失。
  • **子 -> 父关系仍然存在。
  • 链接父级
  • 转到父页面
  • 检查关系
  • **您会看到父级现在不为空
  • 留在父母身边
  • 刷新孩子

HTMLPage.htm:

<input type="button" onclick="openChild();" value="Open Child" />
<input type="button" onclick="refreshParent();" value="Refresh Parent" />
<input type="button" onclick="linkParent();" value="Link Parent" />
<input type="button" onclick="checkRelationship();" value="Check Relationship" />
<input type="button" onclick="refreshChild();" value="Refresh Child" />


<script type="text/javascript" language="javascript">

    var child;    
    function openChild() {
        child = window.open("HTMLPage.htm");
    }

    function refreshParent() {
        alert("refreshing parent");
        window.opener.location.href = window.opener.location.href;
    }

    function linkParent() {
        window.opener.child = window;
        checkRelationship();
    }

    function checkRelationship() {
        alert("Parent: " + window.opener + ".   Children:" + child);
    }

    function refreshChild() {
        child.location.href = child.location.href;
    }


</script>

那么我的下一个问题是:

你想用这个来达到什么目的?当情况确实需要一个模式窗口/弹出窗口时,我完全赞成使用,但是你需要它们的数组吗?

父页面是否“需要”刷新?您能否在父页面上粘贴 iframe 并刷新它(即,文件上传等,主页不需要“刷新”)。

我远不是一个苹果迷,但这个链接确实提供了一个很好的洞察使用 IFrame 和脚本:http: //developer.apple.com/internet/webcontent/iframe.html

我希望这有帮助。

于 2010-09-24T16:10:30.317 回答
3

我是如何解决这个问题的。

子窗口“opener”属性保持对打开它的 WINDOW 的引用,因此当主窗口刷新时,窗口不会改变,因此打开器引用仍然相同。打开器为空的唯一情况是窗口关闭时*

在主窗口的卸载事件中,我在设置超时的子窗口上调用 javaScript 函数。当超时结束时,我测试开启者引用并尝试注册回来,因为引用仍然正确。

这样我就有了所有的孩子参考!!;)

当然,如果主窗口中加载的文档不是我的文档,但是,例如,www.google.com 注册回子引用失败。

该解决方案已在 Firefox、IE 和 Chrome 下测试。

*在 Chrome 中,当您键入新地址时,它会启动一个新窗口,因此 opener 也将为空。

于 2010-10-05T14:35:21.567 回答
0

要么避免刷新主窗口(使用 AJAX 或 iframe),要么将“主窗口”放入框架集中,以便实际上只重新加载“主框架” - 然后您可以将变量粘贴到父框架中

于 2010-09-24T16:26:52.793 回答