我想从iframe调用父窗口JavaScript函数。
<script>
function abc()
{
alert("sss");
}
</script>
<iframe id="myFrame">
<a onclick="abc();" href="#">Call Me</a>
</iframe>
我想从iframe调用父窗口JavaScript函数。
<script>
function abc()
{
alert("sss");
}
</script>
<iframe id="myFrame">
<a onclick="abc();" href="#">Call Me</a>
</iframe>
当前回答
出于安全考虑,Parent.abc()只能在同一域上工作。我试过这个方法,我的效果很好。
<head>
<script>
function abc() {
alert("sss");
}
// window of the iframe
var innerWindow = document.getElementById('myFrame').contentWindow;
innerWindow.abc= abc;
</script>
</head>
<body>
<iframe id="myFrame">
<a onclick="abc();" href="#">Click Me</a>
</iframe>
</body>
希望这能有所帮助。:)
其他回答
这是为有需要的人准备的。如果它们使用不同的协议,Ash Clarke的解决方案就不起作用,所以如果您使用SSL,请确保您的iframe也使用SSL,否则将破坏功能。他的解决方案确实适用于域名本身,所以谢谢你。
使用Firefox和Chrome浏览器,您可以使用:
<a href="whatever" target="_parent" onclick="myfunction()">
如果myfunction同时出现在iframe和parent中,父函数将被调用。
一个插件助手的要点,允许父窗口调用子iframe窗口函数,反之亦然,但所有的调用都是异步的。
https://gist.github.com/clinuxrulz/77f341832c6025bf10f0b183ee85e072
这也可以跨原点工作,但只能调用从父窗口导出到iframe的函数,并且父窗口只能调用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.
我把这个作为一个单独的答案,因为它与我现有的答案无关。
这个问题最近在从引用子域的iframe访问父节点时再次出现,现有的修复不起作用。
这一次的答案是修改文件。父页面的域和iframe必须相同。这将使同源策略检查误以为它们共存于完全相同的域中(子域被视为不同的主机,同源策略检查失败)。
将以下内容插入到iframe中页面的<head>以匹配父域(根据您的doctype进行调整)。
<script>
document.domain = "mydomain.com";
</script>
请注意,这将在本地主机开发时抛出一个错误,所以使用如下检查来避免错误:
if (!window.location.href.match(/localhost/gi)) {
document.domain = "mydomain.com";
}