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事件冒泡传递(cancelBubble 、stopPropagation)
May 08 Javascript
JQuery 表格操作(交替显示、拖动表格行、选择行等)
Jul 29 Javascript
jQuery学习2 选择器的使用说明
Feb 07 Javascript
JavaScript入门之基本函数详解
Oct 21 Javascript
基于jQuery的动态增删改查表格信息,可左键/右键提示(原创自Zjmainstay)
Jul 31 Javascript
javascript生成随机颜色示例代码
May 05 Javascript
IE浏览器IFrame对象内存不释放问题解决方法
Aug 22 Javascript
js由下向上不断上升冒气泡效果实例
May 07 Javascript
微信小程序按钮去除边框线分享页面功能
Aug 27 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变opacity实现)
Jan 24 Javascript
VueJS 取得 URL 参数值的方法
Jul 19 Javascript
Vue封装全局过滤器Filters的步骤
Sep 16 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中使用addslashes函数报错问题的解决方法
2013/02/06 PHP
PHP中使用sleep函数实现定时任务实例分享
2014/08/21 PHP
为你总结一些php信息函数
2015/10/21 PHP
php is_executable判断给定文件名是否可执行实例
2016/09/26 PHP
基于ThinkPHP5.0实现图片上传插件
2017/09/25 PHP
传递参数的标准方法(jQuery.ajax)
2008/11/19 Javascript
网页和浏览器兼容性问题汇总(draft1)
2009/06/01 Javascript
ExtJS 设置级联菜单的默认值
2010/06/13 Javascript
firefox事件处理之自动查找event的函数(用于onclick=foo())
2010/08/05 Javascript
jQuery学习笔记之Helloworld
2010/12/22 Javascript
jquery 单击li防止重复加载的实现代码
2010/12/24 Javascript
Javascript遍历table中的元素示例代码
2014/07/08 Javascript
ie8下修改input的type属性报错的解决方法
2014/09/16 Javascript
深入理解JavaScript单体内置对象
2016/06/06 Javascript
js删除Array数组中指定元素的两种方法
2016/08/03 Javascript
详解jquery easyui之datagrid使用参考
2016/12/05 Javascript
脚本div实现拖放功能(两种)
2017/02/13 Javascript
JS ES6多行字符串与连接字符串的表示方法
2017/04/26 Javascript
小程序云开发获取不到数据库记录的解决方法
2019/05/18 Javascript
小程序如何构建骨架屏
2019/05/29 Javascript
vue 如何使用递归组件
2020/10/23 Javascript
node koa2 ssr项目搭建的方法步骤
2020/12/11 Javascript
Python大数据之网络爬虫的post请求、get请求区别实例分析
2019/11/16 Python
wxPython实现整点报时
2019/11/18 Python
PyQt5 控件字体样式等设置的实现
2020/05/13 Python
你需要学会的8个Python列表技巧
2020/06/24 Python
python如何随机生成高强度密码
2020/08/19 Python
CSS3 box-sizing属性
2009/04/17 HTML / CSS
css3新增颜色表示方式分享
2014/04/15 HTML / CSS
纯css3实现照片墙效果
2014/12/26 HTML / CSS
大学生志愿者活动总结
2014/06/27 职场文书
加强干部作风建设整改方案
2014/10/24 职场文书
2014年客服工作总结范文
2014/11/13 职场文书
2015年团支部工作总结
2015/04/03 职场文书
多属性、多分类MySQL模式设计
2021/04/05 MySQL
MySQL数据库 任意ip连接方法
2022/05/20 MySQL