javascript - window.opener 不对

标签 javascript jquery popup

我正在打开一个弹出窗口,并希望在其中执行单击操作,从而在打开它的页面中执行一些 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 时,我得到了一个真实的对象。我做错了什么?

最佳答案

由于同域策略规则,您的变量为 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 似乎绑定(bind)到它创建的窗口对象。奇怪的事情发生了。

关于javascript - window.opener 不对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5813396/

相关文章:

javascript - "Print"数据库中复选框中的值

javascript - 如何在通量中设置ajax数据获取?

jquery - 在高度为 :100% 的溢出元素之后放置页脚

javascript - 切换汉堡下拉菜单 : How to call ancestor with JQuery?

jquery - 有没有办法为 IE8 及以下用户启用 JQuery 弹出窗口?

javascript - 关闭弹出窗口后刷新父窗口

javascript - Vue中如何在函数之间共享变量

javascript - 是否有通过 Javascript 访问没有 id 的 DOM 元素的通用方法?

javascript - Chrome 扩展程序弹出窗口可按用户调整大小

javascript - ES6 API 获取登录 WebApp