嵌入式iframe子页面与父页面js通信的方法


Posted in Javascript onJanuary 20, 2015

本文实例讲述了嵌入式iframe子页面与父页面js通信的方法。分享给大家供大家参考。具体分析如下:

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所链接的是外部页面,因为安全机制则不能使用同域名下的通信方式了。

父页面向子页面传递数据

实现的技巧就是利用 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 对象的引用,这样我们就能直接条用父页面中方法啦。

希望本文所述对大家的javascript程序设计有所帮助。

Javascript 相关文章推荐
jquery 1.4.2发布!主要是性能与API
Feb 25 Javascript
在JavaScript中使用timer示例
May 08 Javascript
JavaScript Function函数类型介绍
Apr 08 Javascript
javascript控制台详解
Jun 25 Javascript
用JavaScript实现PHP的urlencode与urldecode函数
Aug 13 Javascript
分享我的jquery实现下拉菜单心的
Nov 29 Javascript
前端程序员必须知道的高性能Javascript知识
Aug 24 Javascript
PHP 实现一种多文件上传的方法
Sep 20 Javascript
JavaScript实现邮箱后缀提示功能的示例代码
Dec 13 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变rgba的a值实现)
Jan 24 Javascript
qrcode生成二维码微信长按无法识别问题的解决
Apr 04 Javascript
DWR内存兼容及无法调用问题解决方案
Oct 16 Javascript
javascript浏览器窗口之间传递数据的方法
Jan 20 #Javascript
用队列模拟jquery的动画算法实例
Jan 20 #Javascript
jQuery 处理页面的事件详解
Jan 20 #Javascript
DOM 事件流详解
Jan 20 #Javascript
jQuery链使用指南
Jan 20 #Javascript
使用jQuery管理选择结果
Jan 20 #Javascript
javascript动态修改Li节点值的方法
Jan 20 #Javascript
You might like
php数组对百万数据进行排除重复数据的实现代码
2010/06/08 PHP
解析php根据ip查询所在地区(非常有用,赶集网就用到)
2013/07/01 PHP
PHP读取文件内容后清空文件示例代码
2014/03/18 PHP
Firebug入门指南(Firefox浏览器)
2010/08/21 Javascript
自己整理的一个javascript日期处理函数
2010/10/16 Javascript
jquery.bgiframe.js在IE9下提示INVALID_CHARACTER_ERR错误
2013/01/11 Javascript
一个JavaScript变量声明的知识点
2013/10/28 Javascript
js实现数组去重、判断数组以及对象中的内容是否相同
2013/11/29 Javascript
如何获取网站icon有哪些可行的方法
2014/06/05 Javascript
JavaScript实现对下拉列表值进行排序的方法
2015/07/15 Javascript
jQuery中的一些常见方法小结(推荐)
2016/06/13 Javascript
Three.js学习之正交投影照相机
2016/08/01 Javascript
详解AngularJS中ng-src指令的使用
2016/09/07 Javascript
微信小程序 倒计时组件实现代码
2016/10/24 Javascript
node.js+jQuery实现用户登录注册AJAX交互
2017/04/28 jQuery
详解vue slot插槽的使用方法
2017/06/13 Javascript
JS仿淘宝搜索框用户输入事件的实现
2017/06/19 Javascript
Vue + Vue-router 同名路由切换数据不更新的方法
2017/11/20 Javascript
微信小程序和H5页面间相互跳转代码实例
2019/09/19 Javascript
vue搜索页开发实例代码详解(热门搜索,历史搜索,淘宝接口演示)
2020/04/11 Javascript
JS端基于download.js实现图片、视频时直接下载而不是打开预览
2020/05/09 Javascript
python中的代码编码格式转换问题
2015/06/10 Python
对numpy 数组和矩阵的乘法的进一步理解
2018/04/04 Python
numpy返回array中元素的index方法
2018/06/27 Python
如何使用Python自动控制windows桌面
2019/07/11 Python
Python3 pickle对象串行化代码实例解析
2020/03/23 Python
Python小白不正确的使用类变量实例
2020/05/29 Python
利用Python pandas对Excel进行合并的方法示例
2020/11/04 Python
python 检测图片是否有马赛克
2020/12/01 Python
Fenty Beauty官网:蕾哈娜创立的美妆品牌
2021/01/07 全球购物
一套PHP的笔试题
2013/05/31 面试题
房地产员工找工作的自我评价
2013/11/15 职场文书
行政文秘岗位职责范本
2014/02/10 职场文书
初中学校军训方案
2014/05/09 职场文书
我的中国梦口号
2014/06/16 职场文书
就业协议书范本
2014/10/08 职场文书