Javascript 允许子Iframe从其他域调用其父窗口上的函数

Javascript 允许子Iframe从其他域调用其父窗口上的函数,javascript,iframe,cross-domain,Javascript,Iframe,Cross Domain,我已经创建了一个在IFrame中加载的页面,它需要在加载完成后调用父页面上的函数 它在开发中本地工作(在同一个域上),但在现实世界中,它托管在一个完全不同的域上,因此显然我遇到了跨域问题,即: 不安全的JavaScript试图从URL为http://[…]site2.com/iframe的框架访问URL为http://[…]site1.com的框架。域、协议和端口必须匹配 我控制两台服务器,所以我是否可以在其中一台或两台服务器上放置一些东西,表明它们可以相互通信 我已经研究了在Iframe页面和

我已经创建了一个在IFrame中加载的页面,它需要在加载完成后调用父页面上的函数

它在开发中本地工作(在同一个域上),但在现实世界中,它托管在一个完全不同的域上,因此显然我遇到了跨域问题,即:

不安全的JavaScript试图从URL为http://[…]site2.com/iframe的框架访问URL为http://[…]site1.com的框架。域、协议和端口必须匹配

我控制两台服务器,所以我是否可以在其中一台或两台服务器上放置一些东西,表明它们可以相互通信

我已经研究了在Iframe页面和父页面中设置“document.domain”

我已经尝试过设置访问控制标头:

标题('Access-Control-Allow-Origin:')

但这两种方法都不管用


当我控制两台服务器时,是否有任何方法允许Iframe在完全不同的域上的父窗口中调用函数?

在现代浏览器中,您可以使用它在不同域上的协作帧之间进行通信。您不能直接调用函数,但可以在两者之间传递数据或消息。请参阅。

您可以通过进行帧间通信

例如,在子框架中,可以调用:

parent.postMessage("child frame", "*");
在父帧中,注册一个消息处理程序:

window.addEventListener("message", function(event) {
    console.log("Hello from " + event.data);
});

这里有许多选项:

使用.htaccess重写可以轻松解决此问题

演示:

A.在服务器1上创建名为“iframeContent/”的目录

B.在该目录中放置一个名为index.php的文件,其中包含:

该文件的作用是将对虚拟目录的任何访问重定向到服务器1上的内容


I.重试,使用web浏览器访问“PATH-ON-SERVER-2/iframeting_with-htaccess/”。这一次它会起作用。我希望它能有所帮助:-)

这提供了一个非常简单的解决方案。@craned,但这篇文章只适用于同一个领域。尽管顶部有一条说明,这篇文章主要是出于历史目的而保存的,在现代世界中,您应该只使用IE11上测试的
postMessage
(根据公认的答案)
<html> 
<head></head> 
<body>

<script type="text/javascript">

    parent.check();

</script>

</body> 
</html>
<html> 
<head></head> 
<body>

<script type="text/javascript">

    function check() { 

       alert("hello");

    }

</script>

<iframe id="sidebnrId" name="sidebnr"
src="PATH-ON-SERVER-1/iframeContent/" frameborder="0"
height="500px" width="600px" scrolling="no"></iframe>

</script>

</body> 
</html>
<html> 
<head></head> 
<body>

<script type="text/javascript">

    function check() { 

       alert("hello");

    }

</script>

<iframe id="sidebnrId" name="sidebnr"
src="content-iframe/" frameborder="0"
height="500px" width="600px" scrolling="no"></iframe>

</script>

</body> 
</html>
Options +FollowSymLinks
RewriteEngine On

RewriteBase /

RewriteRule ^content-iframe/$ PATH-ON-SERVER-1/iframeContent/ [R,NC,P]