js操作iframe兼容各种主流浏览器示例代码


Posted in Javascript onJuly 22, 2013

在做项目时,遇到了操作iframe的相关问题。业务很简单,其实就是在操作iframe内部某个窗体时,调用父窗体的一个函数。于是就写了两个很简单的htm页面用来测试,使用网上流行的方法在谷歌浏览器中始终报错,不能通过。
父页面parent.html的代码如下

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head><title> 
</title> 
<script src="jquery-1.10.1.min.js" type="text/javascript"></script> 
<script type="text/javascript"> 
function ParentFunction() { 
alert('ParentFunction'); 
} 
</script></head> 
<body> 
<input type="button" id="btnCancel" class="button" value="测试" /> 
<iframe id="FRMdetail" name="FRMdetail" frameborder="0" src='child.html' style="width:100%;height:100%;" ></iframe> 
</body> 
</html>

子页面child.html的代码如下
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head><title> 
</title> 
<script src="jquery-1.10.1.min.js" type="text/javascript"></script> 
<script type="text/javascript"> 
$(document).ready(function () { 
$("#btnTest").click(function (e) { 
var t=window.parent; 
t.ParentFunction(); 
}); 
}) 
</script></head> 
<body> 
<input type="button" id="btnTest" class="button" value="应该获取的值" />rrr 
</body> 
</html>

网络上流行的方法 var t=window.parent; t.ParentFunction();在IE中能调用,可是在谷歌浏览器中总是提示如下错误,
Blocked a frame with origin "null" from accessing a frame with origin "null". Protocols, domains, and ports must match.
网上找了很长时间都没法发现方法,有的也是很早以前的版本,基本上没用了,而且人云亦云,基本上没有测试过。于是自己摸索,后来才发现,谷歌浏览器其实那种方法其实也可以,只是很奇怪,必须发布后才可以,在文件系统中调用,就会出现上边的错误。
其实还有一种html5的方法postMessage,于是就根据着进行了改写,最终代码如下:
父页面parent.html的代码如下
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head><title> 
</title> 
<script src="jquery-1.10.1.min.js" type="text/javascript"></script> 
<script type="text/javascript"> 
this.ParentFunction= function() {//和注释掉的方法是一样的,也就是说加不加this都是一样的,因为此处的this就是windows 
alert('ParentFunction'); 
} 
// function ParentFunction() { 
// alert('ParentFunction'); 
// } 
function receiveMessage(e) { 
var data = e.data; 
if(data=="ParentFunction") 
{ 
ParentFunction() ; 
} 
} 
if (typeof window.addEventListener != 'undefined') {//使用html5 的postMessage必须处理的 
window.addEventListener('message', receiveMessage, false); 
} else if (typeof window.attachEvent != 'undefined') { 
window.attachEvent('onmessage', receiveMessage); 
} 
</script></head> 
<body> 
<input type="button" id="btnCancel" class="button" value="测试" /> 
<iframe id="FRMdetail" name="FRMdetail" frameborder="0" src='child.html' style="width:100%;height:100%;" ></iframe> 
</body> 
</html>

子页面child.html的代码如下
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head><title> 
</title> 
<script src="jquery-1.10.1.min.js" type="text/javascript"></script> 
<script type="text/javascript"> 
$(document).ready(function () { 
$("#btnTest").click(function (e) { 
var t=window.parent; 
if(!t.ParentFunction)//在不支持时,使用html5 的postMessage方法 
{ 
t.postMessage("ParentFunction", '*'); 
} 
else 
{ 
t.ParentFunction(); 
} 
}); 
}) 
</script></head> 
<body> 
<input type="button" id="btnTest" class="button" value="应该获取的值" />rrr 
</body> 
</html>

