【问题标题】:window.opener is not rightwindow.opener 不对
【发布时间】:2011-04-28 03:49:16
【问题描述】:

我正在打开一个弹出窗口,并希望在其中进行单击操作,从而导致在打开它的页面中执行一些 jQuery。我在网上找到的所有内容都表明我应该可以使用 window.opener 来做到这一点,(例如JQuery - Write to opener window

但是当我console.logwindow.opener 时,它只是“真实的”,而不是真实的物体。 window.opener.jQuerywindow.opener.$ 和 'window.opener.document' 一样未定义。

这是打开窗口的代码:

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

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

【问题讨论】:

  • “开启者”和弹出窗口是否在同一个域中?
  • 请检查您的代码。我猜 window.opener 在脚本中的某个位置被重新分配。我刚刚进行了测试。我看到window.opener在Safari中可以设置为true,在FF中不能设置。

标签: javascript jquery popup


【解决方案1】:

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

【讨论】:

  • 原来是同域问题。一旦我进入同一个域,弹出窗口就可以在父页面上使用 jQuery,使用 window.opener.$ 例如,我可以使用 jQuery 历史记录和 window.opener.$.history.load(url)
【解决方案2】:

大概你在打电话:

console.log(window.opener);

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

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

【讨论】:

    猜你喜欢
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    • 1970-01-01
    相关资源
    最近更新 更多