1

在 window.opener 中访问和创建对象非常简单。

window.opener.myObj = new Object();
window.opener.myObj.name = 'Tom';
alert(window.opener.myObj.name); // alerts('Tom')

但是,当当前(子)窗口关闭时,对象 myObj 变为无效,因为该对象实际上驻留在当前窗口中,并且 window.opener 仅保留对它的引用。

我们如何从子窗口中在 window.opener DOM 中创建一个对象,以便在子(当前)窗口关闭时仍然存在?

4

1 回答 1

0

但是,当当前(子)窗口关闭时,对象 myObj 变为无效,因为该对象实际上驻留在当前窗口中,并且 window.opener 仅保留对它的引用。

你证明过吗?我不得不承认没有尝试过。我在 Chrome 或 Firefox 上都看不到这个结果。即使在子窗口关闭时,该对象仍然存在。更新:奇怪的是,在 IE9 上,对象仍然存在,但属性不存在。

但假设这是真的,你可以试试

window.opener.myObj = new window.opener.Object();

......但我不会真的抱任何成功的希望。更新:这不仅对 IE9 没有帮助,而且实际上使情况变得更糟。


相反,我认为我必须提倡回调父窗口以要求创建对象。

父窗口脚本:

function createFoo(spec) {
    window.foo = jQuery.extend({}, spec);
    display("Created <code>foo</code> as requested by child window");
}

jQuery(function($) {
    var childid = "childwin" + new Date().getTime();

    $("#openPopup").click(function() {
        var wnd = window.open("http://jsbin.com/asocuy/1", childid);
    });
    $("#displayFoo").click(function() {
        if (window.foo) {
            display("<code>foo</code> exists");
            display("<code>foo.name</code> = " + window.foo.name);
        }
    });
});

function display(msg) {
    $("<p>").html(String(msg)).appendTo(document.body);
}

子窗口脚本:

jQuery(function($) {

    if (window.opener) {
        if (!window.opener.createFoo) {
            display("<code>window.opener.createFoo</code> not found");
        }
        else {
            window.opener.createFoo({
                name: "Fred"
            });
            display("Asked parent window to create <code>foo</code> with name = 'Fred'");
        }
    }
    else {
        display("<code>window.opener</code> not found");
    }

    $("#btnClose").click(function() {
        window.close();
    });

    function display(msg) {
        $("<p>").html(String(msg)).appendTo(document.body);
    }
});

实例| 来源(甚至可以在 IE 中使用)

于 2012-11-07T17:58:29.477 回答