嵌入式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 相关文章推荐
js 判断checkbox是否选中的实现代码
Nov 23 Javascript
JS模板实现方法
Apr 03 Javascript
jQuery学习笔记之jQuery动画效果
Sep 09 Javascript
JavaScript中number转换成string介绍
Dec 31 Javascript
js库Modernizr的介绍和使用
May 07 Javascript
详解angular中如何监控dom渲染完毕
Jan 03 Javascript
js鼠标跟随运动效果
Mar 11 Javascript
javascript实现滑动解锁功能
Mar 22 Javascript
vue.js移动端tab组件的封装实践实例
Jun 30 Javascript
Vue自定义指令详解
Jul 28 Javascript
浅谈Javascript常用正则表达式应用
Mar 08 Javascript
一百多行代码实现react拖拽hooks
Mar 23 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基础学习笔记
2007/03/18 PHP
腾讯微博提示missing parameter errorcode 102 错误的解决方法
2014/12/22 PHP
PHP魔术方法的使用示例
2015/06/23 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
2016/11/15 PHP
PHP第三方登录―QQ登录实现方法
2017/02/06 PHP
Laravel框架搜索分页功能示例
2019/02/01 PHP
JS是否可以跨文件同时控制多个iframe页面的应用技巧
2007/12/16 Javascript
Javascript 面向对象(二)封装代码
2012/05/23 Javascript
javascript中的startWith和endWith的几种实现方法
2013/05/07 Javascript
javascript-表格排序(降序/反序)实现介绍(附图)
2013/05/30 Javascript
javascript中attribute和property的区别详解
2014/06/05 Javascript
客户端验证用户名和密码的方法详解
2016/06/16 Javascript
jQuery获取元素父节点的方法
2016/06/21 Javascript
解析AngularJS中get请求URL出现的跨域问题
2016/12/01 Javascript
利用HTML5+Socket.io实现摇一摇控制PC端歌曲切换
2017/01/13 Javascript
基于vue.js实现侧边菜单栏
2017/03/20 Javascript
json字符串传到前台input的方法
2018/08/06 Javascript
ES6数组与对象的解构赋值详解
2019/06/14 Javascript
layer.prompt使文本框为空的情况下也能点击确定的方法
2019/09/24 Javascript
json字符串对象转换代码实例
2019/09/28 Javascript
Vue的Options用法说明
2020/08/14 Javascript
请求时token过期自动刷新token操作
2020/09/11 Javascript
[40:13]Ti4 冒泡赛第二天 iG vs NEWBEE 2
2014/07/15 DOTA
使用IronPython把Python脚本集成到.NET程序中的教程
2015/03/31 Python
Python使用gRPC传输协议教程
2018/10/16 Python
基于numpy中数组元素的切片复制方法
2018/11/15 Python
python 2.7 检测一个网页是否能正常访问的方法
2018/12/26 Python
检测tensorflow是否使用gpu进行计算的方式
2020/02/03 Python
Django Admin后台添加数据库视图过程解析
2020/04/01 Python
Python基于gevent实现文件字符串查找器
2020/08/11 Python
最新版 Windows10上安装Python 3.8.5的步骤详解
2020/11/28 Python
css3强大的动画效果animate使用说明及浏览器兼容介绍
2013/01/09 HTML / CSS
.NET里面如何取得当前的屏幕分辨率
2012/12/06 面试题
新年晚会主持词
2014/03/24 职场文书
初中作文评语大全
2014/04/23 职场文书
2014年学校后勤工作总结
2014/12/06 职场文书