【问题标题】:Call parent Javascript function from inside an iframe从 iframe 内部调用父 Javascript 函数
【发布时间】:2011-10-19 06:54:40
【问题描述】:

我有一个 iframe(在我的域中),该 iframe 有一个文件 iframe.js

我的父文档有一个文件parent.js

我需要从iframe.js 中的函数调用parent.js 中的函数。

我尝试做window.parent.myfunction() 这个函数在parent.js 文件中。

但是,它没有用。只有当我将函数放在父页面上(我的意思是在 HTML 中)时,它才会起作用。

知道如何让它工作吗?

【问题讨论】:

  • 请提供一些sn-ps。如何声明方法和 iframe 星座。

标签: javascript jquery iframe parent


【解决方案1】:

试试parent.myfunction()。还要 100% 确保 parent.js 包含在您的父文档中。

【讨论】:

  • 这是否适用于所有浏览器并且是 javascript 标准的一部分?
  • 已在 IE、Chrome 和 FF 中测试。不确定它是否写入标准。
  • 一年多后仍然在帮助人们。谢谢。
  • @Fallenreaper - NP,这就是这个社区的意义所在。很自豪能成为其中的一员。
  • 使用 parent.function(),在 IE 中对我不起作用。我通过在前面使用 window.top 解决了这个问题。 "window.top.function();"
【解决方案2】:

我知道这是一个老问题,但如果接受的答案不起作用(它对我不起作用),您可以在 parent.js 中执行此操作

window.myfunction = function () {
   alert("I was called from a child iframe");
}

现在您可以像最初想要的那样从 iframe 调用 myfunction()

window.parent.myfunction(); 

【讨论】:

  • 好招!这实际上有效。我不确定“window.myfunction = function()”和“function myfunction()”有什么区别。有什么想法吗?
【解决方案3】:

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 parentFuncName(message) {
    alert(message);
}

iframe 代码:

window.parent.postMessage({
    'func': 'parentFuncName',
    'message': 'Message text from iframe.'
}, "*");

参考资料:

【讨论】:

  • 1up 提到跨域和一个被广泛接受的解决方案
  • 这是最伟大的编码方法之一
  • 它非常适合在您为其他域上的页面打开的 iframe 之间进行通信,因为它是跨域通信
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-05
  • 2010-12-12
  • 2012-03-09
  • 1970-01-01
  • 2017-04-28
  • 2011-01-10
相关资源
最近更新 更多