Invoking JavaScript code in an iframe from the parent page
基本上,我在页面中嵌入了一个
现在,相反的情况很简单,因为您只需要调用
请注意,我的问题不是更改
假设您的iframe的id是"targetframe",您要调用的函数是
1 | document.getElementById('targetFrame').contentWindow.targetFunction(); |
您也可以使用
1 2 | // this option does not work in most of latest versions of chrome and Firefox window.frames[0].frameElement.contentWindow.targetFunction(); |
这里有一些怪癖需要注意。
你也可以尝试使用
返回窗口的已弃用/transitional。(
完全可能是子iframe尚未加载,或者是其他错误导致无法访问。您可能会发现逆转通信流更容易:也就是说,当子iframe完成加载并准备被调用时,让它通知它的
可以从
在以下情况下,呼叫将失败:
任何解决这一限制的方法都是非常不安全的。
例如,假设我注册了域名superwiningcompute.com并发送了指向人们电子邮件的链接。当他们加载主页时,我可以在里面隐藏一些EDCX1 9个s,读取他们的脸谱网feed,查看最近的亚马逊或PayPal交易,或者——如果他们使用的服务没有实现足够的安全性——把钱从他们的账户中转移出去。这就是为什么JavaScript被限制在相同的域和相同的协议中。
在iframe中,将函数公开给window对象:
1 2 3 | window.myFunction = function(args) { doStuff(); } |
若要从父页访问,请使用:
1 2 | var iframe = document.getElementById("iframeId"); iframe.contentWindow.myFunction(args); |
(P)如果《国际财务报告准则》和其中所载的文件是关于不同领域的,则所采用的方法可能不起作用,但有一个解决办法:(p)(P)For example,if document A contains an IFRAME element that contains document B,and script in document a calls postmessage(……)on the window object of document B,they a message event will be fired on that object,marked as originating from the window of document A.The script in document a might look like:(p)字母名称(P)为了记录可能发生的收入事件,该脚本将使用额外的事件()(或类似的机制)。For example,the script in document B might look like:(p)字母名称(P)This script first checks the domain is the expected domain,and they look at the message,which it either displays to the user,or responds to by sending a message back to the document which sent the message in the first place.(p)(P)Via http://dev.w3.org/html5/postmsg/.35Web-Messaging(p)
只是为了记录,我今天遇到了同样的问题,但这次页面是嵌入在一个对象中的,而不是一个iframe(因为它是一个xhtml 1.1文档)。以下是它如何处理对象:
1 2 3 4 5 | document .getElementById('targetFrame') .contentDocument .defaultView .targetFunction(); |
(不好意思出现难看的断线,不适合一行)
iframe应该在
1 | frames['iframeid'].method(); |
Qurksmode对此有过报道。
由于该页面现在已被破坏,并且只能通过archive.org访问,所以我在这里复制了它:
iFrAMES
在本页中,我简要概述了如何从其所在的页面访问iframes。不足为奇,有一些浏览器方面的考虑。
iframe是一个内联框架,尽管它包含一个完全独立的带有自己URL的页面,但它仍然被放置在另一个HTML页面中。这为网页设计提供了很好的可能性。问题是访问iframe,例如将新页面加载到iframe中。本页介绍如何操作。
框架还是物体?
基本问题是iframe是被视为框架还是对象。
- 如"框架介绍"页面中所述,如果使用框架,浏览器将为您创建框架层次结构(
top.frames[1].frames[2] 等)。iframe是否适合此框架层次结构? - 或者浏览器是否将iframe视为另一个对象,一个恰好具有src属性的对象?在这种情况下,我们必须使用标准的DOM调用(如
document.getElementById('theiframe')) 来访问它。一般来说,浏览器允许对"real"(硬编码)iframe的两个视图,但生成的iframe不能作为帧访问。
名称属性
最重要的规则是为您创建的任何iframe提供
1 2 3 | <iframe src="iframe_page1.html" id="testiframe" name="testiframe"></iframe> |
大多数浏览器都需要
通路
您可以将iframe作为对象访问并更改其
document.getElementByID('iframe_id').src='newpage.html';frames['iframe_name'].location.href='newpage.html';框架语法稍好一点,因为Opera6支持它,但不支持对象语法。
访问iframe
因此,要获得完整的跨浏览器体验,您应该为iframe命名并使用
1 | frames['testiframe'].location.href |
语法。据我所知,这总是有效的。
访问文档
如果您使用
生成的iframes
但是,当通过W3C DOM生成iframe时,iframe不会立即输入到
链接的
缺少
iframes中的文本大小
一个好奇的探险家6唯一的错误:
通过"视图"菜单更改文本大小时,iframes中的文本大小将正确更改。但是,此浏览器不会更改原始文本中的换行符,因此部分文本可能变为不可见,或者换行符可能在换行符仍可以容纳另一个单词时出现。
(P)我找到了一个优雅的解决方案(p)(P)As you said,it's fairly easy to execute code located on the parent document.And that's the base of my code,do to just the opposite.(p)(P)When my iframe loads,I call a function located on the parent document,passing a s an argument a reference to a local function,located in the IFRAME's document.The parent document now has a direct access to the IFRAME's function thru this reference.(p)(P)例如:(p)(P)On the parent:(p)字母名称(P)On the IFRAME:(p)字母名称(P)When the IFRAME loads,it will call parent.tunnel(Yourfunctionreference),which will execute the function received in parameter.(p)(P)这是很简单的,没有经过处理与所有非标准方法从各种布劳斯蛋糕。(p)
(P)Some of these answers don't address the cors issue,or don't make it obvious where you place the code snippets to make the communication possible.(p)(P)这是一个具体的例子。Say I want to clik a button on the parent page,and have that do some inside the IFRAME.这就是我想做的。(p)(P)Parent U Frame.html(p)字母名称(P)Ifme UU page.html(p)字母名称(P)To go the other direction(click button inside ifme to call method outside IFRAME)just switch where the code snippet live,and change this:(p)字母名称(P)To this:(p)字母名称
继续Joelanair的回答:
为了更稳健性,使用如下:
1 2 3 4 5 6 7 8 9 10 | var el = document.getElementById('targetFrame'); if(el.contentWindow) { el.contentWindow.targetFunction(); } else if(el.contentDocument) { el.contentDocument.targetFunction(); } |
像魅力一样工作:)
(P)Folowing Nitin Bansal's Answer(p)(P)And for even more strongness:(p)字母名称(P)and(p)字母名称
1 2 3 | $("#myframe").load(function() { alert("loaded"); }); |
同样的事情,但是更简单的方法是如何在iframe中从页面刷新父页面。只需调用父页面的函数来调用javascript函数来重新加载页面:
1 | window.location.reload(); |
或者直接从iframe中的页面执行此操作:
1 | window.parent.location.reload(); |
两者都有效。
(P)If we want call the parent page javascript function from the IFRAME which generated from the coding.Ex Shadowbox or Lightbox(p)(P)Window.parent.targetfunction();(p)
(P)Try just EDOCX1音标0(p)
(P)Use following to call function of a frame in parent page(p)字母名称