我想从iframe调用父窗口JavaScript函数。

<script>
    function abc()
    {
        alert("sss");
    }
</script>

<iframe id="myFrame">
    <a onclick="abc();" href="#">Call Me</a>
</iframe>

当前回答

Ash Clarke为子域名提供的解决方案很好,但请注意,您需要包括文档。域名= "mydomain.com";在iframe页眉和父页眉中,如链接同源策略检查中所述

An important extension to the same origin policy implemented for JavaScript DOM access (but not for most of the other flavors of same-origin checks) is that two sites sharing a common top-level domain may opt to communicate despite failing the "same host" check by mutually setting their respective document.domain DOM property to the same qualified, right-hand fragment of their current host name. For example, if http://en.example.com/ and http://fr.example.com/ both set document.domain to "example.com", they would be from that point on considered same-origin for the purpose of DOM manipulation.

其他回答

这是为有需要的人准备的。如果它们使用不同的协议,Ash Clarke的解决方案就不起作用,所以如果您使用SSL,请确保您的iframe也使用SSL,否则将破坏功能。他的解决方案确实适用于域名本身,所以谢谢你。

Ash Clarke为子域名提供的解决方案很好,但请注意,您需要包括文档。域名= "mydomain.com";在iframe页眉和父页眉中,如链接同源策略检查中所述

An important extension to the same origin policy implemented for JavaScript DOM access (but not for most of the other flavors of same-origin checks) is that two sites sharing a common top-level domain may opt to communicate despite failing the "same host" check by mutually setting their respective document.domain DOM property to the same qualified, right-hand fragment of their current host name. For example, if http://en.example.com/ and http://fr.example.com/ both set document.domain to "example.com", they would be from that point on considered same-origin for the purpose of DOM manipulation.

一个插件助手的要点,允许父窗口调用子iframe窗口函数,反之亦然,但所有的调用都是异步的。

https://gist.github.com/clinuxrulz/77f341832c6025bf10f0b183ee85e072

这也可以跨原点工作,但只能调用从父窗口导出到iframe的函数,并且父窗口只能调用iframe导出的函数。

虽然其中一些解决方案可能有效,但没有一个符合最佳实践。许多分配全局变量,您可能会发现自己调用多个父变量或函数,导致混乱、易受攻击的命名空间。

为了避免这种情况,可以使用模块模式。在父窗口:

var myThing = {
    var i = 0;
    myFunction : function () {
        // do something
    }
};

var newThing = Object.create(myThing);

然后,在iframe中:

function myIframeFunction () {
    parent.myThing.myFunction();
    alert(parent.myThing.i);
};

这类似于Crockford的开创性文本“Javascript: the Good Parts”的继承章节中描述的模式。你也可以在w3的页面上了解更多Javascript的最佳实践。https://www.w3.org/wiki/JavaScript_best_practices#Avoid_globals

<a onclick="parent.abc();" href="#" >Call Me </a>

看到window.parent

返回当前窗口或子帧的父窗口的引用。

如果窗口没有父属性,则其父属性是对自身的引用。

当一个窗口在<iframe>, <object>,或<frame>中加载时,它的父窗口是包含嵌入该窗口的元素的窗口。