基本上,我在页面中嵌入了一个iframe,该iframe有一些需要从父页面调用的JavaScript例程。
现在相反的是相当简单,因为你只需要调用parent.functionName(),但不幸的是,我需要的恰恰相反。
请注意,我的问题不是改变iframe的源URL,而是调用iframe中定义的函数。
基本上,我在页面中嵌入了一个iframe,该iframe有一些需要从父页面调用的JavaScript例程。
现在相反的是相当简单,因为你只需要调用parent.functionName(),但不幸的是,我需要的恰恰相反。
请注意,我的问题不是改变iframe的源URL,而是调用iframe中定义的函数。
当前回答
在IFRAME中,让你的函数对窗口对象是公共的:
window.myFunction = function(args) {
doStuff();
}
从父页面访问,使用这个:
var iframe = document.getElementById("iframeId");
iframe.contentWindow.myFunction(args);
其他回答
使用following调用父页中帧的函数
parent.document.getElementById('frameid').contentWindow.somefunction()
如果iFrame的目标和包含的文档在不同的域中,之前发布的方法可能不起作用,但有一个解决方案:
例如,如果文档A包含一个包含文档B的iframe元素,并且文档A中的脚本在文档B的Window对象上调用postMessage(),那么消息事件将在该对象上触发,标记为源自文档A的Window。文档A中的脚本可能如下所示:
var o = document.getElementsByTagName('iframe')[0];
o.contentWindow.postMessage('Hello world', 'http://b.example.org/');
要为传入事件注册事件处理程序,脚本将使用addEventListener()(或类似的机制)。例如,文档B中的脚本可能是这样的:
window.addEventListener('message', receiver, false);
function receiver(e) {
if (e.origin == 'http://example.com') {
if (e.data == 'Hello world') {
e.source.postMessage('Hello', e.origin);
} else {
alert(e.data);
}
}
}
该脚本首先检查域是否是预期的域,然后查看消息,它可以将消息显示给用户,也可以通过将消息发送回最初发送消息的文档来进行响应。
通过http://dev.w3.org/html5/postmsg/ 49岁
从iframe调用父JS函数是可能的,但只有当父JS函数和加载在iframe中的页面都来自同一个域,即example.com,并且都使用相同的协议,即都在http://或https://.上
在以下情况下调用将失败:
父页面和iframe页面来自不同的域。 他们使用不同的协议,一个在http://上,另一个在https://.上
任何解决这个限制的方法都是非常不安全的。
例如,假设我注册了域名superwinningcontest。例如,发送链接到人们的电子邮件。当他们加载主页时,我可以在那里隐藏一些iframe,阅读他们的Facebook动态,查看最近的亚马逊或贝宝交易,或者(如果他们使用的服务没有实现足够的安全性)从他们的账户转钱。这就是JavaScript仅限于同一域和同一协议的原因。
IFRAME应该在frames[]集合中。使用像这样的东西
frames['iframeid'].method();
为了记录,我今天遇到了同样的问题,但这次页面嵌入在对象中,而不是iframe(因为它是XHTML 1.1文档)。下面是它如何处理对象:
document
.getElementById('targetFrame')
.contentDocument
.defaultView
.targetFunction();
(对不起,很难看的换行,不适合单行)