嵌入式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 相关文章推荐
Prototype1.6 JS 官方下载地址
Nov 30 Javascript
自己封装的javascript事件队列函数版
Jun 12 Javascript
JavaScript函数学习总结以及相关的编程习惯指南
Nov 16 Javascript
AngularJS 单选框及多选框的双向动态绑定
Apr 20 Javascript
jQuery Validate表单验证插件实现代码
Jun 08 jQuery
微信小程序的分类页面制作
Jun 27 Javascript
一个简易的js图片轮播效果
Jul 22 Javascript
详解webpack2+React 实例demo
Sep 11 Javascript
jQuery实现DIV响应鼠标滑过由下向上展开效果示例【测试可用】
Apr 26 jQuery
vue实现element-ui对话框可拖拽功能
Aug 17 Javascript
nodemon实现Typescript项目热更新的示例代码
Nov 19 Javascript
原生js实现下拉框选择组件
Jan 20 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
IIS+PHP+MySQL+Zend配置 (视频教程)
2006/12/13 PHP
ThinkPHP3.2.2的插件控制器功能简述
2014/07/09 PHP
php框架CodeIgniter使用redis的方法分析
2018/04/13 PHP
PHP+MySQL高并发加锁事务处理问题解决方法
2018/04/30 PHP
PHP addAttribute()函数讲解
2019/02/03 PHP
比较搞笑的js陷阱题
2010/02/07 Javascript
ext combox 下拉框不出现自动提示,自动选中的解决方法
2010/02/24 Javascript
Zero Clipboard js+swf实现的复制功能使用方法
2010/03/07 Javascript
深入理解javascript原型链和继承
2014/09/23 Javascript
深入理解JavaScript中Ajax
2016/08/02 Javascript
移动端使用localStorage缓存Js和css文的方法(web开发)
2016/09/20 Javascript
jquery日历插件e-calendar升级版
2016/11/10 Javascript
利用JavaScript在网页实现八数码启发式A*算法动画效果
2017/04/16 Javascript
微信小程序实现消息框弹出动画
2020/04/18 Javascript
jQuery-Citys省市区三级菜单联动插件使用详解
2019/07/26 jQuery
JavaScript canvas实现雪花随机动态飘落
2020/02/08 Javascript
VUE 实现element upload上传图片到阿里云
2020/08/12 Javascript
Ant Design Pro 之 ProTable使用操作
2020/10/31 Javascript
js实现限定区域范围拖拉拽效果
2020/11/20 Javascript
jQuery实现动态向上滚动
2020/12/21 jQuery
使用python3.5仿微软记事本notepad
2016/06/15 Python
pandas使用get_dummies进行one-hot编码的方法
2018/07/10 Python
python中open函数的基本用法示例
2019/09/07 Python
scrapy-redis分布式爬虫的搭建过程(理论篇)
2020/09/29 Python
python中的unittest框架实例详解
2021/02/05 Python
python爬虫线程池案例详解(梨视频短视频爬取)
2021/02/20 Python
使用CSS3来匹配横屏竖屏的简单方法
2015/08/04 HTML / CSS
移动端开发HTML5页面点击按钮后出现闪烁或黑色背景的解决办法
2018/09/19 HTML / CSS
武汉英思工程科技有限公司&ndash;ORACLE面试测试题目
2012/04/30 面试题
年终考核评语
2014/01/19 职场文书
干部考核评语
2014/04/29 职场文书
村支部书记群众路线对照检查材料思想汇报
2014/10/08 职场文书
综合素质评价个性发展自我评价
2015/03/06 职场文书
2016关于军训的心得体会
2016/01/11 职场文书
聊一聊python常用的编程模块
2021/05/14 Python
vue3种table表格选项个数的控制方法
2022/04/14 Vue.js