从 iframe 调用父窗口函数

IT技术 javascript iframe onclick
2021-01-30 14:15:12

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

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

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

参见window.parent

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

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

当窗口在、 或 中加载时<iframe>其父窗口是元素嵌入窗口的窗口。<object><frame>

@PrakharMishra 不要混淆。父母意味着父母。
2021-03-10 14:15:12
M 只是想知道这两个alerts 会调用哪一个alert函数或 iframe 的alert函数,以防parent.abc();在 iframe 上调用?
2021-03-12 14:15:12
始终考虑到父文档和 iframe 文档必须通过协议和域名匹配。如果它没有发生,那么您将收到一个安全错误,因为它不允许跨域脚本。
2021-03-13 14:15:12
@a4bike 对于这种情况,window.postMessage()(或window.parent.postMessage())存在。检查@Andrii 答案
2021-03-15 14:15:12

Window.postMessage()

这种方法可以安全地启用cross-origin通信。

如果您有权访问父页面代码,则可以调用任何父方法以及可以直接从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);
}

框架代码:

window.parent.postMessage({
    'func': 'parentFunc',
    'message': 'Message text from iframe.'
}, "*");
// Use target origin instead of *

更新:

安全提示:

*如果您知道其他窗口的文档应位于何处,请始终提供特定的 targetOrigin,NOT 未能提供特定目标会泄露您发送到任何感兴趣的恶意站点的数据(来自ZalemCitizen 的评论)。

参考:

与其他人相比,我更喜欢使用它。特别是因为在跨源文档上使用 iframe 更有意义(尽管程序员确实经常利用 iframe)并且浏览器上对该功能的广泛支持。
2021-03-11 14:15:12
值得提出(来自MDN 网络文档):如果您知道另一个窗口的文档应该位于何处,则始终提供特定的 targetOrigin,而不是 *。未能提供特定目标会泄露您发送给任何感兴趣的恶意站点的数据
2021-03-11 14:15:12
谢谢!我总是需要花一个小时或更长时间回去研究如何用过于复杂、冗长的例子来传递信息。这在 60 秒内起作用。感谢您提供一个简洁明了的例子。
2021-03-24 14:15:12
我喜欢这种方法,答案清晰简洁
2021-04-06 14:15:12

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

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

希望这可以帮助任何再次偶然发现此问题的人。

我刚刚发布了可能是解决您问题的方法。看看另一个答案。
2021-03-12 14:15:12
根据同源策略确定规则(参见:en.wikipedia.org/wiki/...),子域被视为与域的子域不同的主机名。如果您还没有,您可以尝试将 document.domain 设置为子域?
2021-03-12 14:15:12
如果我没记错的话,如果 iframe 的域与父域不同,我将无法按预期工作。抱歉,这不是解决方案,但它可以解释为什么它不起作用。
2021-03-24 14:15:12
是的。我知道这是因为不同的域,但是没有办法解决这个问题吗?
2021-03-30 14:15:12
这篇文章中提到的技术都不适用于 Chrome。对此有任何解决方案吗?
2021-04-08 14:15:12

我已将此作为单独的答案发布,因为它与我现有的答案无关。

这个问题最近再次出现,因为从引用子域的 iframe 访问父级,并且现有的修复程序不起作用。

这次的答案是将父页面的document.domain和iframe修改为相同。这将使同源策略检查误认为它们在完全相同的域中共存(子域被视为不同的主机并且未通过同源策略检查)。

将以下内容插入<head>iframe 中的页面以匹配父域(根据您的文档类型进行调整)。

<script>
    document.domain = "mydomain.com";
</script>

请注意,这会在 localhost 开发中引发错误,因此请使用如下检查来避免该错误:

if (!window.location.href.match(/localhost/gi)) {
    document.domain = "mydomain.com";
} 
在本地主机中测试这个怎么样?任何解决方法?
2021-03-10 14:15:12
是的,没错,我在这里打错了字:“iframe 中的页面要相同。” 应该是“页面和 iframe 要相同”。..... 谢谢!
2021-03-16 14:15:12
值得注意的是(至少在谷歌浏览器中),父母和孩子都必须设置 document.domain,即使其中一个已经是“正确的”!示例:Parent is example.comiframe is abc.example.com,那么 parent 和 iframe 都必须调用document.domain = "example.com"
2021-03-18 14:15:12
请参阅:“请注意,这将在本地主机开发中引发错误,因此请使用如下检查以避免错误”
2021-03-27 14:15:12
对于 if() 为什么不直接使用 if(document.domain != "mydomain.com" ?另外,我很困惑,<script> 是在父窗口还是 iFrame 中?另外,设置iFrame 中的 document.domain 生成“无法在“文档”上设置“域”属性:“localhost”不是“sc-localhost”的后缀。
2021-03-27 14:15:12

您可以使用

window.top

请参阅以下内容。

<head>
    <script>
    function abc() {
        alert("sss");
    }
    </script>
</head>
<body>
    <iframe id="myFrame">
        <a onclick="window.top.abc();" href="#">Click Me</a>
    </iframe>
</body>
@Vinothkumar,请提出一个问题,这是调用 "window.top.abc()" 与仅调用 "abc()" 之间的区别,提前致谢 =)
2021-03-21 14:15:12
@Zilev av 该线程的全部意义在于从子 iframe 调用父文档中的函数。这就是区别。调用abc()在 iframefunction abc()中声明而不是在父页面上声明时才有效脱离 iframe 进入父文档。window.top.abc()
2021-03-27 14:15:12
当试图调用 parent.custom_function(); 从 iframe 不起作用你可能会发现 window.top.custom_function(); 将工作。出于某种奇怪的原因对我有用。我在父窗口上的 javascripts 都嵌入在页脚中,我在某处读到在页脚中包含 javascript 文件会导致问题 parent.custom_function() 不起作用。
2021-03-31 14:15:12