Javascript:持久化窗口对象引用?

时间:2010-09-24 15:45:57

标签: javascript window object-persistence

我的javascript代码打开了一些窗口:

var win = window.open();

我将win引用存储在一个包含所有其他打开窗口的数组中 一切正常,直到揭幕战得到更新。

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

要意识到这一点,我必须:
1.在卸载时保留所有引用 2.在加载时获取引用 3.使用新的开启者

更新引用

有可能吗?如果是这样的话?

3 个答案:

答案 0 :(得分:4)

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

你问的问题一直是问题,因为回过头来回到最初的HTTP协议。

简短的回答是否定的,这是不可能的。刷新父级时,对子级的所有引用都将丢失。在所有情况下,这是非常现实的....父母是“刷新”....孩子得到父母留下的所有资源...对不起,关闭主题,好吧,是的。 Web是无状态的,因此一旦刷新页面,重新加载,关闭,打开或附加任何其他动词,该页面将被视为文档。


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

以下内容将起作用,但为了重新连接子/父之间的关系,必须从孩子那里完成。下面的脚本/标记将举例说明。  所以我不会用它,但它只是作为一个例子。

步骤:

  • Open Child
  • 转到孩子
  • 刷新父级
  • **父母 - >儿童关系丢失了。
  • **儿童 - >父母关系仍然存在。
  • Link Parent
  • 转到“父页”
  • 检查关系
  • **您将看到父级现在不为空
  • 留在父母身上
  • 刷儿童

<强> 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并刷新(IE。文件上传等主页不需要刷新的地方)。

我远不是一个苹果粉丝男孩,但这个链接确实提供了使用IFrames编写脚本的很好的见解:http://developer.apple.com/internet/webcontent/iframe.html

我希望这会有所帮助。

答案 1 :(得分:3)

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

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

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

这样我就可以回复所有的孩子了! ;)

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

此解决方案已在Firefox,IE和Chrome下测试。

*在Chrome中键入新地址时会启动一个新窗口,因此开启者也会为空。

答案 2 :(得分:0)

要么避免重新获取主窗口(使用AJAX或iframe),要么将“主窗口”放入框架集中,这样实际上只重新加载“主框架” - 然后你可以将变量粘贴到父框架中< / p>