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 相关文章推荐
JSON 编辑器实现代码
Dec 06 Javascript
Jquery.LazyLoad.js修正版下载,实现图片延迟加载插件
Mar 12 Javascript
DEDECMS如何为文章添加HOT NEW标志图片
Aug 14 Javascript
深入理解jquery中的事件与动画
May 24 Javascript
JavaScript的for循环中嵌套一个点击事件的问题解决
Mar 03 Javascript
限时抢购-倒计时的完整实例(分享)
Sep 17 Javascript
vue项目在安卓低版本机显示空白的原因分析(两种)
Sep 04 Javascript
Vuex的初探与实战小结
Nov 26 Javascript
一次让你了解全部JavaScript的作用域
Jun 24 Javascript
Node登录权限验证token验证实现的方法示例
May 25 Javascript
vue路由的配置和页面切换详解
Sep 09 Javascript
Vue+Java 通过websocket实现服务器与客户端双向通信操作
Sep 22 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文章采集URL补全函数(FormatUrl)
2012/08/02 PHP
php中用date函数获取当前时间有误的解决办法
2013/08/02 PHP
PHP字符串word末字符实现大小写互换的方法
2014/11/10 PHP
PHP中使用hidef扩展代替define提高性能
2015/04/09 PHP
php 删除指定文件夹的实例讲解
2017/07/25 PHP
PHP实现统计所有字符在字符串中出现次数的方法
2017/10/17 PHP
dtree 网页树状菜单及传递对象集合到js内,动态生成节点
2012/04/14 Javascript
jquery 操作iframe的几种方法总结
2013/12/13 Javascript
jQuery如何将选中的对象转化为原始的DOM对象
2014/06/09 Javascript
JS是按值传递还是按引用传递
2015/01/30 Javascript
JavaScript实现仿网易通行证表单验证
2015/05/25 Javascript
js实现登陆遮罩效果的方法
2015/07/28 Javascript
浅谈JavaScript超时调用和间歇调用
2015/08/30 Javascript
jQuery延迟执行的实现方法
2016/12/21 Javascript
bootstrap输入框组使用方法
2017/02/07 Javascript
Web制作验证码功能实例代码
2017/06/19 Javascript
使用MUI框架模拟手机端的下拉刷新和上拉加载功能
2017/09/04 Javascript
Sublime Text新建.vue模板并高亮(图文教程)
2017/10/26 Javascript
移动web开发之touch事件实例详解
2018/01/17 Javascript
JS实现table表格内针对某列内容进行即时搜索筛选功能
2018/05/11 Javascript
vue-router实现编程式导航的代码实例
2019/01/19 Javascript
vue 使用 v-model 双向绑定父子组件的值遇见的问题及解决方案
2021/03/01 Vue.js
[49:20]2014 DOTA2国际邀请赛中国区预选赛5.21 CIS VS TongFu
2014/05/22 DOTA
python SSH模块登录,远程机执行shell命令实例解析
2018/01/12 Python
python中实现数组和列表读取一列的方法
2018/04/03 Python
python采集微信公众号文章
2018/12/20 Python
python自动分箱,计算woe,iv的实例代码
2019/11/22 Python
tensorflow使用指定gpu的方法
2020/02/04 Python
python中strip(),lstrip(),rstrip()函数的使用讲解
2020/11/17 Python
python中pow函数用法及功能说明
2020/12/04 Python
美国高档帽子网上商店:Hats.com
2018/08/09 全球购物
马来西亚在线购物市场:PGMall.my
2019/10/13 全球购物
奥巴马演讲稿
2014/01/08 职场文书
2014最新党员批评与自我批评材料
2014/09/24 职场文书
2016年公司新年寄语
2015/08/17 职场文书
如何在pycharm中快捷安装pip命令(如pygame)
2021/05/31 Python