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