【问题标题】:Calling methods on a parent window from iframe fails in Opera在 Opera 中从 iframe 调用父窗口上的方法失败
【发布时间】:2012-03-24 05:07:00
【问题描述】:

在我的一个页面中,我有一个 iframe,它是从与主页不同的子域加载的。 在这两个文档中,我将 document.domain 设置为相同,然后尝试从父页面上的 iframe 调用方法,例如:

window.parent.page.doit()

这在大多数浏览器(IE、firefox、chrome、safari)中运行良好,但在 opera 中失败并显示以下错误消息:

未捕获的异常:ReferenceError:安全错误:试图读取 受保护的变量:页面

从我设法找到的内容来看,Opera 似乎比其他浏览器具有更严格的安全性。有没有人遇到过这个问题?任何想法如何解决它或任何解决方法?

谢谢。

【问题讨论】:

    标签: javascript opera cross-domain-policy


    【解决方案1】:

    您必须在两个页面上将 document.domain 设置为二级域,即

    ma​​indomain.com

    document.domain = "maindomain.com";
    

    subdomain.maindomain.com

    document.domain = "maindomain.com";
    

    【讨论】:

    • 我写了 在两个文档中我将 document.domain 设置为相同,否则它在其他浏览器中也不起作用。
    • 我在这里创建测试页:testplayground.com/xdm,在 Opera 11.61 (mac os) 中运行良好。它在你的歌剧中有效吗?
    • 是的,这适用于我的歌剧,我不知道为什么我遇到了我描述的问题,我更改了一些代码来解决另一个问题,错误就消失了。我不确定是什么触发了它,因为我显然确实更改了两个文档的域。感谢您提供帮助。
    【解决方案2】:

    我见过一些 Opera 版本(我认为是 11.60 左右?)缓存页面的安全信息或类似内容,导致安全错误仅在清除缓存并重新启动后才消失。调试很糟糕,但至少您的访问者通常不会遇到这个问题..

    【讨论】:

    • 问题不知何故消失了,我不知道是怎么回事,但我可以肯定地说,清除缓存(历史记录、cookie 等等)对这个问题没有影响,甚至没有重新启动(两个浏览器和机器)。
    • 哇。我能想到的唯一另一件事是时间问题。 document.domain = ... 行应该尽可能早地出现在页面中,而不是在 onload 或其他事件处理程序中......
    • 不,我检查以确保不是这种情况,我使用了 alert (因为它会阻塞)以便我知道什么时候会发生什么。 document.domain 分配发生在框架之间进行任何通信之前。
    • 很奇怪。我真的很抱歉问题已经消失了,我们应该分析一下.. :-p
    • 对不起,我不知道你在歌剧队。很遗憾,我没有关于如何重现此问题的有用信息,我可以告诉您的是我没有使用最新版本。我现在拥有的是 Version: 11.52, Build: 1100, Platform: Linux (id: "Opera/9.80 (X11; Linux i686; U; en) Presto/2.9.168 Version/11.52") .
    猜你喜欢
    • 1970-01-01
    • 2012-10-30
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    相关资源
    最近更新 更多