嵌入式iframe子页面与父页面js通信的方法


Posted in Javascript onJanuary 20, 2015

本文实例讲述了嵌入式iframe子页面与父页面js通信的方法。分享给大家供大家参考。具体分析如下:

iframe框架中的页面与主页面之间的通信方式根据iframe中src属性是同域链接还是跨域链接,有明显不同的通信方式,同域下的数据交换和DOM元素互访就简单的多了,而跨域的则需要一些巧妙的方式来实现通信。

一、同域下父子页面的通信

父页面 parent.html:

<html>

<head>

<script type="text/javascript">

function say() {

alert("parent.html------>I'm at parent.html");

}

function callChild()

{

//document.frames["myFrame"].window.say();//只适用于ie浏览器

myFrame.window.say();

myFrame.window.document.getElementById("button").value="我变了";

}

</script>

</head>

<body>

<input 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--->I'm at child.html");

}

function callParent() {

parent.say();

parent.window.document.getElementsByName("myFrame")[0].style.height="100px";

}

</script>

</head>

<body>

<input id="button" type=button value="调用parent.html中的say()函数" onclick="callParent()">

</body>

</html>

方法调用

如上面示例所示父页面调用子页面的方法可通过:FrameName.window.childMethod();(这种方式兼容各种浏览器)
子页面调用父页面的方法:parent.window.parentMethod();

DOM元素访问

根据FrameName.window得到了子窗口对象之后,再访问其中的DOM元素就跟访问同一页面中的DOM元素没区别了都可以通过

document.getElementById(),document.getElementsByName()[index]
如:
parent.window.document.getElementsByName("myFrame")[0];

myFrame.window.document.getElementById("button")
其中的window都是可以省略的。

注意事项

要确保在Iframe加载完成后再进行操作,如果Iframe还未加载完成就开始调用里面的方法或变量,无疑会产生错误。判断Iframe是否加载完毕有两种方法:

1.在Iframe上用onload事件;
2.用document.readyState=="complete"来判断

二、跨域父子页面通信方法

如果iframe所链接的是外部页面,因为安全机制则不能使用同域名下的通信方式了。

父页面向子页面传递数据

实现的技巧就是利用 location 对象的 hash 值,通过它传递通信数据,我们只需要在父页面设置 iframe的 src 后面多加个#data 字符串(data就是你要传递的数据),然后在 子页面 中通过某种方式能即时的获取到这儿 data 就可以了,其实常用的一种方式就是:

1. 在 子页面 中通过 setInterval 方法设置定时器, 监听 location.href 的变化即可获得上面的 data 信息

2. 然后 子页面 就能根据这个 data 信息进行相应的逻辑处理。

子页面向父页面传递数据

实现的技巧就是利用一个代理 Iframe C,它嵌入到 子页面中,并且和父页面必须保持是同域,然后我们通过它充分利用上面第一种通信方式的实现原理就能把 子页面的数据传递给 iframeC,接下来的问题就是怎么让iframeC把数据传递给主页面A ,因为,iframeC 和主页面是同域的,所以它们之间传递数据就变得简单多了,属于同域名下的通信问题了,如前面所讨论的,在这里的可以使用一个经常使用的属性 window.top (也可以使用window.parent.parent),它返回对载入浏览器得最顶层 window 对象的引用,这样我们就能直接条用父页面中方法啦。

希望本文所述对大家的javascript程序设计有所帮助。

Javascript 相关文章推荐
js跨域和ajax 跨域问题的实现思路
Sep 05 Javascript
JavaScript 变量命名规则
Sep 23 Javascript
JS实现点击图片在当前页面放大并可关闭的漂亮效果
Oct 18 Javascript
AngularJS指令中的绑定策略实例分析
Dec 14 Javascript
js实现文字列表无缝滚动效果
Jun 23 Javascript
解决ionic和angular上拉加载的问题
Aug 03 Javascript
详解JavaScript中的数组合并方法和对象合并方法
May 11 Javascript
微信小程序视图容器(swiper)组件创建轮播图
Jun 19 Javascript
微信小程序实现笑脸评分功能
Nov 03 Javascript
小程序测试后台服务的方法(ngrok)
Mar 08 Javascript
vue中axios实现数据交互与跨域问题
May 12 Javascript
vue 实现在同一界面实现组件的动态添加和删除功能
Jun 16 Javascript
javascript浏览器窗口之间传递数据的方法
Jan 20 #Javascript
用队列模拟jquery的动画算法实例
Jan 20 #Javascript
jQuery 处理页面的事件详解
Jan 20 #Javascript
DOM 事件流详解
Jan 20 #Javascript
jQuery链使用指南
Jan 20 #Javascript
使用jQuery管理选择结果
Jan 20 #Javascript
javascript动态修改Li节点值的方法
Jan 20 #Javascript
You might like
Ajax+PHP 边学边练之四 表单
2009/11/27 PHP
php递归json类实例
2014/12/02 PHP
php实现短信发送代码
2015/07/05 PHP
JQuery 表格操作(交替显示、拖动表格行、选择行等)
2009/07/29 Javascript
JavaScript 对象成员的可见性说明
2009/10/16 Javascript
动态载入/删除/更新外部 JavaScript/Css 文件的代码
2010/07/03 Javascript
JS Range HTML文档/文字内容选中、库及应用介绍
2011/05/12 Javascript
jquery选择器之基本过滤选择器详解
2014/01/27 Javascript
如何用JavaScript定义一个类
2014/09/12 Javascript
如何改进javascript代码的性能
2015/04/02 Javascript
学习JavaScript设计模式之代理模式
2016/01/12 Javascript
js中实现字符串和数组的相互转化详解
2016/01/24 Javascript
基于BootStrap Metronic开发框架经验小结【三】下拉列表Select2插件的使用
2016/05/12 Javascript
AngularJS基础 ng-src 指令简单示例
2016/08/03 Javascript
js时间比较 js计算时间差的简单实现方法
2016/08/26 Javascript
jQuery自定义图片上传插件实例代码
2017/04/04 jQuery
ionic2自定义cordova插件开发以及使用(Android)
2017/06/19 Javascript
ajax与jsonp的区别及用法
2018/10/16 Javascript
浅谈Angular单元测试总结
2019/03/22 Javascript
详解ES6 Promise的生命周期和创建
2019/08/18 Javascript
nginx部署多个vue项目的方法示例
2020/09/06 Javascript
vant 解决tab切换插件标题样式自定义的问题
2020/11/13 Javascript
使用rst2pdf实现将sphinx生成PDF
2016/06/07 Python
urllib和BeautifulSoup爬取维基百科的词条简单实例
2018/01/17 Python
python互斥锁、加锁、同步机制、异步通信知识总结
2018/02/11 Python
启动Atom并运行python文件的步骤
2018/11/09 Python
YUV转为jpg图像的实现
2019/12/09 Python
详解python如何引用包package
2020/06/07 Python
Selenium结合BeautifulSoup4编写简单的python爬虫
2020/11/06 Python
python Protobuf定义消息类型知识点讲解
2021/03/02 Python
历史博物馆观后感
2015/06/05 职场文书
教学工作总结范文5篇
2019/08/19 职场文书
导游词之云南丽江-泸沽湖
2019/09/26 职场文书
利用Nginx代理如何解决前端跨域问题详析
2021/04/02 Servers
动画电影《龙珠超 超级英雄》延期上映
2022/03/20 日漫
什么是SOLID
2022/03/24 Javascript