嵌入式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玩一玩WSH吧
Feb 23 Javascript
测试JavaScript字符串处理性能的代码
Dec 07 Javascript
给jqGrid数据行添加修改和删除操作链接(之一)
Nov 04 Javascript
jquery 操作iframe的几种方法总结
Dec 13 Javascript
jQuery带箭头提示框tooltips插件集锦
Nov 17 Javascript
JS通过ajax动态读取xml文件内容的方法
Mar 24 Javascript
jq实现左侧显示图片右侧文字滑动切换效果
Aug 04 Javascript
javascript数组克隆简单实现方法
Dec 16 Javascript
jQuery取得iframe中元素的常用方法详解
Jan 14 Javascript
jQuery ajax分页插件实例代码
Jan 27 Javascript
解决微信小程序中的滚动穿透问题
Sep 16 Javascript
微信小程序自定义头部导航栏(组件化)
Nov 15 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
SONY SRF-40W电路分析
2021/03/02 无线电
smarty section简介与用法分析
2008/10/03 PHP
Blitz templates 最快的PHP模板引擎
2010/04/06 PHP
PHP入门教程之上传文件实例详解
2016/09/11 PHP
Js callBack 返回前一页的js方法
2008/11/30 Javascript
小型js框架veryide.librar源代码
2009/03/05 Javascript
浅析jQuery中调用ajax方法时在不同浏览器中遇到的问题
2014/06/11 Javascript
jquery删除指定子元素代码实例
2015/01/13 Javascript
JQuery使用$.ajax和checkbox实现下次不在通知功能
2015/04/16 Javascript
AngularJS轻松实现双击排序的功能
2016/08/30 Javascript
js获取元素的标签名实现方法
2016/10/08 Javascript
Vue.js开发环境搭建
2016/11/10 Javascript
Windows系统下安装Node.js的步骤图文详解
2016/11/15 Javascript
原生js实现类似fullpage的单页/全屏滚动
2017/01/22 Javascript
Javascript实现信息滚动效果
2017/05/18 Javascript
Swiper实现轮播图效果
2017/07/03 Javascript
详解微信小程序审核不通过的解决方法
2018/01/17 Javascript
vue-router命名视图的使用讲解
2019/01/19 Javascript
vue子路由跳转实现tab选项卡
2019/07/24 Javascript
微信小程序自定义弹出层效果
2020/05/26 Javascript
Python模仿POST提交HTTP数据及使用Cookie值的方法
2014/11/10 Python
python获得linux下所有挂载点(mount points)的方法
2015/04/29 Python
Python入门之三角函数sin()函数实例详解
2017/11/08 Python
Django利用cookie保存用户登录信息的简单实现方法
2019/05/27 Python
python 将日期戳(五位数时间)转换为标准时间
2019/07/11 Python
详解使用python绘制混淆矩阵(confusion_matrix)
2019/07/14 Python
python批量修改交换机密码的示例
2020/09/22 Python
Farfetch阿联酋:奢侈品牌时尚购物平台
2019/07/26 全球购物
预备党员入党自我评价范文
2014/03/10 职场文书
协议书与合同的区别
2014/04/18 职场文书
服装设计师求职信
2014/06/04 职场文书
2015年保洁员工作总结
2015/05/04 职场文书
2015年学校精神文明工作总结
2015/05/27 职场文书
python使用pymysql模块操作MySQL
2021/06/16 Python
基于Java的MathML转图片的方法(示例代码)
2021/06/23 Java/Android
Redis+Lua脚本实现计数器接口防刷功能(升级版)
2022/02/12 Redis