嵌入式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 multiSelect 多选下拉框
Jul 09 Javascript
巧用replace将文字表情替换为图片
Apr 17 Javascript
js网页右下角提示框实例
Oct 14 Javascript
web前端设计师们常用的jQuery特效插件汇总
Dec 07 Javascript
跟我学习javascript的函数调用和构造函数调用
Nov 16 Javascript
Javascript中字符串replace方法的第二个参数探究
Dec 05 Javascript
jQuery实现文章图片弹出放大效果
Apr 06 jQuery
jQuery日期范围选择器附源码下载
May 23 jQuery
jQuery+CSS实现的标签页效果示例【测试可用】
Aug 14 jQuery
vue-cli3.0如何使用CDN区分开发、生产、预发布环境
Nov 22 Javascript
jQuery实现的五星点评功能【案例】
Feb 18 jQuery
详解vue几种主动刷新的方法总结
Feb 19 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+AJAX传送中文会导致乱码的问题的解决方法
2008/09/08 PHP
php做下载文件的实现代码及文件名中乱码解决方法
2011/02/03 PHP
php程序的国际化实现方法(利用gettext)
2011/08/14 PHP
PHP.ini安全配置检测工具pcc简单介绍
2015/07/02 PHP
php 伪造HTTP_REFERER页面URL来源的三种方法
2016/09/22 PHP
一个tab标签切换效果代码
2009/03/27 Javascript
javascript 用记忆函数快速计算递归函数
2010/03/15 Javascript
ExtJS4 组件化编程,动态加载,面向对象,Direct
2011/05/12 Javascript
jquery重新播放css动画所遇问题解决
2013/08/21 Javascript
js定时器怎么写?就是在特定时间执行某段程序
2013/10/11 Javascript
禁止iframe脚本弹出的窗口覆盖了父窗口的方法
2014/09/06 Javascript
原生javascript实现图片按钮切换
2015/01/12 Javascript
js识别uc浏览器的代码
2015/11/06 Javascript
微信JS-SDK坐标位置如何转换为百度地图坐标
2016/07/04 Javascript
微信和qq时间格式模板实例详解
2016/10/21 Javascript
angular2倒计时组件使用详解
2017/01/12 Javascript
Bootstrap 3 进度条的实现
2017/02/22 Javascript
基于vue2的table分页组件实现方法
2017/03/20 Javascript
纯JS实现只能输入数字的简单代码
2017/06/21 Javascript
教你搭建按需加载的Vue组件库(小结)
2019/07/29 Javascript
JS简易计算器实例讲解
2020/06/30 Javascript
JSONObject与JSONArray使用方法解析
2020/09/28 Javascript
[02:48]DOTA2英雄基础教程 拉席克
2013/12/12 DOTA
[01:01:22]VGJ.S vs OG 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
[43:26]完美世界DOTA2联赛PWL S2 Forest vs Rebirth 第二场 11.20
2020/11/23 DOTA
Ruby使用eventmachine为HTTP服务器添加文件下载功能
2016/04/20 Python
flask + pymysql操作Mysql数据库的实例
2017/11/13 Python
python表格存取的方法
2018/03/07 Python
获取python的list中含有重复值的index方法
2018/06/27 Python
python3基于OpenCV实现证件照背景替换
2018/07/18 Python
大学生的网上创业计划书
2013/12/31 职场文书
党支部书记先进事迹
2014/01/17 职场文书
十佳大学生事迹材料
2014/01/29 职场文书
幼儿园教师个人反思
2014/01/30 职场文书
java实现对Hadoop的操作
2021/07/01 Java/Android
SQL Server中使用表变量和临时表
2022/05/20 SQL Server