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 相关文章推荐
Mootools 1.2教程 同时进行多个形变动画
Sep 15 Javascript
推荐40个非常优秀的jQuery插件和教程【系列三】
Nov 09 Javascript
JQuery中判断一个元素下面是否有内容或者有某个标签的判断代码
Feb 02 Javascript
浅析document.ready和window.onload的区别讲解
Dec 18 Javascript
jquery实现标签支持图文排列带上下箭头按钮的选项卡
Mar 14 Javascript
JQuery选择器、过滤器大整理
May 26 Javascript
基于jQuery 实现bootstrapValidator下的全局验证
Dec 07 Javascript
使用Node.js处理前端代码文件的编码问题
Feb 16 Javascript
神奇!js+CSS+DIV实现文字颜色渐变效果
Mar 16 Javascript
Javascript将字符串日期格式化为yyyy-mm-dd的方法
Oct 27 Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
Jan 20 Javascript
jQuery 添加元素和删除元素的方法
Jul 15 jQuery
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
让这部DC动画新作刷新你的认知
2020/03/03 欧美动漫
使用PHP获取网络文件的实现代码
2010/01/01 PHP
PHP循环语句笔记(foreach,list)
2011/11/29 PHP
PHP登陆后跳转到登陆前页面实现思路及代码
2014/01/17 PHP
php递归实现无限分类的方法
2015/07/28 PHP
CI配置多数据库访问的方法
2016/03/28 PHP
PHP实现一个简单url路由功能实例
2016/11/05 PHP
通过源码解析Laravel的依赖注入
2018/01/22 PHP
JavaScript.The.Good.Parts阅读笔记(二)作用域&amp;闭包&amp;减缓全局空间污染
2010/11/16 Javascript
JavaScript 的继承
2011/10/01 Javascript
Nodejs+express+html5 实现拖拽上传
2014/08/08 NodeJs
js实现从右向左缓缓浮出网页浮动层广告的方法
2015/05/09 Javascript
jQuery实现的调整表格行tr上下顺序
2016/01/10 Javascript
JavaScript地理位置信息API
2016/06/11 Javascript
jQuery插件扩展实例【添加回调函数】
2016/11/26 Javascript
谈谈对vue响应式数据更新的误解
2017/08/01 Javascript
详解JS数值Number类型
2018/02/07 Javascript
vue2.0组件之间传值、通信的多种方式(干货)
2018/02/10 Javascript
React中this丢失的四种解决方法
2019/03/12 Javascript
vue实现简单的日历效果
2020/09/24 Javascript
微信小程序开发之获取用户手机号码(php接口解密)
2020/05/17 Javascript
如何使用gpu.js改善JavaScript的性能
2020/12/01 Javascript
[03:10]2014DOTA2 TI马来劲旅Titan首战告捷目标只是8强
2014/07/10 DOTA
[42:25]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第三场
2018/04/06 DOTA
python3.5 + PyQt5 +Eric6 实现的一个计算器代码
2017/03/11 Python
浅谈python之新式类
2018/08/12 Python
图文详解python安装Scrapy框架步骤
2019/05/20 Python
python使用百度文字识别功能方法详解
2019/07/23 Python
解决Django连接db遇到的问题
2019/08/29 Python
蛋糕店创业计划书范文
2014/09/21 职场文书
社区党风廉政建设调研报告
2015/01/01 职场文书
房产公证书格式
2015/01/26 职场文书
2015年端午节活动方案
2015/05/05 职场文书
伊索寓言读书笔记
2015/06/30 职场文书
JVM之方法返回地址详解
2022/02/28 Java/Android
MySQL导致索引失效的几种情况
2022/06/25 MySQL