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 相关文章推荐
jquery tablesorter.js 支持中文表格排序改进
Dec 09 Javascript
jQuery实现模拟marquee标签效果
Jul 14 Javascript
异步JavaScript编程中的Promise使用方法
Jul 28 Javascript
javascript图片切换综合实例(循环切换、顺序切换)
Jan 13 Javascript
修改js confirm alert 提示框文字的简单实例
Jun 10 Javascript
用jquery获取自定义的标签属性的值简单实例
Sep 17 Javascript
通过修改360抢票的刷新频率和突破8车次限制实现方法
Jan 04 Javascript
Vue实现带进度条的文件拖动上传功能
Feb 23 Javascript
JS处理一些简单计算题
Feb 24 Javascript
vue 2.1.3 实时显示当前时间,每秒更新的方法
Sep 16 Javascript
JS实现小米轮播图
Sep 21 Javascript
Vue深入理解插槽slot的使用
Aug 05 Vue.js
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表单提交与$_POST实例分析
2015/01/26 PHP
php源码 fsockopen获取网页内容实例详解
2016/09/24 PHP
php设计模式之迭代器模式实例分析【星际争霸游戏案例】
2020/04/07 PHP
PJ Blog修改-禁止复制的代码和方法
2006/10/25 Javascript
javascript JSON操作入门实例
2010/04/16 Javascript
基于jQuery的弹出框插件
2012/03/18 Javascript
jQuery form 表单验证插件(fieldValue)校验表单
2016/01/24 Javascript
Bootstrap table表格简单操作
2017/02/07 Javascript
JavaScript条件判断_动力节点Java学院整理
2017/06/26 Javascript
JavaScript转换数据库DateTime字段类型方法
2017/06/27 Javascript
详解Vuex中mapState的具体用法
2017/09/28 Javascript
Angular-UI Bootstrap组件实现警报功能
2018/07/16 Javascript
VUE2.0 ElementUI2.0表格el-table自适应高度的实现方法
2018/11/28 Javascript
JSON的parse()方法介绍
2019/01/31 Javascript
echarts统计x轴区间的数值实例代码详解
2019/07/07 Javascript
vue项目引入ts步骤(小结)
2019/10/31 Javascript
vue插槽slot的简单理解与用法实例分析
2020/03/14 Javascript
基于canvas实现手写签名(vue)
2020/05/21 Javascript
Vue管理系统前端之组件拆分封装详解
2020/08/23 Javascript
[02:44]DOTA2英雄基础教程 钢背兽
2013/12/19 DOTA
用Python实现一个简单的能够发送带附件的邮件程序的教程
2015/04/08 Python
Python创建二维数组实例(关于list的一个小坑)
2017/11/07 Python
Python3.7实现中控考勤机自动连接
2018/08/28 Python
详解python 爬取12306验证码
2019/05/10 Python
Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
2020/05/11 Python
CSS3用@font-face实现自定义英文字体
2013/09/23 HTML / CSS
Mio Skincare英国官网:身体紧致及孕期身体护理
2018/08/19 全球购物
Viking Direct爱尔兰:办公用品和家具
2019/11/21 全球购物
手工制作的意大利皮革运动鞋:KOIO
2020/01/05 全球购物
婚前协议书
2014/04/15 职场文书
搞笑爱情保证书
2014/04/29 职场文书
MySQL Innodb关键特性之插入缓冲(insert buffer)
2021/04/08 MySQL
5道关于python基础 while循环练习题
2021/11/27 Python
MYSQL如何查看进程和kill进程
2022/03/13 MySQL
CDPR谈《巫师》新作用虚幻5原因 称不会为Epic独占
2022/04/06 其他游戏
netty 实现tomcat的示例代码
2022/06/05 Servers