window.opener不对

时间:2011-04-28 03:49:16

标签: javascript jquery popup

我正在打开一个弹出窗口并希望在其中执行单击操作,导致在打开它的页面中执行某些jQuery。我在网上找到的一切都说我应该能够用window.opener做到这一点,(例如JQuery - Write to opener window

但是当我console.log window.opener时,它只是'真实',而不是真实的对象。 window.opener.jQuery未定义为window.opener.$和'window.opener.document'。

这是窗口打开代码:

window.open('http://google.com' , "moderatorWindow", 'width=300, height=300');

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

2 个答案:

答案 0 :(得分:2)

由于相同的域策略规则,您的变量为true而不是对象。就像iframe一样,如果您打开的弹出窗口不在同一个域或子域中,那么在您创建它后它就会丢失。如果我可以说,在我的网站上打开一个(隐藏的)iframe到gmail.com并且能够阅读你的电子邮件,网络将是一个非常不安全的地方。

即使弹出窗口在子域上,您也需要做额外的工作,并将两个窗口的document.domain值设置为根域(例如mydomain.com)。这是为了确保弹出的网站想要为其父母所知(再次,考虑安全性,如果我的coke.ning.com社区可以打开一个隐藏的iframe到你的pepsi.ning.com并做一个强力尝试登录等。)

要证明我的观点,请尝试实际访问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 :(得分:0)

大概是你在打电话:

console.log(window.opener);

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

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