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 相关文章推荐
javascript 学习之旅 (2)
Feb 05 Javascript
键盘 keycode的值 javascript时触发事件时很有用的要素
Nov 02 Javascript
JS中toFixed()方法引起的问题如何解决
Nov 20 Javascript
jquery实现通用的内容渐显Tab选项卡效果
Sep 07 Javascript
JQuery导航菜单选择特效
Apr 11 Javascript
js简单获取表单中单选按钮值的方法
Aug 23 Javascript
JavaScript实现DOM对象选择器
Sep 24 Javascript
jQuery实现radio第一次点击选中第二次点击取消功能
May 15 jQuery
vue双向数据绑定知识点总结
Apr 18 Javascript
layui多iframe页面控制定时器运行的方法
Sep 05 Javascript
Vue组件跨层级获取组件操作
Jul 27 Javascript
js实现翻牌小游戏
Jul 31 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存储过程调用实例代码
2013/02/03 PHP
关于初学PHP时的知识积累总结
2013/06/07 PHP
php基于curl扩展制作跨平台的restfule 接口
2015/05/11 PHP
文件上传之SWFUpload插件(代码)
2015/07/30 PHP
ThinkPHP使用Smarty第三方插件方法小结
2016/03/19 PHP
PHP递归实现层级树状展开
2016/04/01 PHP
Prototype使用指南之string.js
2007/01/10 Javascript
屏蔽F1~F12的快捷键的js函数
2010/05/06 Javascript
一个简单的JS鼠标悬停特效具体方法
2013/06/17 Javascript
文本有关的样式和jQuery求对象的高宽问题分别说明
2013/08/30 Javascript
使用js判断数组中是否包含某一元素(类似于php中的in_array())
2013/12/12 Javascript
jQuery实现单击按钮遮罩弹出对话框(仿天猫的删除对话框)
2014/04/10 Javascript
跟我学习JScript的Bug与内存管理
2015/11/18 Javascript
实例讲解javascript注册事件处理函数
2016/01/09 Javascript
Three.js学习之正交投影照相机
2016/08/01 Javascript
jQuery数组处理函数整理
2016/08/03 Javascript
浅谈AngularJS中ng-class的使用方法
2016/11/11 Javascript
JS正则表达式修饰符中multiline(/m)用法分析
2016/12/27 Javascript
JS正则表达式验证中文字符
2017/05/08 Javascript
原生js二级联动效果
2017/06/20 Javascript
Vue.js常用指令的使用小结
2017/06/23 Javascript
JavaScript反弹动画效果的实现代码
2017/07/13 Javascript
Vue组件选项props实例详解
2017/08/18 Javascript
微信小程序选择图片和放大预览图片功能
2017/11/02 Javascript
vue 每次渲染完页面后div的滚动条保持在最底部的方法
2018/03/17 Javascript
js JSON.stringify()基础详解
2019/06/19 Javascript
JavaScript 禁止用户保存图片的实现代码
2020/04/28 Javascript
python的正则表达式re模块的常用方法
2013/03/09 Python
python urllib爬取百度云连接的实例代码
2017/06/19 Python
深入理解Python单元测试unittest的使用示例
2017/11/18 Python
pandas的object对象转时间对象的方法
2018/04/11 Python
Python 数据处理库 pandas进阶教程
2018/04/21 Python
wxPython实现整点报时
2019/11/18 Python
使用Python三角函数公式计算三角形的夹角案例
2020/04/15 Python
2014年学生会个人工作总结
2014/11/07 职场文书
骨干教师申报材料
2014/12/17 职场文书