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 全选/反选以及单击行改变背景色实例
Jul 02 Javascript
jQuery实现图片放大预览实现原理及代码
Sep 12 Javascript
深入领悟JavaScript中的面向对象
Nov 18 Javascript
用C/C++来实现 Node.js 的模块(一)
Sep 24 Javascript
jQuery的图片滑块焦点图插件整理推荐
Dec 07 Javascript
ArtEditor富文本编辑器增加表单提交功能
Apr 18 Javascript
js重写方法的简单实现
Jul 10 Javascript
Vue组件BootPage实现简单的分页功能
Sep 12 Javascript
JavaScript实现拖拽元素对齐到网格(每次移动固定距离)
Nov 30 Javascript
深入理解Node中的buffer模块
Jun 03 Javascript
微信小程序实现轨迹回放的示例代码
Dec 13 Javascript
vue-simple-uploader上传成功之后的response获取代码
Sep 07 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
yii框架中的Url生产问题小结
2012/01/16 PHP
PHP用strstr()函数阻止垃圾评论(通过判断a标记)
2013/09/28 PHP
JavaScript高级程序设计 阅读笔记(四) ECMAScript中的类型转换
2012/02/27 Javascript
js实现幻灯片效果(基于jquery插件)
2013/11/05 Javascript
javascript圆盘抽奖程序实现原理和完整代码例子
2014/06/03 Javascript
JS 清除字符串数组中,重复元素的实现方法
2016/05/24 Javascript
BootStrap 智能表单实战系列(十)自动完成组件的支持
2016/06/13 Javascript
异步加载JS、CSS代码(推荐)
2016/06/15 Javascript
微信小程序 实战小程序实例
2016/10/08 Javascript
vue实现todolist单页面应用
2017/04/11 Javascript
微信小程序scroll-x失效的完美解决方法
2018/07/18 Javascript
如何制作一个Node命令行图像识别工具
2018/12/12 Javascript
elementui之el-tebs浏览器卡死的问题和使用报错未注册问题
2019/07/06 Javascript
python 默认参数问题的陷阱
2016/02/29 Python
python下调用pytesseract识别某网站验证码的实现方法
2016/06/06 Python
Python进程间通信Queue实例解析
2018/01/25 Python
对python中执行DOS命令的3种方法总结
2018/05/12 Python
Python实现的爬虫刷回复功能示例
2018/06/07 Python
Python并行分布式框架Celery详解
2018/10/15 Python
Python 正则表达式 re.match/re.search/re.sub的使用解析
2019/07/22 Python
django+tornado实现实时查看远程日志的方法
2019/08/12 Python
python基于FTP实现文件传输相关功能代码实例
2019/09/28 Python
tensorflow 只恢复部分模型参数的实例
2020/01/06 Python
Python运行提示缺少模块问题解决方案
2020/04/02 Python
python判断一个变量是否已经设置的方法
2020/08/13 Python
python如何提升爬虫效率
2020/09/27 Python
python smtplib发送多个email联系人的实现
2020/10/09 Python
python中编写函数并调用的知识点总结
2021/01/13 Python
如何让pre和textarea等HTML元素去掉滚动条自动换行自适应文本内容高度
2019/08/01 HTML / CSS
日本最大的药妆连锁店:Matsukiyo松本清药妆店
2017/11/23 全球购物
国旗下的演讲稿
2014/05/08 职场文书
勤俭节约演讲稿
2014/05/08 职场文书
2016年大学生社会实践心得体会
2015/10/09 职场文书
SpringBoot整合Mybatis Generator自动生成代码
2021/08/23 Java/Android
Python字典的基础操作
2021/11/01 Python
mysql5.7的安装及Navicate长久免费使用的实现过程
2021/11/17 MySQL