嵌入式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 相关文章推荐
Prototype PeriodicalExecuter对象 学习
Jul 19 Javascript
jcrop基本参数一览
Jul 16 Javascript
JS表的模拟方法
Feb 05 Javascript
推荐阅读的js快速判断IE浏览器(兼容IE10与IE11)
Dec 13 Javascript
js模糊查询实例分享
Dec 26 Javascript
完美解决jQuery的hover事件在IE中不停闪动的问题
Feb 10 Javascript
jQuery图片瀑布流的简单实现代码
Mar 15 Javascript
jquery实现tab选项卡切换效果(悬停、下方横线动画位移)
May 05 jQuery
Node.js assert断言原理与用法分析
Jan 04 Javascript
laydate只显示时分 不显示秒的功能实现方法
Sep 28 Javascript
微信小程序实现canvas分享朋友圈海报
Jun 21 Javascript
vue3.0自定义指令(drectives)知识点总结
Dec 27 Vue.js
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+DBM的同学录程序(1)
2006/10/09 PHP
php下将XML转换为数组
2010/01/01 PHP
探讨:array2xml和xml2array以及xml与array的互相转化
2013/06/24 PHP
PHP基于反射机制实现插件的可插拔设计详解
2016/11/10 PHP
PHP多进程编程实例详解
2017/07/19 PHP
PHP实现重载的常用方法实例详解
2017/10/18 PHP
基于PHP实现微信小程序客服消息功能
2019/08/12 PHP
jWiard 基于JQuery的强大的向导控件介绍
2011/10/28 Javascript
jquery+Jscex打造游戏力度条
2020/09/12 Javascript
基于JavaScript实现验证码功能
2017/04/01 Javascript
用JavaScript做简易的购物车的代码示例
2017/10/20 Javascript
element UI upload组件上传附件格式限制方法
2018/09/04 Javascript
JavaScript和TypeScript中的void的具体使用
2019/09/12 Javascript
Node.js创建一个Express服务的方法详解
2020/01/06 Javascript
整理 node-sass 安装失败的原因及解决办法(小结)
2020/02/19 Javascript
Vue+Element UI 树形控件整合下拉功能菜单(tree + dropdown +input)
2020/08/28 Javascript
原生js实现自定义滚动条组件
2021/01/20 Javascript
[03:36]DOTA2完美大师赛coL战队趣味视频——我演你猜
2017/11/23 DOTA
[01:02:38]DOTA2-DPC中国联赛定级赛 LBZS vs Phoenix BO3第二场 1月10日
2021/03/11 DOTA
Python使用函数默认值实现函数静态变量的方法
2014/08/18 Python
Python常用的内置序列结构(列表、元组、字典)学习笔记
2016/07/08 Python
详解使用python的logging模块在stdout输出的两种方法
2017/05/17 Python
django开发教程之利用缓存文件进行页面缓存的方法
2017/11/10 Python
python实现用户答题功能
2018/01/17 Python
python实现监控某个服务 服务崩溃即发送邮件报告
2018/06/21 Python
python datetime处理时间小结
2020/04/16 Python
Python实现ElGamal加密算法的示例代码
2020/06/19 Python
美国领先的在线邮轮旅游公司:CruiseDirect
2018/06/07 全球购物
ZINVO手表官网:男士和女士手表
2019/03/10 全球购物
理工大学毕业生自荐信
2013/11/01 职场文书
毕业生自我鉴定
2013/11/05 职场文书
2013年学期结束动员演讲稿
2014/01/07 职场文书
大学共青团员个人自我评价
2014/04/16 职场文书
环保建议书400字
2014/05/14 职场文书
小学生运动会通讯稿
2014/09/23 职场文书
浅谈自定义校验注解ConstraintValidator
2021/06/30 Java/Android