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 相关文章推荐
Highslide.js是一款基于js实现的网页中图片展示插件
Mar 30 Javascript
Jquery为单选框checkbox绑定单击click事件
Dec 18 Javascript
js实现网页多级级联菜单代码
Aug 20 Javascript
js实现div模拟模态对话框展现URL内容
May 27 Javascript
AngularJS 依赖注入详解和简单实例
Jul 28 Javascript
javascript实现图片左右滚动效果【可自动滚动,有左右按钮】
Sep 19 Javascript
微信小程序 底部导航栏目开发资料
Dec 05 Javascript
jQuery插件版本冲突的处理方法分析
Jan 16 Javascript
Angularjs实现页面模板清除的方法
Jul 20 Javascript
手把手带你封装一个vue component第三方库
Feb 14 Javascript
layer弹出框确定前验证:弹出消息框的方法(弹出两个layer)
Sep 21 Javascript
vue 实现超长文本截取,悬浮框提示
Jul 29 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
PHP中判断变量为空的几种方法小结
2013/11/12 PHP
php通过各种函数判断0和空
2020/07/04 PHP
PHP convert_cyr_string()函数讲解
2019/02/13 PHP
Laravel 5.5 异常处理 &amp; 错误日志的解决
2019/10/17 PHP
摘自百度的图片轮换效果代码
2007/11/19 Javascript
用js脚本控制asp.net下treeview的NodeCheck的实现代码
2010/03/02 Javascript
JQuery入门——移除绑定事件unbind方法概述及应用
2013/02/05 Javascript
详细介绍8款超实用JavaScript框架
2013/10/25 Javascript
利用window.name实现windowStorage代码分享
2014/01/02 Javascript
Jquery 点击按钮自动高亮实现原理及代码
2014/04/25 Javascript
javascript实现十六进制颜色值(HEX)和RGB格式相互转换
2014/06/20 Javascript
jQuery图片轮播功能实例代码
2017/01/29 Javascript
微信小程序之圆形进度条实现思路
2018/02/22 Javascript
JavaScript数据结构与算法之二叉树实现查找最小值、最大值、给定值算法示例
2019/03/01 Javascript
python自动化测试之setUp与tearDown实例
2014/09/28 Python
python中sleep函数用法实例分析
2015/04/29 Python
打包发布Python模块的方法详解
2016/09/18 Python
利用aardio给python编写图形界面
2017/08/21 Python
Python 查找字符在字符串中的位置实例
2018/05/02 Python
Python实现的生产者、消费者问题完整实例
2018/05/30 Python
numpy判断数值类型、过滤出数值型数据的方法
2018/06/09 Python
Python标准库使用OrderedDict类的实例讲解
2019/02/14 Python
解决Tensorboard可视化错误:不显示数据 No scalar data was found
2020/02/15 Python
django执行原始查询sql,并返回Dict字典例子
2020/04/01 Python
scrapy-redis分布式爬虫的搭建过程(理论篇)
2020/09/29 Python
CSS3实现任意图片lowpoly动画效果实例
2017/05/11 HTML / CSS
CSS3圆角边框和边界图片效果实例
2016/07/01 HTML / CSS
怎样实现H5+CSS3手指滑动切换图片的示例代码
2019/05/05 HTML / CSS
澳大利亚足球鞋和服装购物网站:Ultra Football
2018/10/11 全球购物
求最大连续递增数字串(如"ads3sl456789DF3456ld345AA"中的"456789")
2015/09/11 面试题
大学学年自我鉴定
2013/10/28 职场文书
万年牢教学反思
2014/02/15 职场文书
乡镇交通安全实施方案
2014/03/29 职场文书
画展观后感
2015/06/17 职场文书
2016开学第一课心得体会
2016/01/23 职场文书
2019求职信大礼包
2019/05/15 职场文书