经过改写后,在文件系统中虽然也会出现那个错误,但需要调用的方法确实调用了,目的确实达到了,不影响使用了。
Javascript 相关文章推荐
简单JS代码压缩器
Oct 12 Javascript
JavaScript使用cookie
Feb 02 Javascript
JavaScript 学习笔记(七)字符串的连接
Dec 31 Javascript
JavaScript EasyPager 分页函数
May 25 Javascript
jQuery菜单插件superfish使用指南
Apr 21 Javascript
JavaScript页面实时显示当前时间实例代码
Oct 23 Javascript
实例分析浏览器中“JavaScript解析器”的工作原理
Dec 12 Javascript
jQuery实现一个简单的轮播图
Feb 19 Javascript
vue2笔记 — vue-router路由懒加载的实现
Mar 03 Javascript
Vue.js列表渲染绑定jQuery插件的正确姿势
Jun 29 jQuery
mpvue性能优化实战技巧(小结)
Apr 17 Javascript
vue实现数字动态翻牌的效果(开箱即用)
Dec 08 Javascript
JavaScript的模块化:封装(闭包),继承(原型) 介绍
Jul 22 #Javascript
JS判定是否原生方法
Jul 22 #Javascript
js图片延迟加载的实现方法及思路
Jul 22 #Javascript
js添加table的行和列 具体实现方法
Jul 22 #Javascript
JS中eval函数的使用示例
Jul 21 #Javascript
JS中prototype关键字的功能介绍及使用示例
Jul 21 #Javascript
原生JS实现表单checkbook获取已选择的值
Jul 21 #Javascript
You might like
PHP的一个完整SMTP类(解决邮件服务器需要验证时的问题)
2006/10/09 PHP
php自动获取目录下的模板的代码
2010/08/08 PHP
yii框架中的Url生产问题小结
2012/01/16 PHP
详解php比较操作符的安全问题
2015/12/03 PHP
PHP实现根据数组的值进行分组的方法
2017/04/20 PHP
Laravel模型事件的实现原理详解
2018/03/14 PHP
Ext JS添加子组件的误区探讨
2013/06/28 Javascript
深入理解Javascript动态方法调用与参数修改的问题
2013/12/10 Javascript
js实现微信分享代码
2020/10/11 Javascript
jQuery下拉框的简单应用
2016/06/24 Javascript
JS当前页面登录注册框,固定DIV,底层阴影的实例代码
2016/09/29 Javascript
vue插件tab选项卡使用小结
2016/10/27 Javascript
jQuery联动日历的实例解析
2016/12/02 Javascript
js实现登录验证码
2016/12/22 Javascript
Express进阶之log4js实用入门指南
2018/02/10 Javascript
[38:30]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第一场2
2014/05/24 DOTA
python中urllib模块用法实例详解
2014/11/19 Python
Python中处理字符串之isalpha()方法的使用
2015/05/18 Python
Python实现查找系统盘中需要找的字符
2015/07/14 Python
python3实现跳一跳点击跳跃
2018/01/08 Python
Python3实现的画图及加载图片动画效果示例
2018/01/19 Python
Python实现FTP文件传输的实例
2019/07/07 Python
Python如何实现爬取B站视频
2020/05/20 Python
Python 没有main函数的原因
2020/07/10 Python
英国排名第一的冲浪店:Ann’s Cottage
2020/06/21 全球购物
某公司面试题
2012/03/05 面试题
英语专业推荐信
2013/11/16 职场文书
前厅收银主管岗位职责
2014/02/04 职场文书
小学优秀班集体申报材料
2014/05/25 职场文书
小学趣味运动会加油稿
2014/09/25 职场文书
检讨书范文
2015/01/27 职场文书
2015年仓库管理工作总结
2015/05/25 职场文书
婚育证明样本
2015/06/16 职场文书
最新农村养殖致富:资金投入较低的创业项目有哪些?
2019/09/26 职场文书
深入理解go缓存库freecache的使用
2022/02/15 Golang
java开发双人五子棋游戏
2022/05/06 Java/Android