嵌入式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 相关文章推荐
JavaScript 关键字屏蔽实现函数
Aug 02 Javascript
javascript 在网页中的运用(asp.net)
Nov 23 Javascript
js 鼠标移动显示图片的简单实例
Dec 25 Javascript
基于jquery实现select选择框内容左右移动添加删除代码分享
Aug 25 Javascript
jQuery插件之Tocify动态节点目录菜单生成器附源码下载
Jan 08 Javascript
jQuery Mobile 和 Kendo UI 的比较
May 05 Javascript
Bootstrap3使用typeahead插件实现自动补全功能
Jul 07 Javascript
Bootstrap页面标题Page Header的实现方法
Mar 22 Javascript
使用JQ完成表格隔行换色的简单实例
Aug 25 Javascript
详解如何使用 vue-cli 开发多页应用
Dec 16 Javascript
vue项目中使用scss的方法步骤
May 16 Javascript
vue动态渲染svg、添加点击事件的实现
Mar 13 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
用php实现的下载css文件中的图片的代码
2010/02/08 PHP
THINKPHP+JS实现缩放图片式截图的实现
2010/03/07 PHP
PHP中获取文件扩展名的N种方法小结
2012/02/27 PHP
php 微信公众平台开发模式实现多客服的实例代码
2016/11/07 PHP
正则表达式判断是否存在中文和全角字符和判断包含中文字符串长度
2008/09/27 Javascript
JavaScript和JQuery实用代码片段(一)
2010/04/07 Javascript
js下判断 iframe 是否加载完成的完美方法
2010/10/26 Javascript
关于不同页面之间实现参数传递的几种方式讨论
2017/02/13 Javascript
Vue底层实现原理总结
2018/02/17 Javascript
vue项目中api接口管理总结
2018/04/20 Javascript
详解JavaScript中的数组合并方法和对象合并方法
2018/05/11 Javascript
NodeJS读取分析Nginx错误日志的方法
2019/05/14 NodeJs
[57:24]LGD vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python中使用copy模块实现列表(list)拷贝
2015/04/14 Python
python DataFrame获取行数、列数、索引及第几行第几列的值方法
2018/04/08 Python
对pandas replace函数的使用方法小结
2018/05/18 Python
Python实现对字典分别按键(key)和值(value)进行排序的方法分析
2018/12/19 Python
python 解决flask uwsgi 获取不到全局变量的问题
2019/12/22 Python
Python3.7黑帽编程之病毒篇(基础篇)
2020/02/04 Python
基于pytorch padding=SAME的解决方式
2020/02/18 Python
PyTorch在Windows环境搭建的方法步骤
2020/05/12 Python
浅谈CSS3鼠标移入图片动态提示效果(transform)
2017/11/06 HTML / CSS
浅谈css3新单位vw、vh、vmin、vmax的使用详解
2017/12/01 HTML / CSS
这段代码难道不该打印出56吗
2013/02/27 面试题
简述网络文件系统NFS,并说明其作用
2016/10/19 面试题
网站编辑求职信
2013/10/17 职场文书
音乐学个人的自荐书范文
2013/11/26 职场文书
人事专员工作职责
2014/02/22 职场文书
《理想的风筝》教学反思
2014/04/11 职场文书
小学教师师德承诺书
2014/05/23 职场文书
新闻学专业职业生涯规划范文:我的人生我做主
2014/09/12 职场文书
2015新年寄语(一句话)
2014/12/08 职场文书
2015年暑期实践报告范文
2015/07/13 职场文书
解决Swagger2返回map复杂结构不能解析的问题
2021/07/02 Java/Android
Python多个MP4合成视频的实现方法
2021/07/16 Python
Spring Boot实现文件上传下载
2022/08/14 Java/Android