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 相关文章推荐
javascript中的对象创建 实例附注释
Feb 08 Javascript
javascript使用输出语句实现网页特效代码
Aug 06 Javascript
谈一谈bootstrap响应式布局
May 23 Javascript
图片懒加载插件实例分享(含解析)
Jan 09 Javascript
javascript完美实现给定日期返回上月日期的方法
Jun 15 Javascript
jQuery简单实现根据日期计算星期几的方法
Jan 09 jQuery
maptalks+three.js+vue webpack实现二维地图上贴三维模型操作
Aug 10 Javascript
Element-ui el-tree新增和删除节点后如何刷新tree的实例
Aug 31 Javascript
vue路由切换时取消之前的所有请求操作
Sep 01 Javascript
解决ant Design Search无法输入内容的问题
Oct 29 Javascript
js实现验证码干扰(静态)
Feb 22 Javascript
React Native项目框架搭建的一些心得体会
May 28 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
中国第一家无线电行
2021/03/01 无线电
php empty函数判断mysql表单是否为空
2010/04/12 PHP
PHP三层结构(上) 简单三层结构
2010/07/04 PHP
xml在joomla表单中的应用详解分享
2012/07/19 PHP
PHP递归的三种常用方式
2019/02/28 PHP
js的event详解。
2006/09/06 Javascript
JavaScript 调试器简介
2009/02/21 Javascript
js css样式操作代码(批量操作)
2009/10/09 Javascript
JS注释所产生的bug 即使注释也会执行
2013/11/19 Javascript
JS+CSS实现TreeMenu二级树形菜单完整实例
2015/09/18 Javascript
jquery实现的伪分页效果代码
2015/10/29 Javascript
jQuery Validate插件实现表单强大的验证功能
2015/12/18 Javascript
理解javascript中的严格模式
2016/02/01 Javascript
js编写的treeview使用方法
2016/11/11 Javascript
jquery 判断div show的状态实例
2016/12/03 Javascript
JavaScript实现倒计时跳转页面功能【实用】
2016/12/13 Javascript
微信小程序自动客服功能
2017/11/02 Javascript
微信小程序用户位置权限的获取方法(拒绝后提醒)
2018/11/15 Javascript
AI小程序之语音听写来了,十分钟掌握百度大脑语音听写全攻略
2020/03/13 Javascript
[01:05:12]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS CIS-GAME
2014/05/21 DOTA
[45:25]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.22
2019/09/05 DOTA
Python中最大最小赋值小技巧(分享)
2017/12/23 Python
将tensorflow的ckpt模型存储为npy的实例
2018/07/09 Python
详解配置Django的Celery异步之路踩坑
2018/11/25 Python
浅谈优化Django ORM中的性能问题
2020/07/09 Python
CSS3属性background-size使用指南
2014/12/09 HTML / CSS
html5 Canvas画图教程(7)—canvas里画曲线之quadraticCurveTo方法
2013/01/09 HTML / CSS
linux下进程间通信的方式
2013/01/23 面试题
机关门卫岗位职责
2013/12/30 职场文书
图书室标语
2014/06/21 职场文书
2014年银行员工工作总结
2014/11/12 职场文书
组织生活会发言材料
2014/12/15 职场文书
售后前台接待岗位职责
2015/04/03 职场文书
哈姆雷特读书笔记
2015/06/29 职场文书
2019年教师节祝福语精选,给老师送上真诚的祝福
2019/09/09 职场文书
如何搭建 MySQL 高可用高性能集群
2021/06/21 MySQL