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 模式设计之工厂模式学习心得
Apr 27 Javascript
Chrome中JSON.parse的特殊实现
Jan 12 Javascript
基于OO的动画附加插件,可以实现弹跳、渐隐等动画效果 分享
Jun 24 Javascript
js实现模拟计算器退格键删除文字效果的方法
May 07 Javascript
JavaScript判断FileUpload控件上传文件类型
Sep 28 Javascript
详解JavaScript中常用的函数类型
Nov 18 Javascript
JS获取鼠标相对位置的方法
Sep 20 Javascript
VUE Error: getaddrinfo ENOTFOUND localhost
May 03 Javascript
用Node编写RESTful API接口的示例代码
Jul 04 Javascript
javascript实现考勤日历功能
Nov 29 Javascript
node.JS的crypto加密模块使用方法详解(MD5,AES,Hmac,Diffie-Hellman加密)
Feb 06 Javascript
解决vant框架做H5时踩过的坑(下拉刷新、上拉加载等)
Nov 11 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正则表达式入门教程(推荐)
2016/05/18 PHP
浅谈PHP值mysql操作类
2016/06/29 PHP
微信公众平台开发教程②微信端分享功能图文详解
2019/04/10 PHP
laravel 如何实现引入自己的函数或类库
2019/10/15 PHP
xss文件页面内容读取(解决)
2010/11/28 Javascript
jQuery鼠标经过方形图片切换成圆边效果代码分享
2015/08/20 Javascript
JavaScript iframe数据共享接口实现方法
2016/01/06 Javascript
BootStrap创建响应式导航条实例代码
2016/05/31 Javascript
javaScript语法总结
2016/11/25 Javascript
Vue在页面右上角实现可悬浮/隐藏的系统菜单
2018/05/04 Javascript
Vue中的作用域CSS和CSS模块的区别
2018/10/09 Javascript
微信小程序实现两个页面传值的方法分析
2018/12/11 Javascript
微信小程序下拉加载和上拉刷新两种实现方法详解
2019/09/05 Javascript
使用Python的判断语句模拟三目运算
2015/04/24 Python
用Python实现web端用户登录和注册功能的教程
2015/04/30 Python
Python字符串格式化
2015/06/15 Python
python机器学习理论与实战(一)K近邻法
2021/01/28 Python
简单实现python聊天程序
2018/04/01 Python
解决python通过cx_Oracle模块连接Oracle乱码的问题
2018/10/18 Python
python处理DICOM并计算三维模型体积
2019/02/26 Python
PyQt5 加载图片和文本文件的实例
2019/06/14 Python
利用Python实现kNN算法的代码
2019/08/16 Python
基于Python的微信机器人开发 微信登录和获取好友列表实现解析
2019/08/21 Python
flask框架自定义过滤器示例【markdown文件读取和展示功能】
2019/11/08 Python
python生成器用法实例详解
2019/11/22 Python
Pytorch实现将模型的所有参数的梯度清0
2020/06/24 Python
任意一块网页内容实现“活”的背景(目前火狐浏览器专有)
2014/05/07 HTML / CSS
网页中的电话号码如何实现一键直呼效果_附示例
2016/03/15 HTML / CSS
HTML块级标签汇总(小篇)
2016/07/13 HTML / CSS
Holiday Inn中国官网:IHG旗下假日酒店预订
2018/04/08 全球购物
Infababy英国:婴儿推车、Travel System婴儿车和婴儿汽车座椅销售
2018/05/23 全球购物
爱祖国演讲稿
2014/05/04 职场文书
2014年第四季度入党积极分子思想汇报(十八届四中全会)
2014/11/03 职场文书
人事文员岗位职责
2015/02/04 职场文书
详解非极大值抑制算法之Python实现
2021/06/28 Python
PHP 时间处理类Carbon
2022/05/20 PHP