开发者问题收集

从 iframe 调用父窗口函数

2010-01-29
518967

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

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

<iframe id="myFrame">
    <a onclick="abc();" href="#">Call Me</a>
</iframe>
3个回答
<a onclick="parent.abc();" href="#" >Call Me </a>

请参阅 window.parent

返回对当前窗口或子框架的父级的引用。

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

当窗口在 <iframe><object><frame> 中加载时,其父级是包含嵌入窗口的元素的窗口。

rahul
2010-01-29

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 的评论)。

参考资料:

Andrii Verbytskyi
2017-01-10

我最近也不得不找出为什么这个方法不起作用。

您想要从子 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>

希望这可以帮助任何再次遇到此问题的人。

Ash Clarke
2011-09-09