我想从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>
当前回答
这是为有需要的人准备的。如果它们使用不同的协议,Ash Clarke的解决方案就不起作用,所以如果您使用SSL,请确保您的iframe也使用SSL,否则将破坏功能。他的解决方案确实适用于域名本身,所以谢谢你。
其他回答
<a onclick="parent.abc();" href="#" >Call Me </a>
看到window.parent
返回当前窗口或子帧的父窗口的引用。
如果窗口没有父属性,则其父属性是对自身的引用。
当一个窗口在<iframe>, <object>,或<frame>中加载时,它的父窗口是包含嵌入该窗口的元素的窗口。
我把这个作为一个单独的答案,因为它与我现有的答案无关。
这个问题最近在从引用子域的iframe访问父节点时再次出现,现有的修复不起作用。
这一次的答案是修改文件。父页面的域和iframe必须相同。这将使同源策略检查误以为它们共存于完全相同的域中(子域被视为不同的主机,同源策略检查失败)。
将以下内容插入到iframe中页面的<head>以匹配父域(根据您的doctype进行调整)。
<script>
document.domain = "mydomain.com";
</script>
请注意,这将在本地主机开发时抛出一个错误,所以使用如下检查来避免错误:
if (!window.location.href.match(/localhost/gi)) {
document.domain = "mydomain.com";
}
Window.postMessage ()
这种方法可以安全地实现跨源通信。
如果你可以访问父页代码,那么任何父方法都可以被调用,任何数据都可以直接从Iframe中传递。这里有一个小例子:
父页面:
if (window.addEventListener) {
window.addEventListener("message", onMessage, false);
}
else if (window.attachEvent) {
window.attachEvent("onmessage", onMessage, false);
}
function onMessage(event) {
// Check sender origin to be trusted
if (event.origin !== "http://example.com") return;
var data = event.data;
if (typeof(window[data.func]) == "function") {
window[data.func].call(null, data.message);
}
}
// Function to be called from iframe
function parentFunc(message) {
alert(message);
}
Iframe代码:
window.parent.postMessage({
'func': 'parentFunc',
'message': 'Message text from iframe.'
}, "*");
// Use target origin instead of *
更新:
安全注意事项:
如果您知道其他窗口的文档应该位于何处,则始终提供特定的targetOrigin,而不是*。未能提供特定的目标会泄露你发送到任何感兴趣的恶意网站的数据(由ZalemCitizen评论)。
引用:
跨文档信息 Window.postMessage () 我可以用
这是为有需要的人准备的。如果它们使用不同的协议,Ash Clarke的解决方案就不起作用,所以如果您使用SSL,请确保您的iframe也使用SSL,否则将破坏功能。他的解决方案确实适用于域名本身,所以谢谢你。
最近,我不得不找出为什么这种方法也不起作用。
你想从子iframe调用的javascript需要在父iframe的头部。如果它在主体中,则脚本在全局作用域中不可用。
<head>
<script>
function abc() {
alert("sss");
}
</script>
</head>
<body>
<iframe id="myFrame">
<a onclick="parent.abc();" href="#">Click Me</a>
</iframe>
</body>
希望这能帮助到再次遇到这个问题的人。