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 相关文章推荐
mysql输出数据赋给js变量报unterminated string literal错误原因
May 22 Javascript
node.js 一个简单的页面输出实现代码
Mar 07 Javascript
在Iframe中获取父窗口中表单的值(示例代码)
Nov 22 Javascript
jquery实现邮箱自动补全功能示例分享
Feb 17 Javascript
javascript正则表达式总结
Feb 29 Javascript
详解vue-cil和webpack中本地静态图片的路径问题解决方案
Sep 27 Javascript
Vuejs开发环境搭建及热更新【推荐】
Sep 07 Javascript
vue多级复杂列表展开/折叠及全选/分组全选实现
Nov 05 Javascript
JavaScript随机数的组合问题案例分析
May 16 Javascript
浅谈javascript事件环微任务和宏任务队列原理
Sep 12 Javascript
JavaScript实现alert弹框效果
Nov 19 Javascript
详细聊聊vue中组件的props属性
Nov 02 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
PHP教程 基本语法
2009/10/23 PHP
php 连接mssql数据库 初学php笔记
2010/03/01 PHP
IIS安装Apache伪静态插件的具体操作图文
2013/07/01 PHP
memcache命令启动参数中文解释
2014/01/13 PHP
php结合curl实现多线程抓取
2015/07/09 PHP
利用PHP将部分内容用星号替换
2020/04/21 PHP
PHP模板引擎Smarty内置变量调解器用法详解
2016/04/11 PHP
PHP解压ZIP文件到指定文件夹的方法
2016/11/17 PHP
php的socket编程详解
2016/11/20 PHP
修改yii2.0用户登录使用的user表为其它的表实现方法(推荐)
2017/08/01 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
PHP空值检测函数与方法汇总
2017/11/19 PHP
JavaScript的instanceof运算符学习教程
2016/06/08 Javascript
JS正则表达式修饰符中multiline(/m)用法分析
2016/12/27 Javascript
微信小程序图片横向左右滑动案例
2017/05/19 Javascript
JS鼠标3次点击事件实现代码及扩展思路
2017/09/12 Javascript
vue路由跳转传参数的方法
2019/05/06 Javascript
js实现坦克移动小游戏
2019/10/28 Javascript
vue页面切换项目实现转场动画的方法
2019/11/12 Javascript
jquery实现简单每周轮换的日历
2020/09/10 jQuery
nodejs处理tcp连接的核心流程
2021/02/26 NodeJs
python算法学习之计数排序实例
2013/12/18 Python
python实现快速排序的示例(二分法思想)
2018/03/12 Python
Python3使用turtle绘制超立方体图形示例
2018/06/19 Python
Python UnboundLocalError和NameError错误根源案例解析
2018/10/31 Python
Django管理员账号和密码忘记的完美解决方法
2018/12/06 Python
python3射线法判断点是否在多边形内
2019/06/28 Python
Django Haystack 全文检索与关键词高亮的实现
2020/02/17 Python
Django+boostrap 美化admin后台的操作
2020/03/11 Python
Python验证码截取识别代码实例
2020/05/16 Python
利用python实现后端写网页(flask框架)
2021/02/28 Python
森林防火宣传标语
2014/06/27 职场文书
领导班子整改方案和个人整改措施
2014/10/25 职场文书
2016高校自主招生自荐信范文
2016/01/28 职场文书
浅谈Python实现opencv之图片色素的数值运算和逻辑运算
2021/06/23 Python
Python进行区间取值案例讲解
2021/08/02 Python