我正在打开一个弹出式窗口,并希望有一个点击动作,导致在打开它的页面中的一些jQuery的执行。我在网上找到的所有东西都说我应该能够用window.opener做到这一点,(例如JQuery - Write to opener window)
但当我console.log window.opener时,它只是“真”,而不是一个真实的物体。像window.opener.$和'window.opener.document‘一样,window.opener.jQuery是未定义的。
下面是打开窗口的代码:
window.open('http://google.com' , "moderatorWindow", 'width=300, height=300');这是在Safari中。其他页面可以启动弹出窗口,当我在这些页面上检查window.opener时,我得到了一个真正的对象。我做错了什么?
发布于 2011-04-28 14:07:01
由于相同的域策略规则,您的变量为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似乎绑定到创建它的窗口对象。奇怪的事情总会发生。
发布于 2011-04-28 13:14:39
假设您正在呼叫:
console.log(window.opener);它应该调用window.opener引用的任何内容的toString()方法。它应该引用一个window对象,它是一个宿主对象。根据ECMA-262,主机对象的toString()方法(如果有)可以返回任何它喜欢的东西,甚至抛出错误(在使用ActiveX实现的某些IE主机对象上尝试)。
这篇文章可能会有所帮助:http://developer.apple.com/library/safari/#documentation/AppleApplications/Conceptual/SafariJSProgTopics/Articles/Cross-documentmessaging.html
https://stackoverflow.com/questions/5813396
复制相似问题