Unsafe JavaScript尝试访问具有URL的框架

9
我有一个带有iframe和JavaScript的页面,Iframe可以访问父框架的函数。这些页面在同一服务器上(不是跨域脚本),在Firefox和IE上没有问题,但在Chrome上使用时,会出现以下消息。
不安全的JavaScript尝试访问具有URL的框架 http://samedomain:51700/irj/servlet/prt/portal/prtroot/CRMApp73.StoricoApp 从具有URL的框架中访问 http://samedomain:51700/irj/servlet/prt/portal/prtroot/CRMApp73.CRMOProxy。 域,协议和端口必须匹配。
如何解决此问题?我已经通过谷歌搜索了4个小时,希望有人能帮助我。
编辑:代码

这是iframe页面中的JavaScript。此JavaScript调用父框架JavaScript函数“setUfficioPostale”。这就是Chrome给我“不安全访问...”错误的地方。

<script>
    window.parent.setUfficioPostale(map);
</script>

这是父框架中用于提交表单的JavaScript代码。它用于向在iframe中加载的页面发送带有隐藏参数的隐藏表单。
function onAltroUfficioClick(){
    document.getElementById("hiddenParams").submit();
    $('#framePosteMaps').show();
}

这是父页面中的iframe定义。

<iframe id="framePosteMaps" scrolling="no" name="framePosteMaps"></iframe>

这是带有target属性的表单,用于向iframe页面发送参数。
<form id="hiddenParams" target="framePosteMaps" action="http://samedomain:51700/irj/servlet/prt/portal/prtroot/TestFrameRC.SimPerProxy" method="POST">
    <input type="hidden" name="distanza" value="10">
    <input type="hidden" name="cliente" value="Retail">
    ....................
</form>

虽然听起来似乎不必要,但也许在父页面和 iframe 中都将 document.domain 设置为相同的值会使它正常工作? - Brian Donovan
请注意:如果您的同域名为foo.somedomain.combar.somedomain.com,它们并不相同。 - c69
CRMOProxy 是否在更改您的端口? - Kevin M
如果"samedomain"确实是完全相同的字符串,并且iframe没有重定向到任何地方,那么这肯定看起来像是一个bug。顺便问一下,你为什么不使用ajax呢? - a sad dude
我有同样的问题。但是,只有在https上出现错误。我特别将iframe src设置为https,父页面也是https,但出现了错误。你解决了吗? - Scoota P
3个回答

2

首先,请检查在iframe的SRC属性中引用这两个页面的方式是否完全相同,我是指:

http://samedomain:51700/irj/
http://samedomain:51700/irj/

因为有可能即使它们在同一台机器上运行,其中一个iFrame的名称是这样的:

http://localhost:51700/irj/

和另一个:

http://MachineId:51700/irj/

或者任何其他组合。

您可以通过在所有现代浏览器中使用开发人员工具来检查代码。

如果父级与子级在同一域中(我每天都这样做),Chrome允许您调用父级函数,因此不应该有任何问题。

我使用此功能来访问子iFrames:

var getIframe = function (id) {
    if ($.browser.mozilla) return document.getElementById(id).contentWindow;
    return window.frames[id];
};

当你想要访问父级中的一个函数时,只需使用"parent.yourParentFunction()"。

请检查父级的函数是否被分配给了Window对象(全局命名空间)。

祝你好运!:-)


3
只是一点小提示:测试浏览器类型/版本并不是一个好的做法。相反,应该测试功能的可用性! - Andrei Sosnin

2
Chrome不允许您这样做。来自Iframe的代码无法访问父级代码。

1
父框架可能设置了与“同域”不同的document.domain值。 在iframe js中更新document.domain属性以与父框架设置的值相同,这样就可以正常工作了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接