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 04 Javascript
jQuery实现的进度条效果
Jul 15 Javascript
通过XMLHttpRequest和jQuery实现ajax的几种方式
Aug 28 Javascript
javascript 数组的定义和数组的长度
Jun 07 Javascript
完美解决jQuery符号$与其他javascript 库、框架冲突的问题
Aug 09 Javascript
JavaScript仿网易选项卡制作代码
Oct 06 Javascript
VUE2.0+ElementUI2.0表格el-table实现表头扩展el-tooltip
Nov 30 Javascript
PostgreSQL Node.js实现函数计算方法示例
Feb 12 Javascript
json 带斜杠时如何解析的实现
Aug 12 Javascript
解决layui动态添加的元素click等事件触发不了的问题
Sep 20 Javascript
解决echarts vue数据更新,视图不更新问题(echarts嵌在vue弹框中)
Jul 20 Javascript
jquery插件实现搜索历史
Apr 24 jQuery
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 Web木马扫描器代码分享
2015/09/06 PHP
php制作的简单验证码识别代码
2016/01/26 PHP
详解PHP的Laravel框架中Eloquent对象关系映射使用
2016/02/26 PHP
php版微信js-sdk支付接口类用法示例
2016/10/12 PHP
PHP实现基于栈的后缀表达式求值功能
2017/11/10 PHP
jQuery Ajax之load()方法
2009/10/12 Javascript
window.location.hash 使用说明
2010/11/08 Javascript
使用jQuery和Bootstrap实现多层、自适应模态窗口
2014/12/22 Javascript
jQuery实现iframe父窗体和子窗体的相互调用
2016/06/17 Javascript
BootStrap 轮播插件(carousel)支持左右手势滑动的方法(三种)
2016/07/07 Javascript
jQuery中Datatables增加跳转到指定页功能
2017/02/08 Javascript
高效的jQuery代码编写技巧总结
2017/02/22 Javascript
将angular-ui的分页组件封装成指令的方法详解
2017/05/10 Javascript
JavaScript Drum Kit 指南(纯 JS 模拟敲鼓效果)
2017/07/23 Javascript
使用node.js对音视频文件加密的实例代码
2017/08/30 Javascript
详解ionic本地相册、拍照、裁剪、上传(单图完全版)
2017/10/10 Javascript
Vue2.0实现组件数据的双向绑定问题
2018/03/06 Javascript
seajs下require书写约定实例分析
2018/05/16 Javascript
微信小程序实现禁止分享代码实例
2019/10/19 Javascript
详解JavaScript中分解数字的三种方法
2021/01/05 Javascript
[01:40]2014DOTA2国际邀请赛 三冰SOLO赛后采访恶搞
2014/07/09 DOTA
python选择排序算法的实现代码
2013/11/21 Python
Python实现发送与接收邮件的方法详解
2018/03/28 Python
windows下安装Python的XlsxWriter模块方法
2018/05/03 Python
pytorch 实现将自己的图片数据处理成可以训练的图片类型
2020/01/08 Python
Python3 selenium 实现QQ群接龙自动化功能
2020/04/17 Python
使用tensorflow根据输入更改tensor shape
2020/06/23 Python
解决Ubuntu18中的pycharm不能调用tensorflow-gpu的问题
2020/09/17 Python
美国大尺码女装零售商:TORRID
2016/10/01 全球购物
全球最大的服务市场:Fiverr
2017/01/03 全球购物
新东网科技Java笔试题
2012/07/13 面试题
如何判断一段程序是由C 编译程序还是由C++编译程序编译的
2013/08/04 面试题
银行办理业务介绍信
2014/01/18 职场文书
主题教育活动总结
2014/05/05 职场文书
客房领班岗位职责
2015/02/11 职场文书
python生成可执行exe控制Microsip自动填写号码并拨打功能
2021/06/21 Python