iframe框架中的页面与主页面之间的通信方式根据iframe中src属性是同域链接还是跨域链接,有明显不同的通信方式,同域下的数据交换和DOM元素互访就简单的多了,而跨域的则需要一些巧妙的方式来实现通信。
一、同域下父子页面的通信
父页面 parent.html
- <html>
-
<head>
-
<script type="text/javascript">
-
- function say() {
-
alert("parent.html------>I'm at parent.html");
- }
-
- function callChild()
- {
- //document.frames["myFrame"].window.say();//只适用于ie浏览器
- myFrame.window.say();
- myFrame.window.document.getElementById("button").value="我变了";
- }
-
</script>
-
</head>
-
-
<body>
-
<input type=button value="调用child.html中的函数say()" onclick="callChild()">
-
<iframe name="myFrame" src="child.html"></iframe>
-
</body>
-
</html>
子页面 child.html
- <html>
-
<head>
-
<script type="text/javascript">
-
- function say()
- {
-
alert("child.html--->I'm at child.html");
- }
-
- function callParent() {
- parent.say();
- parent.window.document.getElementsByName("myFrame")[0].style.height="100px";
- }
-
</script>
-
</head>
-
<body>
-
<input id="button" type=button value="调用parent.html中的say()函数" onclick="callParent()">
-
</body>
-
</html>
方法调用
如上面示例所示父页面调用子页面的方法可通过:FrameName.window.childMethod();(这种方式兼容各种浏览器)
子页面调用父页面的方法:parent.window.parentMethod();
DOM元素访问
根据FrameName.window得到了子窗口对象之后,再访问其中的DOM元素就跟访问同一页面中的DOM元素没区别了都可以通过document.getElementById(),document.getElementsByName()[index]。如:parent.window.document.getElementsByName("myFrame")[0],myFrame.window.document.getElementById("button")其中的window都是可以省略的。
注意事项
要确保在Iframe加载完成后再进行操作,如果Iframe还未加载完成就开始调用里面的方法或变量,无疑会产生错误。判断Iframe是否加载完毕有两种方法:
1.在Iframe上用onload事件;
2.用document.readyState=="complete"来判断
二、跨域父子页面通信方法
如果iframe所链接的是外部页面,因为安全机制则不能使用同域名下的通信方式了。在《SNS平台与第三方APP的JS通信实现》中提供易于且具有通用性的通信方式。
父页面向子页面传递数据
实现的技巧就是利用 location 对象的 hash 值,通过它传递通信数据,我们只需要在父页面设置 iframe的 src 后面多加个#data 字符串(data就是你要传递的数据),然后在 子页面 中通过某种方式能即时的获取到这儿 data 就可以了,其实常用的一种方式就是:
1. 在 子页面 中通过 setInterval 方法设置定时器, 监听 location.href 的变化即可获得上面的 data 信息
2. 然后 子页面 就能根据这个 data 信息进行相应的逻辑处理。
子页面向父页面传递数据
实现的技巧就是利用一个代理 Iframe C,它嵌入到 子页面中,并且和父页面必须保持是同域,然后我们通过它充分利用上面第一种通信方式的实现原理就能把 子页面的数据传递给 iframeC,接下来的问题就是怎么让iframeC把数据传递给主页面A ,因为,iframeC 和主页面是同域的,所以它们之间传递数据就变得简单多了,属于同域名下的通信问题了,如前面所讨论的,在这里的可以使用一个经常使用的属性 window.top (也可以使用window.parent.parent),它返回对载入浏览器得最顶层 window 对象的引用,这样我们就能直接条用父页面中方法啦。
参考:
1.《SNS平台与第三方APP的JS通信实现》作者:Springwang。
2.iframe父子窗口间js方法调用 作者:moreorless。
3.IFrame问题汇总作者:dengwf
转自:http://www.cnblogs.com/ljhero/archive/2011/07/09/2101540.html
分享到:
相关推荐
本文实例讲述了嵌入式iframe子页面与父页面js通信的方法。分享给大家供大家参考。具体分析如下: iframe框架中的页面与主页面之间的通信方式根据iframe中src属性是同域链接还是跨域链接,有明显不同的通信方式,同域...
首先,我们可以通过JavaScript的DOM(Document Object Model)接口来实现`iframe`与父页面之间的通信。在`iframe`内的页面,我们可以使用`parent`对象来访问父页面的全局变量和函数。例如,如果在`iframe`内想要调用...
`iframe`与父页面之间的通信是前端开发中的一个重要知识点,它涉及到跨域安全策略、JavaScript编程以及DOM操作等多个方面。 一、`iframe`的基本使用 在HTML中,`<iframe>`标签用于插入一个内联框架。基本语法如下:...
"同一父页面的一个子页面刷新另一个子页面"这个话题聚焦于如何在不重新加载整个父页面的情况下,仅刷新其中一个`iframe`内的子页面。这种技术在提升用户体验、节省网络资源等方面具有显著优势,尤其是在需要动态更新...
另外,`iframe.js`文件可能是用来辅助实现上述功能的JavaScript代码,比如包含了一些自定义的`resizeIframe`函数或跨域通信的逻辑。在实际项目中,我们需要结合这个文件的内容来完善`iframe`高度自适应的实现。 ...
在多页面交互的场景下,`iframe`中的子页面与父页面以及与其他兄弟`iframe`之间的通信就显得尤为重要。本文将详细讲解如何实现`iframe`兄弟页面之间的相互调用。 首先,理解`iframe`的结构是关键。一个`iframe`元素...
当涉及到跨框架通信时,即从`iframe`子页面与父页面交互,就需要了解如何获取和操作彼此的元素。本文将详细讲解在`iframe`子页面获取父页面元素的方法。 首先,我们需要明白`iframe`中的`window`对象和`document`...
它允许开发者将不同的页面或应用整合到同一个页面上,提供了一种灵活的布局和内容分发方式。然而,由于浏览器的实现差异,获取`iframe`中的子网页高度可能会遇到一些挑战,特别是在处理不同浏览器兼容性问题时。本篇...
在多页面应用或者嵌入式框架(如iframe)中,经常需要进行父页面与子页面之间的数据交换。下面将详细介绍如何在不同场景下使用JS实现这种传值。 一、子页面是父页面通过`window.open`弹出的情况 当子页面是通过`...
而关于`iframe`与父窗口之间的通信,是Web开发中的一个重要概念,它允许两个独立的上下文之间进行数据交换,即`iframe`内容与包含它的父页面进行互动。 在`iframe`和父窗口通信的过程中,主要涉及以下几个知识点: ...
当涉及到Iframe时,有时我们需要在父页面与子页面之间进行交互,如调用各自的方法或访问数据。本文将详细探讨如何实现Iframe父页面与子页面之间的相互调用。 首先,理解window对象是关键。在浏览器中,每一个HTML...
当`iframe`和父页面同源时,可以使用`window.parent`访问父窗口,而`window.frames`可以访问子`iframe`。例如: ```javascript // 父页面 window.frames['myIframe'].document.getElementById('targetElement')...
此外,需要注意的是,`iframe`需要与父页面在同一域名下或者都支持CORS跨域请求,否则JavaScript代码可能无法访问到父页面的DOM元素。如果`iframe`加载的页面和父页面不在同一个域,那么你需要寻找其他解决方案,...
下面将详细探讨如何使用Iframe实现TAB页面切换,以及与之相关的知识点。 首先,理解Iframe的基本结构: ```html <iframe src="http://example.com" width="400" height="300"></iframe> ``` `src`属性指定要加载的...
然而,需要注意的是,由于同源策略的限制,如果`iframe`加载的页面与父页面不在同一个域下,我们无法直接访问`iframe`的内容。在这种情况下,可以尝试使用`postMessage`和`message`事件进行跨域通信,让`iframe`内部...
3. **跨域通信**:如果`iframe`加载的页面与父页面不同源,我们可以利用`window.postMessage`来进行通信。`child.html`中的代码发送消息: ```javascript window.parent.postMessage({action: 'resize', height: ...
- **通信机制**:使用`postMessage` API可以实现主页面与`<iframe>`之间跨域的安全通信。 - **性能优化**:对于动态加载的`<iframe>`内容,可以考虑使用懒加载技术减少页面的初始加载时间。 综上所述,通过使用`...
综上所述,`postMessage`是JavaScript解决跨域通信,尤其是涉及iframe页面的关键技术。正确理解和使用它,能够帮助开发者构建更复杂、更安全的Web应用。在实际项目中,结合描述中提到的3_静态页面测试跨域_post...
3. FrameMessage.js:这个文件很可能是用于处理iframe与主页面之间消息传递的JavaScript代码,它可能会利用`window.postMessage` API来实现实时通信。 4. FrameMessage.class.php:这是PHP类文件,可能包含了在...