window.opener不对

我打开一个弹出窗口并希望在其中执行单击操作,导致在打开它的页面中执行一些jQuery。 我在网上找到的所有东西都说我应该能够用window.opener做到这一点,(例如JQuery – 写入开启窗口 )

但是当我在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时,我得到一个真实的对象。 我究竟做错了什么?

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

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

要certificate我的观点,请尝试实际访问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似乎绑定到创建它的窗口对象。 奇怪的事情发生了。

大概是你在打电话:

 console.log(window.opener); 

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

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