window.opener不正确。

3
我正在打开一个弹出窗口,并希望在其中添加点击操作,以便在打开它的页面中执行一些jQuery。我在网上找到的所有内容都说我应该使用window.opener来实现这一点(例如JQuery - Write to opener window)。
但是当我使用console.log window.opener时,它只是“true”,而不是一个真正的对象。window.opener.jQuery和window.opener.$以及window.opener.document都是未定义的。
这是窗口打开的代码:
window.open('http://google.com' , "moderatorWindow", 'width=300, height=300');

这是在Safari中出现的情况。其他页面可以启动弹出窗口,当我检查这些窗口上的window.opener时,我得到了一个真实的对象。我做错了什么?


“opener”和弹出窗口是否在同一个域名下? - Cristian Sanchez
请检查您的代码。我猜测在您的脚本中 window.opener 被重新赋值了。我刚刚进行了一项测试。我发现在 Safari 中可以将 window.opener 设置为 true,但在 FF 中无法设置。 - J.S. Taylor
2个回答

2
你的变量是true,而不是对象,因为同源策略规则。就像一个iframe一样,如果你打开的弹出窗口不在同一个域或子域中,那么在创建它之后它将会丢失。如果我可以在我的网站上打开一个(隐藏的)iframe到gmail.com并能够阅读你的电子邮件,那么网络将会是一个非常不安全的地方。
即使弹出窗口在子域上,你也需要额外的工作,并设置两个窗口的document.domain值为根域名(例如mydomain.com)。这是为了确保弹出的站点希望被其父级知道(再次考虑安全问题,如果我的coke.ning.com社区可以打开到你的pepsi.ning.com的隐藏iframe并尝试暴力登录等)。
为了证明我的观点,请实际访问google.com并打开Firebug(如果你使用Safari或Chrome,则为Inspector),然后进行以下操作:
var bob = window.open('http://google.com' , "moderatorWindow", 'width=300, height=300');
bob.window.location.href; // returns "http://www.google.com/"

最后,可以自由地在子页面上调用jQuery来修改同一页面上的元素,反之亦然,但是您不能使用一个页面上的jQuery来修改另一个页面的dom。几年前,我尝试过这样做以节省一些加载时间,除非有什么变化,否则它不起作用。jQuery似乎绑定到它被创建的窗口对象上。会发生奇怪的事情。

1
原来是同域问题。一旦我将其放入相同的域中,弹出窗口就能够在父页面上使用 jQuery,使用 window.opener.$。例如,我能够使用 window.opener.$.history.load(url) 来使用 jQuery 历史记录。 - Brad

0

假设你正在调用:

console.log(window.opener);

应该调用toString()方法,无论window.opener引用的是什么。它应该引用一个窗口对象,这是一个宿主对象。根据ECMA-262标准,宿主对象的toString()方法(如果有的话)可以返回任何它喜欢的东西,甚至可以在某些使用ActiveX实现的IE宿主对象上抛出错误(尝试一下)。

这篇文章可能会有所帮助:http://developer.apple.com/library/safari/#documentation/AppleApplications/Conceptual/SafariJSProgTopics/Articles/Cross-documentmessaging.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接