嵌入式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 相关文章推荐
jquery 的 $(&quot;#id&quot;).html() 无内容的解决方法
Jun 07 Javascript
javascript对数组的常用操作代码 数组方法总汇
Jan 27 Javascript
Jquery插件easyUi实现表单验证示例
Dec 15 Javascript
Angular.js之作用域scope'@','=','&amp;'实例详解
Feb 28 Javascript
使用Fullpage插件快速开发整屏翻页的页面
Sep 13 Javascript
Vue-resource拦截器判断token失效跳转的实例
Oct 27 Javascript
vue 根据数组中某一项的值进行排序的方法
Aug 30 Javascript
使用Bootstrap做一个朝代历史表
Dec 10 Javascript
Vue路由管理器Vue-router的使用方法详解
Feb 05 Javascript
jquery实现有过渡效果的tab切换
Jul 17 jQuery
vue 实现tab切换保持数据状态
Jul 21 Javascript
原生js实现无缝轮播图效果
Jan 28 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算开始时间到过期时间的相隔的天数
2011/01/12 PHP
ThinkPHP访问不存在的模块跳转到404页面的方法
2014/06/19 PHP
php+html5实现无刷新图片上传教程
2016/01/22 PHP
PHP 数组基本操作方法详解
2016/06/17 PHP
php版微信公众平台接口参数调试实现判断用户行为的方法
2016/09/23 PHP
php实现的统计字数函数定义与使用示例
2017/07/26 PHP
phpStorm+XDebug+chrome 配置详解
2019/04/01 PHP
让回调函数 showResponse 也带上参数的代码
2007/08/13 Javascript
Mootools 1.2教程(3) 数组使用简介
2009/09/14 Javascript
jQuery知识点整理
2015/01/30 Javascript
Node.js本地文件操作之文件拷贝与目录遍历的方法
2016/02/16 Javascript
React快速入门教程
2017/01/17 Javascript
Webpack+Vue如何导入Jquery和Jquery的第三方插件
2017/02/20 Javascript
详解vue使用vue-layer-mobile组件实现toast,loading效果
2018/08/31 Javascript
vue实现自定义H5视频播放器的方法步骤
2019/07/01 Javascript
[02:05]2014DOTA2西雅图国际邀请赛 BBC第二天小组赛总结
2014/07/11 DOTA
python多重继承实例
2014/10/11 Python
Python爬取Coursera课程资源的详细过程
2014/11/04 Python
在Python中测试访问同一数据的竞争条件的方法
2015/04/23 Python
Python的pycurl包用法简介
2015/11/13 Python
对pandas的层次索引与取值的新方法详解
2018/11/06 Python
用Python实现将一张图片分成9宫格的示例
2019/07/05 Python
Pytorch 搭建分类回归神经网络并用GPU进行加速的例子
2020/01/09 Python
python计算auc的方法
2020/09/09 Python
python 6行代码制作月历生成器
2020/09/18 Python
python函数超时自动退出的实操方法
2020/12/28 Python
突袭HTML5之Javascript API扩展5—其他扩展(应用缓存/服务端消息/桌面通知)
2013/01/31 HTML / CSS
使用html5新特性轻松监听任何App自带返回键的示例
2018/03/13 HTML / CSS
德国传统玻璃制造商:Cristalica
2018/04/23 全球购物
Solaris操作系统的线程机制
2015/07/28 面试题
优秀中学生事迹材料
2014/01/31 职场文书
2014年元旦联欢会活动策划方案
2014/02/16 职场文书
科技活动周标语
2014/10/08 职场文书
2014幼儿园家长工作总结
2014/11/10 职场文书
2014工程部年度工作总结
2014/12/17 职场文书
运动会3000米加油稿
2015/07/21 职场文书