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 相关文章推荐
input+select(multiple) 实现下拉框输入值
May 21 Javascript
js的逻辑运算符 ||
May 31 Javascript
jquery ztree实现下拉树形框使用到了json数据
May 14 Javascript
Javascript中的Callback方法浅析
Mar 15 Javascript
Javascript中匿名函数的调用与写法实例详解(多种)
Jan 26 Javascript
使用AngularJS 跨站请求如何解决jsonp请求问题
Jan 16 Javascript
JS中关于正则的巧妙操作
Aug 31 Javascript
详解Vuex管理登录状态
Nov 13 Javascript
浅谈express.js框架中间件(middleware)
Apr 07 Javascript
详解Vue中组件的缓存
Apr 20 Javascript
Layui 动态禁止select下拉的例子
Sep 03 Javascript
使用vue编写h5公众号跳转小程序的实现代码
Nov 27 Vue.js
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
了解咖啡雨林联盟认证 什么是雨林认证 雨林认证是什么意思
2021/03/05 新手入门
php打开文件fopen函数的使用说明
2013/07/05 PHP
使用PHPExcel操作Excel用法实例分析
2015/03/26 PHP
php从数据库读取数据,并以json格式返回数据的方法
2018/08/21 PHP
Laravel统计一段时间间隔的数据方法
2019/10/09 PHP
javascript时间自动刷新实现原理与步骤
2013/01/06 Javascript
jquery实现网站超链接和图片提示效果
2013/03/21 Javascript
js判断IE浏览器版本过低示例代码
2013/11/22 Javascript
JS脚本defer的作用示例介绍
2014/01/02 Javascript
JavaScript fontcolor方法入门实例(按照指定的颜色来显示字符串)
2014/10/17 Javascript
全面了解addEventListener和on的区别
2016/07/14 Javascript
Bootstrap简单表单显示学习笔记
2016/11/15 Javascript
解决nodejs中使用http请求返回值为html时乱码的问题
2017/02/18 NodeJs
微信小程序商城项目之商品属性分类(4)
2017/04/17 Javascript
JS设计模式之单例模式(一)
2017/09/29 Javascript
前端MVVM框架解析之双向绑定
2018/01/24 Javascript
深入koa-bodyparser原理解析
2019/01/16 Javascript
JS插入排序简单理解与实现方法分析
2019/11/25 Javascript
JS原型prototype和__proto__用法实例分析
2020/03/14 Javascript
python 文件与目录操作
2008/12/24 Python
Python实现定制自动化业务流量报表周报功能【XlsxWriter模块】
2019/03/11 Python
基于Python函数和变量名解析
2019/07/19 Python
docker-py 用Python调用Docker接口的方法
2019/08/30 Python
python统计函数库scipy.stats的用法解析
2020/02/25 Python
使用css实现android系统的loading加载动画
2019/07/25 HTML / CSS
墨尔本照明批发商店:Mica Lighting
2017/12/28 全球购物
Etam俄罗斯:法国女士内衣和家居服网上商店
2019/10/30 全球购物
Ticketmaster意大利:音乐会、节日、艺术和剧院的官方门票
2019/12/23 全球购物
天逸系统(武汉)有限公司Java笔试题
2015/12/29 面试题
金融学专科生自我鉴定
2014/02/21 职场文书
幼儿园教师的自我评价范文
2014/09/17 职场文书
银行柜员与客户起冲突检讨书
2014/09/27 职场文书
2014年医院后勤工作总结
2014/12/06 职场文书
2015年酒店前台工作总结
2015/04/20 职场文书
tensorflow+k-means聚类简单实现猫狗图像分类的方法
2021/04/28 Python
Android Studio 计算器开发
2022/05/20 Java/Android