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 密码强度判断代码
Sep 05 Javascript
jquery live()重复绑定的解决方法介绍
Jan 03 Javascript
jquery.ajax之beforeSend方法使用介绍
Dec 08 Javascript
JavaScript实现表格点击排序的方法
May 11 Javascript
jQuery与getJson结合的用法实例
Aug 07 Javascript
详解AngularJs中$resource和restfu服务端数据交互
Sep 21 Javascript
详解jQuery lazyload 懒加载
Dec 19 Javascript
Vue.js 2.0窥探之Virtual DOM到底是什么?
Feb 10 Javascript
Vuejs在v-for中,利用index来对第一项添加class的方法
Mar 03 Javascript
新版vue-cli模板下本地开发环境使用node服务器跨域的方法
Apr 03 Javascript
JS使用tween.js动画库实现轮播图并且有切换功能
Jul 17 Javascript
Vue项目实现简单的权限控制管理功能
Jul 17 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和Shell写Hadoop的MapReduce程序
2014/04/15 PHP
使用PHP实现生成HTML静态页面
2015/11/18 PHP
Ajax和PHP正则表达式验证表单及验证码
2016/09/24 PHP
php正则判断是否为合法身份证号的方法
2017/03/16 PHP
PHP实现获取url地址中顶级域名的方法示例
2019/06/05 PHP
使用JavaScript实现网页版Pongo设计思路及源代码分享
2014/06/16 Javascript
JavaScript获取鼠标移动时的坐标(兼容IE8、chome谷歌、Firefox)
2014/09/13 Javascript
用js代码和插件实现wordpress雪花飘落效果的四种方法
2014/12/15 Javascript
解决Jquery向页面append新元素之后事件的绑定问题
2015/03/16 Javascript
浅谈JavaScript中运算符的优先级
2015/07/07 Javascript
基于JavaScript创建动态Dom
2015/12/08 Javascript
javascript实现的猜数小游戏完整实例代码
2016/05/10 Javascript
Vue数据驱动模拟实现5
2017/01/13 Javascript
jquery实现动态创建form并提交的方法示例
2019/05/27 jQuery
世界上最短的数字判断js代码
2019/09/09 Javascript
详解React 元素渲染
2020/07/07 Javascript
vant 时间选择器--开始时间和结束时间实例
2020/11/04 Javascript
[00:49]完美世界DOTA2联赛10月28日开团时刻:随便打
2020/10/29 DOTA
python pdb调试方法分享
2014/01/21 Python
python enumerate函数的使用方法总结
2017/11/15 Python
python执行CMD指令,并获取返回的方法
2018/12/19 Python
python3 assert 断言的使用详解 (区别于python2)
2019/11/27 Python
解决安装pyqt5之后无法打开spyder的问题
2019/12/13 Python
Python基础之字符串操作常用函数集合
2020/02/09 Python
Python实现常见的几种加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)
2020/05/09 Python
Virtualenv 搭建 Py项目运行环境的教程详解
2020/06/22 Python
Html5中的桌面通知Notification的实现
2018/09/25 HTML / CSS
HTML5语音识别标签写法附图
2013/11/18 HTML / CSS
加州风格的游泳和沙滩装品牌:Cupshe
2019/06/10 全球购物
介绍一下Python中webbrowser的用法
2013/05/07 面试题
与C++相比,Java中的数组有什么不同
2014/03/25 面试题
幼儿教师求职信
2014/05/24 职场文书
2016秋季校长开学典礼致辞
2015/11/26 职场文书
go语言-在mac下brew升级golang
2021/04/25 Golang
Python爬虫基础讲解之请求
2021/05/13 Python
Apache自带的ab压力测试工具的实现
2022/07/23 Servers