iframe子页面与父页面在同域或不同域下的js通信


Posted in Javascript onMay 07, 2014

iframe子页面与父页面通信根据iframe中src属性是同域链接还是跨域链接,通信方式也不同。

一、同域下父子页面的通信

父页面parent.html

<html> 
<head> 
<script type="text/javascript"> 
function say(){ 
alert("parent.html"); 
} 
function callChild(){ 
myFrame.window.say(); 
myFrame.window.document.getElementById("button").value="调用结束"; 
} 
</script> 
</head> 
<body> 
<input id="button" 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"); 
} 
function callParent(){ 
parent.say(); 
parent.window.document.getElementById("button").value="调用结束"; 
} 
</script> 
</head> 
<body> 
<input id="button" type="button" value="调用parent.html中的say()函数" onclick="callParent()"/> 
</body> 
</html>

方法调用

父页面调用子页面方法:FrameName.window.childMethod();

子页面调用父页面方法:parent.window.parentMethod();
DOM元素访问

获取到页面的window.document对象后,即可访问DOM元素
注意事项

要确保在iframe加载完成后再进行操作,如果iframe还未加载完成就开始调用里面的方法或变量,会产生错误。判断iframe是否加载完成有两种方法:

1. iframe上用onload事件

2. 用document.readyState=="complete"来判断

二、跨域父子页面通信方法

如果iframe所链接的是外部页面,因为安全机制就不能使用同域名下的通信方式了。
父页面向子页面传递数据

实现的技巧是利用location对象的hash值,通过它传递通信数据。在父页面设置iframe的src后面多加个data字符串,然后在子页面中通过某种方式能即时的获取到这儿的data就可以了,例如:

1. 在子页面中通过setInterval方法设置定时器,监听location.href的变化即可获得上面的data信息

2. 然后子页面根据这个data信息进行相应的逻辑处理

子页面向父页面传递数据

实现技巧就是利用一个代理iframe,它嵌入到子页面中,并且和父页面必须保持是同域,然后通过它充分利用上面第一种通信方式的实现原理就把子页面的数据传递给代理iframe,然后由于代理的iframe和主页面是同域的,所以主页面就可以利用同域的方式获取到这些数据。使用 window.top或者window.parent.parent获取浏览器最顶层window对象的引用。

Javascript 相关文章推荐
Knockout数组(observable)使用详解示例
Nov 15 Javascript
JavaScript实现页面跳转的几种常用方式
Nov 28 Javascript
JS传递对象数组为参数给后端,后端获取的实例代码
Jun 28 Javascript
在线引用最新jquery文件的实现方法
Aug 26 Javascript
原生JS实现图片轮播效果
Dec 26 Javascript
移动端界面的适配
Jan 11 Javascript
js每隔两秒输出数组中的一项(实例)
May 28 Javascript
JS实现延迟隐藏功能的方法(类似QQ头像鼠标放上展示信息)
Dec 28 Javascript
浅谈vue的props,data,computed变化对组件更新的影响
Jan 16 Javascript
详解vue移动端日期选择组件
Feb 22 Javascript
vue v-model实现自定义样式多选与单选功能
Jul 05 Javascript
JavaScript实现弹出窗口效果
Dec 09 Javascript
jquery文本框中的事件应用以输入邮箱为例
May 06 #Javascript
jquery删除数据记录时的弹出提示效果
May 06 #Javascript
js单词形式的运算符
May 06 #Javascript
js函数调用的方式
May 06 #Javascript
js使用ajax读博客rss示例
May 06 #Javascript
Android中的jQuery:AQuery简介
May 06 #Javascript
JavaScript获取table中某一列的值的方法
May 06 #Javascript
You might like
第五节--克隆
2006/11/16 PHP
PHP文件上传实例详解!!!
2007/01/02 PHP
PHP实现根据图片色界在不同位置加水印的方法
2015/08/08 PHP
ThinkPHP实现的rsa非对称加密类示例
2018/05/29 PHP
Laravel等框架模型关联的可用性浅析
2019/12/15 PHP
关于IE、Firefox、Opera页面呈现异同 写脚本很痛苦
2009/08/28 Javascript
jquery 插件开发备注
2010/08/27 Javascript
了解一点js的Eval函数
2012/07/26 Javascript
js简单的点击返回顶部效果实现方法
2015/04/10 Javascript
jQuery+html5实现div弹出层并遮罩背景
2015/04/15 Javascript
jquery移动端TAB触屏切换实现效果
2020/12/22 Javascript
Vuejs第七篇之Vuejs过渡动画案例全面解析
2016/09/05 Javascript
详解Vue-cli代理解决跨域问题
2017/09/27 Javascript
详解vue+css3做交互特效的方法
2017/11/20 Javascript
React+Antd+Redux实现待办事件的方法
2019/03/14 Javascript
决策树的python实现方法
2014/11/18 Python
Python实现把json格式转换成文本或sql文件
2015/07/10 Python
Python GUI编程 文本弹窗的实例
2019/06/11 Python
Python字典中的值为列表或字典的构造实例
2019/12/16 Python
python GUI库图形界面开发之PyQt5日期时间控件QDateTimeEdit详细使用方法与实例
2020/02/27 Python
Pytorch 使用 nii数据做输入数据的操作
2020/05/26 Python
浅谈tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意点
2020/06/08 Python
Appium+Python实现简单的自动化登录测试的实现
2021/01/26 Python
video下autoplay属性无效的解决方法(添加muted属性)
2020/05/19 HTML / CSS
您的网上新华书店:文轩网
2016/08/24 全球购物
全球领先的各类汽车配件零售商:Advance Auto Parts
2016/08/26 全球购物
JD Sports意大利:英国篮球和运动时尚的领导者
2017/10/29 全球购物
Sisley法国希思黎美国官方网站:享誉全球的奢华植物美容品牌
2020/06/27 全球购物
初二学习计划书范文
2014/04/27 职场文书
核心价值观演讲稿
2014/05/13 职场文书
罚站检讨书
2015/01/29 职场文书
大学生自荐信范文
2015/03/05 职场文书
会计工作态度自我评价
2015/03/06 职场文书
2015年公司行政后勤工作总结
2015/05/20 职场文书
详解MySQL InnoDB存储引擎的内存管理
2021/04/08 MySQL
python库sklearn常用操作
2021/08/23 Python